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?
Avant d'aller plus loin, prenons note de quelques choses.
- 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.
- 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.
- 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.
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é)
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).
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
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.
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