web-dev-qa-db-fra.com

Comment refuser une adresse IP de se connecter à mon système?

Est-il possible d'empêcher une adresse IP de se connecter à mon PC?

Est-il possible d'empêcher un IP de se connecter à un port spécifique?

5
nux

Avant d'aller plus loin, prenons note de quelques choses.

  1. La majorité d'Internet n'a pas d'adresses IP statiques. Par conséquent, les mandataires, Tor, etc. peuvent être utilisés pour contourner les blocs à adresse IP unique.
  2. Il est généralement plus sûr de faire l'inverse, de bloquer tout le trafic sur un port et de n'accepter que certaines adresses. Ce n'est pas faisable dans la plupart des situations Web, mais cela reste une pratique de sécurité généralement acceptée.
  3. Nous ne faisons aucun filtrage ici sur Internet en général - nous ne prenons pas en compte le point 1 avec la réponse ci-dessous, et vous devez tenir compte de la probabilité que si vous bloquez une adresse IP, ils trouveront un moyen de la contourner et avoir accès à une adresse IP différente et continuer à attaquer.

Avant que quiconque ne remarque que ufw est moins compliqué que iptables, j’ai utilisé iptables ici parce que le PO a répondu à cette question à l’aide des commandes iptables, ce qui m’a amené à supposer qu’il voulait une réponse comportant des commandes iptables et non des commandes ufw /


Une bonne configuration de pare-feu iptables refusera tout sauf la configuration minimale requise dont vous avez besoin sur votre ou vos système (s) en termes de "connexions acceptables" et ne doit accepter que les connexions qui ont été explicitement autorisées dans les règles.

