Il s'agit d'une question canonique proposée sur la compréhension et le débogage du pare-feu logiciel sur les systèmes Linux.
En réponse à la réponse de l' EEAA et au commentaire de @ Shog, nous avons besoin d'un Q&A canonique approprié pour clore les questions courantes relativement simples sur iptables.
Qu'est-ce qu'une méthode structurée pour déboguer des problèmes avec le pare-feu logiciel Linux, le cadre de filtrage de paquets netfilter , communément appelé par l'interface utilisateur iptables ?
Quels sont les pièges courants, les questions récurrentes et les choses simples ou légèrement plus obscures pour vérifier qu'un administrateur de pare-feu occasionnel pourrait ignorer ou bénéficier d'une autre manière de savoir?
Même lorsque vous utilisez des outils tels que UFW , FirewallD (aka firewall-cmd
), Shorewall ou similaire, vous pourriez bénéficier de regarder sous le capot sans la couche d'abstraction offerte par ces outils.
Cette question n'est pas conçue comme un guide pratique pour la construction de pare-feu: consultez la documentation du produit pour cela et, par exemple, contribuez des recettes à iptables Trips & Tricks ou recherchez dans les questions marquées iptables ufw firewalld firewall-cmd pour les scores élevés fréquents et bien considérés Questions et réponses.
net.netfilter.nf_conntrack_log_invalid
à 255 capturera assez bien les paquets invalides, ce qui peut aider si c'est la partie avec état de netfilter qui produit le mauvais comportement.Réponses:
En général:
L'affichage et la modification de la configuration du pare-feu nécessitent des privilèges d'administrateur (
root
), tout comme l'ouverture de services dans la plage de numéros de port restreinte. Cela signifie que vous devez être connecté en tant queroot
ou utilisersudo
pour exécuter la commande en tant que root. J'essaierai de marquer ces commandes avec l'option[sudo]
.Contenu:
-I
et-A
iptables -L -v -n
1. Ordonner des questions ou la différence entre
-I
et-A
La chose à retenir est que les règles de pare-feu sont vérifiées dans l'ordre où elles sont répertoriées. Le noyau arrêtera de traiter la chaîne lorsqu'une règle sera déclenchée qui autorisera ou interdira un paquet ou une connexion.
Je pense que l'erreur la plus courante pour les administrateurs de pare-feu novices est qu'ils suivent les instructions correctes pour ouvrir un nouveau port, comme celui ci-dessous:
puis découvrez qu'il ne prendra pas effet.
La raison en est que l'
-A
option ajoute cette nouvelle règle, après toutes les règles existantes et puisque très souvent la règle finale dans le pare-feu existant était celle qui bloque tout le trafic qui n'est pas explicitement autorisé, ce qui entraîneOu équivalent dans iptables-save:
et la nouvelle règle ouvrant le port TCP 8080 ne sera jamais atteinte. (comme en témoignent les compteurs restant obstinément à 0 paquets et zéro octet).
En insérant la règle avec
-I
la nouvelle règle aurait été la première de la chaîne et fonctionnera.2. Affichez la configuration actuelle du pare-feu
Ma recommandation pour l'administrateur du pare-feu est de regarder la configuration réelle du noyau Linux, plutôt que d'essayer de diagnostiquer les problèmes de pare-feu à partir d'outils conviviaux. Souvent, une fois que vous comprenez les problèmes sous-jacents, vous pouvez facilement les résoudre dans une affaire prise en charge par ces outils.
La commande
[sudo] iptables -L -v -n
est votre ami (bien que certaines personnes aimentiptables-save
mieux). Souvent, lors de la discussion des configurations, il est utile d'utiliser également l'--line-numbers
option pour numéroter les lignes. La référence à la règle #X facilite leur discussion un peu plus facilement.Remarque: les règles NAT sont inclus dans la
iptables-save
sortie , mais doivent listés séparément en ajoutant l'-t nat
option de savoir[sudo] iptables -L -v -n -t nat --line-numbers
.L'exécution de la commande plusieurs fois et la vérification des compteurs d'incrémentation peuvent être un outil utile pour voir si une nouvelle règle est réellement déclenchée.
Alternativement, la sortie de
iptables-save
donne un script qui peut régénérer la configuration du pare-feu ci-dessus:C'est une question de préférence ce que vous trouverez plus facile à comprendre.
3. Interpréter la sortie de
iptables -L -v -n
La stratégie définit l'action par défaut que la chaîne utilise lorsqu'aucune règle explicite ne correspond. Dans la
INPUT
chaîne définie sur ACCEPTER tout le trafic.La première règle de la chaîne INPUT est immédiatement intéressante, elle envoie tout le trafic (source 0.0.0.0/0 et destination 0.0.0.0/0) destiné au port TCP 22 (
tcp dpt:22
) le port par défaut pour SSH vers une cible personnalisée (fail2ban-SSH
) . Comme son nom l'indique, cette règle est maintenue par fail2ban (un produit de sécurité qui, entre autres, analyse les fichiers journaux du système pour détecter d'éventuels abus et bloque l'adresse IP de l'agresseur).Cette règle aurait été créée par une ligne de commande iptables similaire à
iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
ou se trouve dans la sortie d'iptables-save as-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
. Vous trouverez souvent l'une de ces notations dans la documentation.Les compteurs indiquent que cette règle a mis en correspondance 784'000 paquets et 65 mégaoctets de données.
Le trafic correspondant à cette première règle est ensuite traité par la
fail2ban-SSH
chaîne qui, en tant que chaîne non standard, est répertoriée sous la chaîne OUTPUT.Cette chaîne se compose de deux règles, une pour chaque abuseur (adresse IP source 117.253.221.166 ou 58.218.211.166) qui est bloquée (avec un
reject-with icm-port-unreachable
).Les paquets SSH qui ne proviennent pas de ces hôtes bloqués ne sont pas encore autorisés ni interdits et, maintenant que la chaîne personnalisée est terminée, seront comparés à la deuxième règle de la chaîne INPUT.
Tous les paquets qui n'étaient pas destinés au port 22 ont passé la première règle de la chaîne INPUT et seront également évalués dans la règle INPUT # 2.
La règle INPUT numéro 2 fait que cela est destiné à être un pare-feu d'état , qui suit les connexions. Cela présente certains avantages, seuls les paquets pour les nouvelles connexions doivent être vérifiés par rapport à l'ensemble de règles complet, mais une fois autorisés, les paquets supplémentaires appartenant à une connexion établie ou associée sont acceptés sans vérification supplémentaire.
La règle d'entrée n ° 2 correspond à toutes les connexions ouvertes et connexes et les paquets correspondant à cette règle n'auront pas besoin d'être évalués plus avant.
Remarque: les changements de règles dans la configuration d'un pare-feu avec état n'affecteront que les nouvelles connexions, pas les connexions établies.
En revanche, un simple filtre de paquets teste chaque paquet par rapport à l'ensemble de règles complet, sans suivre l'état de la connexion. Dans un pare-feu pareil, aucun mot clé d' état ne serait utilisé.
La règle INPUT # 3 est assez ennuyeuse, tout le trafic se connectant à l'
lo
interface de bouclage ( ou 127.0.0.1) est autorisé.Les règles INPUT 4, 5 et 6 sont utilisées pour ouvrir les ports TCP 22, 80 et 443 (les ports par défaut pour respectivement SSH, HTTP et HTTPS) en accordant l'accès aux NOUVELLES connexions (les connexions existantes sont déjà autorisées par la règle INPUT 2).
Dans un pare-feu sans état, ces règles apparaissent sans les attributs d'état:
ou
La dernière règle INPUT, # 7 est une règle qui bloque tout le trafic auquel l'accès n'a pas été accordé dans les règles INPUT 1-7. Une convention assez courante: tout ce qui n'est pas autorisé est refusé. En théorie, cette règle aurait pu être omise en définissant la POLITIQUE par défaut sur REJETER.
Examinez toujours toute la chaîne.
4. Connaissez votre environnement
4.1. Les paramètres d'un pare-feu logiciel n'affecteront pas les paramètres de sécurité maintenus ailleurs sur le réseau, c'est-à-dire que malgré l'ouverture d'un service réseau avec
iptables
les listes de contrôle d'accès non modifiées sur les routeurs ou autres pare-feu de votre réseau, il est possible que le trafic soit bloqué ...4.2. Si aucun service n'écoute, vous ne pourrez pas vous connecter et obtenir une erreur de connexion refusée , quels que soient les paramètres du pare-feu. Donc:
[sudo] netstat -plnut
ou utilisezss -tnlp
.[sudo] nc -l -p 123
ouopenssl s_server -accept 1234 [options]
si vous avez besoin d'un écouteur TLS / SSL (vérifiez lesman s_server
options).telnet <IP of Server> 123
ouecho "Hello" | nc <IP of Server> 123
lorsque vous testez le service sécurisé TLS / SSLopenssl s_client -connect <IP of Server>:1234
, avant d'essayer la même chose à partir d'un hôte distant.4.3. Comprenez les protocoles utilisés par vos services. Vous ne pouvez pas activer / désactiver correctement les services que vous ne comprenez pas suffisamment. Par exemple:
/etc/services
ne correspondent pas nécessairement au service réel utilisant un port.4.4. Le filtre de paquets du noyau n'est pas la seule chose qui peut restreindre la connectivité réseau:
getenforce
confirmera si SELinux est en cours d'exécution.ldd /path/to/service |grep libwrap
et les/hosts.[allow|deny]
fichiers de contrôle.5.
INPUT
ouFORWARD
chaînesLe concept de chaînes est expliqué plus en détail ici, mais en bref:
La
INPUT
chaîne est l'endroit où vous ouvrez et / ou fermez les ports réseau pour les services s'exécutant localement, sur l'hôte où vous émettez les commandes iptables.La
FORWARD
chaîne est l'endroit où vous appliquez des règles pour filtrer le trafic qui est transféré par le noyau vers d'autres systèmes, des systèmes réels mais aussi des conteneurs Docker et des serveurs Virtual Guest Servers lorsque votre machine Linux agit comme un pont, un routeur, un hyperviseur et / ou fait une adresse réseau traduction et redirection de port.Une idée fausse courante est que, comme un conteneur Docker ou un invité KVM s'exécute localement, les règles de filtrage qui s'appliquent devraient se trouver dans la chaîne INPUT, mais ce n'est généralement pas le cas.
6. Modules du noyau
Étant donné que le filtre de paquets s'exécute dans le noyau Linux, il peut également être compilé en tant que module dynamique, plusieurs modules en fait. La plupart des distributions incluent Netfilter en tant que modules et les modules Netfilter requis seront chargés dans le noyau selon les besoins, mais pour certains modules, un administrateur de pare-feu devra s'assurer manuellement qu'ils sont chargés. Cela concerne principalement les modules de suivi des connexions, tels que ceux
nf_conntrack_ftp
qui peuvent être chargésinsmod
.Les modules actuellement chargés dans le noyau en cours d'exécution peuvent être affichés avec
lsmod
.La méthode permettant de s'assurer que les modules sont chargés de manière persistante lors des redémarrages dépend de la distribution Linux.
la source
watch --difference -n 1 iptables -L FORWARD -v -n
. Laisser l'outil exécuter périodiquement la commande et mettre en évidence les modifications le rend beaucoup plus facile.iptables-save
sortie (de préférence avec-c
) à chaque fois sur cetteiptables -L
sortie redoutée (avec divers arguments).Problèmes courants avec différents protocoles
DNS: DNS utilise le port 53 UDP par défaut, mais les messages qui ne rentrent pas dans un seul datagramme UDP seront transmis à la place via TCP (généralement les transferts de zone, etc.), ce qui nécessite l'ouverture du port 53 TCP également lorsque vous exécutez un serveur de noms. .
Courriel: de nombreux FAI consommateurs bloquent le trafic SMTP (ou au moins le port par défaut TCP 25), ce qui rend impossible la réception ou l'envoi directs de courriels et leurs clients sont obligés d'utiliser le relais SMTP du FAI pour tous les courriels sortants et parfois pour les courriels entrants également. . Concerne le §1.1.
FTP: FTP est un protocole étrange dans la mesure où deux connexions sont utilisées. Le premier est la connexion de contrôle, par défaut un serveur FTP écoutera cela sur le port TCP 21. La connexion de contrôle est utilisée pour l'authentification et l'émission de commandes. Les transferts de fichiers réels et des choses telles que la sortie d'une liste de répertoires passent par une deuxième connexion TCP, la connexion DATA. Dans le FTP actif, cette connexion DONNÉES sera établie à partir du serveur FTP à partir du port TCP 20 et se connectera au client FTP. Le FTP actif ne fonctionne pas trop bien avec les utilisateurs derrière les pare-feu et les passerelles NAT, il est donc principalement tombé en désuétude. La plupart des serveurs FTP prennent en charge le FTP passif à la place. Avec FTP passif, le serveur FTP ouvre un écouteur pour la connexion DATA sur un second port, auquel le client FTP peut alors se connecter. Le problème pour un pare-feu est que le port DATA peut être n'importe quel port non privilégié disponible entre 1024-65536.
Dans un pare-feu sans état qui est généralement résolu en limitant le nombre de ports passifs que le serveur FTP peut affecter, puis en ouvrant explicitement ces ports. c'est à dire
Dans un pare-feu avec état, vous n'avez pas besoin d'ouvrir explicitement le port DATA, le module d'assistance netfilter reconnaît le port dynamique qui est attribué et ouvre dynamiquement ce port pour le client correct en marquant la connexion DATA comme
RELATED
après quoi il correspondra à la règle générique :Cela nécessite que le module de noyau correct soit chargé, dans le cas FTP manuellement en exécutant par exemple
insmod nf_conntrack_ftp
, ce qui fait que la persistance dépend du redémarrage dépend de la distribution.Remarque: Le module de suivi de connexion FTP échouera lorsque FTP est utilisé avec SSL, car la connexion de contrôle sera cryptée et le nf_conntrack_ftp ne pourra plus lire la répétition PASV.
NFS et services RPC similaires : Le problème avec les services RPC est que, par conception, ils n'utilisent pas de port fixe spécifique. Ils peuvent choisir n'importe quel port disponible au hasard, qui sera ensuite enregistré avec le démon RPC Portmap. Un client essayant de se connecter interrogera le démon Portmap, puis se connectera directement au port approprié. Cela a résolu le problème de manquer de ports réservés ...
Du point de vue du pare-feu, le port TCP / UDP 111 doit être ouvert et le port réel que le service RPC utilise actuellement. Le problème de l'ouverture d'un tel port aléatoire dans un pare-feu est généralement résolu en restreignant le service RPC, tel que le serveur NFS, à utiliser un port fixe prédéfini.
la source
Iptables / Firewall "introduction"
Un pare-feu est essentiellement un filtre réseau basé sur des règles. Les pare-feu Linux sont construits autour de Netfilter; le framework de traitement de paquets réseau du noyau qui est composé de plusieurs modules du noyau effectuant des tâches spécifiques:
Les utilisateurs configurent le framework Netfilter pour répondre à leurs besoins de pare-feu en utilisant iptables à partir de la ligne de commande. Avec iptables, nous définissons des règles qui indiquent au noyau ce qu'il doit faire des paquets IP lorsqu'ils arrivent, passent ou quittent notre boîte Linux. Chaque processus principal de Netfilter est représenté par une TABLE (FILTER, NAT, MANGLE) sur le jargon iptables. Ils ont plusieurs points de raccordement spécifiques sur la carte de flux de paquets réseau où ils sont invoqués par le noyau pour effectuer leurs tâches. Certaines séquences d'appels TABLE localisées spécifiquement sont génériquement appelées CHAINES intégrées recevant les noms PREROUTING, INPUT, FORWARD, OUTPUT et POSTROUTING. Il est facile de se souvenir si nous associons une TABLE à un "type de processus" et une CHAINE à "l'emplacement" sur la carte de flux de paquets réseau où les instances de ces processus sont appelées.
Puisqu'un paquet IP est reçu sur une interface réseau, ou créé par un processus local, jusqu'à ce qu'il soit finalement livré ou jeté, le moteur Netfilter testera et appliquera séquentiellement les règles contenues le long de la carte de flux de paquets réseau. À chaque bloc identifié par une paire TABLE @ CHAIN, l'utilisateur peut ajouter une ou plusieurs de ces règles consécutives contenant un critère de correspondance de paquet IP et un plan d'action correspondant. Il y a des actions (ie ACCEPT, DROP, etc.) qui peuvent être exécutées par plus d'une TABLE et d'autres actions (ie SNAT, DNAT, etc.) qui sont spécifiques à TABLE.
c'est-à-dire lorsqu'un paquet IP arrive d'une interface réseau, il est d'abord traité par la chaîne PREROUTING en invoquant les règles définies par l'utilisateur de la table MANGLE le cas échéant. S'il n'y a pas de règles qui correspondent au paquet actuel, le plan d'action ou la "politique" par défaut MANGLE @ PREROUTING correspondant s'applique. À ce stade, si le paquet n'a pas été abandonné, le processus continuera maintenant à appeler les règles de la table NAT au niveau de la chaîne PREROUTING (voir la carte) et ainsi de suite. Afin de faciliter la disposition des règles, les utilisateurs peuvent également créer leurs propres chaînes personnalisées et «sauter» à partir de différents points de la carte comme ils le souhaitent.
Alors que les chaînes intégrées peuvent avoir des politiques définies par l'utilisateur de paquets ACCEPT ou DROP, les chaînes définies par l'utilisateur ont toujours une politique par défaut inchangeable de RETOUR à l'appelant pour continuer le processus.
Commandes Iptables
Les commandes principales d'iptables remplissent la carte de flux de paquets réseau avec les règles de traitement requises.
La règle générique iptables peut s'écrire:
# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>
Cela pourrait être lu comme:
Les commandes auxiliaires iptables complètent le scénario définissant les conditoins par défaut, les règles de listage, les règles de vidage, etc.
Iptables charge nos commandes dans le moteur Netfilter au moment de l'exécution, Netfilter applique immédiatement les règles et les paramètres chargés mais ils ne sont pas persistants. Après le redémarrage, toutes les règles et tous les paramètres Netfilter précédemment chargés seront perdus. Pour cette raison, il existe des utilitaires iptables qui permettent d'enregistrer l'ensemble de règles actuellement actif dans un fichier et de le recharger ultérieurement.
Résumé Iptables
Netfilter est un framework extrêmement flexible et puissant mais il y a un prix à payer pour cela; Iptables est complexe. D'un point de vue utilisateur, certains termes comme TABLE, CHAINE, CIBLE ne correspondent pas vraiment très bien au concept qu'ils représentent et n'ont pas beaucoup de sens au premier abord. Le sujet est long, les commandes semblent avoir une liste interminable de paramètres. Pour aggraver les choses, il n'y a pas un seul livre qui maîtrise vraiment Iptables. Ils se répartissent principalement en deux catégories: "livre de recettes" ou "livre de pages de manuel". Je pense que cette introduction vous donne un aperçu du paysage Netfilter / Iptables ainsi que la dose nécessaire de pages de manuel pré-digérées. Si vous êtes nouveau chez iptables, après avoir lu ces paragraphes plusieurs fois, vous serez prêt à lire des exemples d'iptables. Avec un peu de pratique, vous vous retrouverez bientôt à écrire vos propres règles.
Pare-feu
Un pare-feu est principalement conçu pour autoriser ou refuser dynamiquement le trafic réseau en fonction d'un ensemble de règles. À ce stade, il est facile de comprendre pourquoi le cadre Linux Netfilter / Iptables est parfait pour la construction de pare-feu. En regardant la carte de flux de paquets réseau, nous trouvons deux endroits particulièrement intéressants sur la table FILTER au niveau des chaînes INPUT et FORWARD; Nous pouvons y décider de l'adresse IP source, du protocole IP (UDP / TCP), du port de destination (80, 21, 443, etc.), etc. C'est ce que fait un pare-feu 80% du temps lorsqu'il protège un serveur Web contre les demandes réseau non autorisées. Les 20% restants manipulent (NAT, MANGLE) les paquets réseau.
Scénarios de pare-feu
Il existe des centaines de configurations de pare-feu différentes répondant à des besoins différents, mais 3 d'entre elles pourraient être considérées comme les scénarios de pare-feu les plus typiques.
J'ai écrit ceci pour: http://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html
la source