Pour ce faire, nous devons configurer iptables(ETip6tables pour bloquer le trafic par défaut, à l'exception du trafic que vous avez initié. depuis votre ordinateur (trafic Web de Firefox, par exemple, si vous êtes sur un système ou flux wget pour télécharger un logiciel ou pour permettre à apt de mettre à jour les packages). Nous devons également vous permettre de pouvoir ajouter des règles acceptables pour le trafic que vous VOULEZ atteindre sur votre système.

Pour que ces règles soient persistantes et qu'elles fonctionnent tout le temps à chaque redémarrage, vous devez installer le package iptables-persistent, ce qui vous permettra de sauvegarder ces règles, puis de les charger automatiquement. Exécutez d'abord Sudo apt-get install iptables-persistent, puis ajoutez vos règles. Nous nous assurerons de mettre à jour le jeu de règles chargé au démarrage après avoir créé un jeu de règles.

En supposant que nous ayons commencé avec une configuration vierge iptables et ip6tables (qui est la configuration par défaut sous Ubuntu), vous devrez ajouter un ensemble de règles. Je commencerai par iptables, puis nous travaillerons avec ip6tables.


iptables

Ce qui suit est un ensemble de règles de base qui limitera toutes les données et tous les paquets tentant d’atteindre votre système, quelle que soit la connexion utilisée:

Accepter les données de l'hôte local
iptables -A INPUT -i lo -j ACCEPT - accepte tout le trafic sur LocalHost, qui correspond au trafic local de l'ordinateur uniquement. Cela est nécessaire pour que votre ordinateur fonctionne correctement.

Acceptez les données relatives aux connexions sortantes que votre système a initiées
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT - acceptez tout le trafic lié aux connexions sortant, y compris les réponses des serveurs distants (tels que les miroirs apt ou tout site Web que vous visitez).

Règles ICMP
Notez que je ne filtre pas les paquets ICMP, car ceux-ci sont généralement acceptables, sauf si vous êtes paranoïaque. Si vous voulez vraiment bloquer ICMP, vous devez utiliser ces règles pour accepter certains paquets critiques:

Accepter le "temps dépassé" ICMP
iptables -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT - accepte les paquets "Temps dépassé" nécessaires pour certaines configurations de connexion restreintes dans le temps.

Acceptez le protocole ICMP "Destination inaccessible"
iptables -A INPUT -p icmp -m icmp --icmp-type 3/4 -j ACCEPT - acceptez les réponses ICMP "Destination inaccessible" de serveurs distants. Cela permet au système de fonctionner correctement avec des sites distants inaccessibles.

Accepter les requêtes/réponses PING ("Echo" ICMP)
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT - accepte les demandes "Echo" (ou "Ping"). Il est bon de le garder car la connexion de votre système à certains sites et/ou services peut nécessiter un PING pour une demande de maintien en activité.

Créez une table iptables pour contenir les règles/ports de trafic acceptables
iptables -N acceptable_traffic
iptables -A INPUT -j acceptable_traffic

Ainsi, vous disposez d’un tableau dans lequel vous pouvez définir des règles pour le trafic que vous souhaitez accepter sur votre système à partir de connexions externes. Si vous avez un serveur SSH, vous devez utiliser iptables -A acceptable_traffic -p tcp --dport 22 -j ACCEPT (ou en remplacer 22 par le port du serveur SSH). Vous ajouteriez ici d’autres règles de circulation acceptables.

Rejeter tout le trafic pour lequel aucune règle n'est définie
Il y a deux options pour cela.

iptables -A INPUT -j REJECT --reject-with icmp-Host-unreachable - Il s'agit de la première option et de ce que je considère comme un moyen plus sain de bloquer le trafic: lorsqu'un individu tente d'atteindre le serveur, il reçoit un paquet ICMP "Host Unreachable" qui met fin à la tentative de connexion.

iptables -A INPUT -j DROP - Ceci est la deuxième option. Cela supprimera automatiquement tous les paquets entrants envoyés à votre système qui ne correspondent pas à une règle ACCEPT. Cela signifie que les paquets sont complètement ignorés. Les tentatives de connexion à partir du site distant vont simplement expirer par elles-mêmes sans réponse du système auquel vous êtes connecté.


ip6tables

Comme iptables pour IPv4, vous devez configurer ip6tables pour IPv6. Les règles sont similaires, mais différentes. * Si vous n'avez pas IPv6 sur votre système, vous n'aurez peut-être pas à vous en soucier, mais avoir les règles dans le système ne fera pas mal.

Accepter les données de l'hôte local
ip6tables -A INPUT -i lo -j ACCEPT - accepte tout le trafic sur LocalHost, qui correspond au trafic local de l'ordinateur uniquement. Cela est nécessaire pour que votre ordinateur fonctionne correctement.

Acceptez les données relatives aux connexions sortantes que votre système a initiées
ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT - acceptez tout le trafic lié aux connexions sortant, y compris les réponses des serveurs distants (tels que les miroirs apt ou tout site Web que vous visitez).

Règles ICMPv6
ip6tables -A INPUT -p icmpv6 -j ACCEPT - Je ne bloque pas les paquets IPv6 ICMP car, contrairement à IPv4, il y a un milliard de paquets IPv6 ICMP supplémentaires que vous devez accepter (c'est-à-dire tous). À cette fin, vous pouvez le faire pour les accepter tous.

Créez une table ip6tables pour contenir les règles/ports de trafic acceptables
ip6tables -N acceptable_traffic
ip6tables -A INPUT -j acceptable_traffic

Ainsi, vous disposez d’un tableau dans lequel vous pouvez définir des règles pour le trafic que vous souhaitez accepter sur votre système à partir de connexions externes. Si vous avez un serveur SSH, vous devez utiliser ip6tables -A acceptable_traffic -p tcp --dport 22 -j ACCEPT (ou en remplacer 22 par le port du serveur SSH). Vous ajouteriez ici d’autres règles de circulation acceptables.

Rejeter tout le trafic pour lequel aucune règle n'est définie
Il y a deux options pour cela.

ip6tables -A INPUT -j REJECT --reject-with icmp6-addr-unreachable - Il s'agit de la première option et de ce que je considère comme un moyen plus sain de bloquer le trafic: lorsqu'un individu tente d'atteindre le serveur, il reçoit un paquet ICMPv6 "Adresse inaccessible" qui met ensuite fin à la tentative de connexion.

ip6tables -A INPUT -j DROP - Ceci est la deuxième option. Cela supprimera automatiquement tous les paquets entrants envoyés à votre système qui ne correspondent pas à une règle ACCEPT. Cela signifie que les paquets sont complètement ignorés. Les tentatives de connexion à partir du site distant vont simplement expirer par elles-mêmes sans réponse du système auquel vous êtes connecté.


Sauvegarder toutes les règles

Comme je vous ai déjà dit d'installer le package iptables-persistent, vous devez enregistrer les règles afin qu'elles puissent être chargées plus tard.

NOTE: Cet ensemble de commandes vous place en fait dans un super-shell. Vous ne devriez rien faire d'autre dans ce shell, à l'exception de ces commandes que je mentionne ici!

Exécutez les commandes suivantes:

Sudo -s
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
exit

Cela sauvegardera les règles afin qu’elles puissent être chargées à chaque redémarrage. SI VOUS MODIFIEZ LES RÈGLES PLUS TARD, VOUS DEVEZ RÉALISER CES COMMANDES POUR SAUVEGARDER LES RULESETS.


Que se passe-t-il si je souhaite bloquer une liste d'adresses IP incorrectes?

Nous pouvons toujours le faire! Vous voudrez peut-être une liste de blocs pour le "mauvais" trafic. Voici donc ma solution pour cela, et comme avant, je vais la scinder en deux sections, iptables et ip6tables.


iptables

Créez une table pour prohibited_traffic

Nous devons maintenant créer une table prohibited_traffic. Vous allez ajouter les 'mauvaises adresses IP' ici. Nous devons ensuite insérer la règle prohibited_traffic dans la table INPUT. (Dans l'exemple ci-dessous, j'utilise 2 pour indiquer l'emplacement du numéro de la règle à l'endroit où nous insérons cette règle, ce qui le place juste après la règle qui se lit comme suit: ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED:

iptables -N prohibited_traffic
iptables -I INPUT 2 -j prohibited_traffic

Ajouter des règles pour bloquer certaines adresses IP

Nous ajoutons maintenant les adresses IP à bloquer à cette table prohibited_traffic. Voici le modèle:

iptables -A prohibited_traffic -s SourceIPAddress -j DROP

Remplacez 'SourceIPAddress' par l'adresse IP que vous souhaitez bloquer. Si vous devez bloquer une plage d'adresses IP, vous devrez prendre la "plage" et déterminer la plage CIDR contenant toutes les adresses IP, puis utiliser le format IPV4ADDRESS/cidr pour bloquer cette plage CIDR incluant les IP. Les blocs de plage ne peuvent pas être réalisés sans CIDR ou l'ajout de BEAUCOUP d'adresses IP une par une.


ip6tables

Ceci est presque identique à iptables

Créez une table pour prohibited_traffic

Nous devons maintenant créer une table prohibited_traffic. Vous allez ajouter les 'mauvaises adresses IP' ici. Nous devons ensuite insérer la règle prohibited_traffic dans la table INPUT. (Dans l'exemple ci-dessous, j'utilise 2 pour indiquer l'emplacement du numéro de la règle à l'endroit où nous insérons cette règle, ce qui le place juste après la règle qui se lit comme suit: ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED:

ip6tables -N prohibited_traffic
ip6tables -I INPUT 2 -j prohibited_traffic

Ajouter des règles pour bloquer certaines adresses IP

Nous ajoutons maintenant les adresses IP à bloquer à cette table prohibited_traffic. Voici le modèle:

ip6tables -A prohibited_traffic -s SourceIPAddress -j DROP

Remplacez 'SourceIPAddress' par l'adresse IP que vous souhaitez bloquer. Si vous devez bloquer une plage d'adresses IP, vous devrez prendre la "plage" et déterminer la plage CIDR contenant toutes les adresses IP, puis utiliser le format IPV6ADDRESS/cidr pour bloquer cette plage CIDR incluant les IP. Les blocs de plage ne peuvent pas être réalisés sans CIDR ou l'ajout de BEAUCOUP d'adresses IP une par une.

17
Thomas Ward

Vous pouvez également utiliser ufw, et IMO, c'est beaucoup plus simple.

Pour refuser une adresse IP à partir de toutes connexions, utilisez:

Sudo ufw deny from <ip_address> to any  

Ou pour refuser l'accès à un port spécifique:

Sudo ufw deny from <ip_address> to any port <some_port>  

ou vous pouvez spécifier le protocole:

Sudo ufw deny proto tcp from <ip_address> to any port <some_port>  

(en remplaçant tcp par tcp ou udp en fonction du protocole souhaité)

20
Seth

Une des options utilise iptables qui activera un pare-feu real sur votre système; c'est probablement le moyen le plus sûr (voir les autres réponses).

Cette réponse est utile si le problème est que vous rencontrez des tentatives répétées d’entrer dans votre système via le démon sshd (service de serveur SSH).

Remarque: conformément à 14.04, le support de denyhost a été abandonné .

La nouvelle solution consiste à utiliser fail2ban. Il est plus puissant et facile à installer qu’avec la configuration par défaut. Voir http://bodhizazen.com/Tutorials/SSH_security

ancienne réponse

Vous n'avez pas explicitement indiqué le type de problème que vous voyez, mais si le problème est que quelqu'un tente d'entrer dans votre système via des attaques par force brute ssh (peu dangereux si votre système est bien configuré, mais toujours gênant), je vous suggère jetez un oeil à DenyHosts .

Vous pouvez l'installer à partir du référentiel avec apt-get install denyhosts et cela fonctionne immédiatement, en bloquant automatiquement pendant une semaine tout hôte qui tente de se connecter à votre ordinateur et échoue trois fois.

2
Rmano
iptables -A INPUT -s IP-ADDRESS -j DROP

Remplacez IP-ADDRESS par votre adresse IP actuelle. Par exemple, si vous souhaitez bloquer une adresse IP 192.168.0.1 pour une raison quelconque, tapez la commande comme suit:

iptables -A INPUT -s 192.168.0.100 -j DROP

Si vous souhaitez simplement bloquer l'accès à un port d'une adresse IP 192.168.0.100 au port 80, tapez la commande suivante:

iptables -A INPUT -s 192.168.0.100 -p tcp --destination-port 80 -j DROP
1
nux