Différences
Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| iptables [2022/07/20 09:35] – créée nekan | iptables [2022/07/20 12:20] (Version actuelle) – [FTP] nekan | ||
|---|---|---|---|
| Ligne 22: | Ligne 22: | ||
| * On s' | * On s' | ||
| <sxh bash> | <sxh bash> | ||
| - | |||
| - | * On active le démarrage automatique du service : | ||
| - | <sxh bash> | ||
| Le service '' | Le service '' | ||
| <sxh bash> | <sxh bash> | ||
| + | Ce qui nous donne : | ||
| + | < | ||
| + | target | ||
| + | |||
| + | Chain FORWARD (policy ACCEPT) | ||
| + | target | ||
| + | |||
| + | Chain OUTPUT (policy ACCEPT) | ||
| + | target | ||
| + | |||
| + | Comme on peut le voir, par défaut le pare-feu autorise absolument tout, le rendant de fait particulièrement inutile. Il nous faut donc le paramétrer avant de pouvoir correctement l' | ||
| + | |||
| + | ====== Paramétrage ====== | ||
| + | |||
| + | ====== Service ====== | ||
| + | |||
| + | Le fichier principal du service est ''/ | ||
| + | <sxh bash># | ||
| + | ### BEGIN INIT INFO | ||
| + | # Provides: | ||
| + | # Required-Start: | ||
| + | # Required-Stop: | ||
| + | # Default-Start: | ||
| + | # Default-Stop: | ||
| + | # Short-Description: | ||
| + | # Description: | ||
| + | ### END INIT INFO | ||
| + | |||
| + | PATH=/ | ||
| + | |||
| + | do_start () { | ||
| + | iptables -t nat -F | ||
| + | iptables -t nat -X | ||
| + | iptables -t mangle -F | ||
| + | iptables -t mangle -X | ||
| + | |||
| + | iptables-restore < / | ||
| + | find / | ||
| + | do | ||
| + | iptables-restore -n < $f | ||
| + | done | ||
| + | |||
| + | iptables -P INPUT DROP | ||
| + | iptables -P FORWARD DROP | ||
| + | iptables -P OUTPUT ACCEPT | ||
| + | } | ||
| + | |||
| + | do_stop () { | ||
| + | iptables -P INPUT ACCEPT | ||
| + | iptables -P FORWARD DROP | ||
| + | iptables -P OUTPUT ACCEPT | ||
| + | iptables -F | ||
| + | iptables -X | ||
| + | iptables -t nat -F | ||
| + | iptables -t nat -X | ||
| + | iptables -t mangle -F | ||
| + | iptables -t mangle -X | ||
| + | } | ||
| + | |||
| + | case " | ||
| + | start) | ||
| + | do_start | ||
| + | ;; | ||
| + | restart|reload|force-reload) | ||
| + | do_start | ||
| + | ;; | ||
| + | stop) | ||
| + | do_stop | ||
| + | ;; | ||
| + | *) | ||
| + | echo " | ||
| + | exit 3 | ||
| + | ;; | ||
| + | esac | ||
| + | |||
| + | :</ | ||
| + | |||
| + | Quelques explication pour '' | ||
| + | |||
| + | <sxh bash> | ||
| + | iptables -t nat -X | ||
| + | iptables -t mangle -F | ||
| + | iptables -t mangle -X</ | ||
| + | |||
| + | On supprime les règles existantes dans les tables '' | ||
| + | |||
| + | <sxh bash> | ||
| + | |||
| + | On recharge les règles de base contenues dans le fichier ''/ | ||
| + | |||
| + | <sxh bash> | ||
| + | do | ||
| + | iptables-restore -n < $f | ||
| + | done</ | ||
| + | |||
| + | On recharge les règles spécifiques contenues dans le dossier ''/ | ||
| + | |||
| + | <sxh bash> | ||
| + | iptables -P FORWARD DROP | ||
| + | iptables -P OUTPUT ACCEPT</ | ||
| + | |||
| + | On applique les politiques par défaut pour les chaînes d' | ||
| + | |||
| + | Concernant le '' | ||
| + | |||
| + | Le fichier de service étant prêt, on s' | ||
| + | <sxh bash> | ||
| + | |||
| + | On s' | ||
| + | <sxh bash> | ||
| + | |||
| + | ====== Configuration de base ====== | ||
| + | |||
| + | |||
| + | On crée maintenant le fichier de configuration de base ''/ | ||
| + | <sxh bash> | ||
| + | |||
| + | Son contenu doit être : | ||
| + | <sxh bash> | ||
| + | :LOGACCEPT - [0:0] | ||
| + | :LOGDROP - [0:0] | ||
| + | |||
| + | # Allows all loopback (lo) traffic and drop all traffic to 127/8 that doesn' | ||
| + | -A INPUT -i lo -j ACCEPT | ||
| + | -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT | ||
| + | |||
| + | # Accepts all established inbound connections | ||
| + | -A INPUT -m state --state ESTABLISHED, | ||
| + | |||
| + | # Allows all outbound traffic | ||
| + | -A OUTPUT -j ACCEPT | ||
| + | |||
| + | # Custom chains for logging | ||
| + | -A LOGACCEPT -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix " | ||
| + | -A LOGACCEPT -j ACCEPT | ||
| + | |||
| + | -A LOGDROP -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix " | ||
| + | -A LOGDROP -j DROP | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | <callout type=" | ||
| + | |||
| + | Niveau explication : | ||
| + | |||
| + | <sxh bash> | ||
| + | ... | ||
| + | COMMIT</ | ||
| + | |||
| + | Tous les fichiers de configurations doivent commencé par '' | ||
| + | |||
| + | <sxh bash>: | ||
| + | :LOGDROP - [0: | ||
| + | |||
| + | On crée les chaînes '' | ||
| + | |||
| + | <sxh bash>-A INPUT -i lo -j ACCEPT | ||
| + | -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT</ | ||
| + | |||
| + | On accepte tous les paquets de la boucle interne sauf ceux qui ne proviennent pas de cette boucle (la machine peut discuter avec elle-même mais les paquets extérieurs ne peuvent pas atteindre la boucle interne). | ||
| + | |||
| + | <sxh bash>-A INPUT -m state --state ESTABLISHED, | ||
| + | |||
| + | On accepte les connexions déjà établies (évite les coupures de flux). | ||
| + | |||
| + | <sxh bash>-A OUTPUT -j ACCEPT</ | ||
| + | |||
| + | On accepte le flux sortant (permet l' | ||
| + | |||
| + | <sxh bash>-A LOGACCEPT -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix " | ||
| + | -A LOGACCEPT -j ACCEPT | ||
| + | |||
| + | -A LOGDROP -m limit --limit 1/sec --limit-burst 10 -j LOG --log-prefix " | ||
| + | -A LOGDROP -j DROP</ | ||
| + | |||
| + | On paramètre la chaîne de log pour les flux acceptés et refusés, en ajoutant notamment, un préfixe à chaque ligne de logs (pour les retrouver plus facilement dans '' | ||
| + | |||
| + | ====== Configurations spécifiques ====== | ||
| + | |||
| + | Pour la suite, on peut ajouter des règles spécifiques selon les besoins de la machine. Pour cela, on va déjà créer le dossier qui contiendra ces règles : | ||
| + | <sxh bash> mkdir / | ||
| + | |||
| + | <callout type=" | ||
| + | |||
| + | A noter aussi que les noms de fichiers de configurations utilisés sont arbitraires.</ | ||
| + | |||
| + | Dans ce dossier, chaque fichier sera numéroté afin d' | ||
| + | |||
| + | ===== Les groupes ===== | ||
| + | |||
| + | On commence alors par créer le fichier '' | ||
| + | <sxh bash> | ||
| + | Contenu : | ||
| + | <sxh bash> | ||
| + | |||
| + | # Réseau local | ||
| + | :SHYRKA - | ||
| + | -A SHYRKA -s 10.0.0.0/8 -j ACCEPT | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | Dans cet exemple, je crée un groupe '' | ||
| + | |||
| + | ===== Les paquets invalides et/ou malformés ===== | ||
| + | |||
| + | Il peut être intéressant de log les paquets invalides ou malformés suite à des micro-coupures ou des erreurs de communications avant de les supprimer. | ||
| + | <sxh bash> | ||
| + | |||
| + | # log iptables denied calls (access via ' | ||
| + | -A INPUT -m state --state INVALID -m limit --limit 5/min -j LOG --log-prefix " | ||
| + | -A INPUT -m state --state INVALID -j DROP | ||
| + | |||
| + | -A FORWARD -m state --state INVALID -m limit --limit 5/min -j LOG --log-prefix " | ||
| + | -A FORWARD -m state --state INVALID -j DROP | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | ===== Ping ===== | ||
| + | |||
| + | Le ping peut être autorisé sur la machine avec le fichier '' | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allow ping | ||
| + | -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | En remplaçant '' | ||
| + | |||
| + | ===== SSH ===== | ||
| + | |||
| + | Sur un machine linux, il est fréquent de s'y connecter en '' | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allows SSH from SHYRKA | ||
| + | -A INPUT -p tcp --dport 22 -m state --state NEW, | ||
| + | |||
| + | # Allows SSH from UNIVERSE | ||
| + | -A INPUT -s 12.34.56.78 -p tcp --dport 22 -m state --state NEW, | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | Ici, on applique l' | ||
| + | |||
| + | ===== Log ===== | ||
| + | |||
| + | On termine généralement par loguer tout ce qui n'est pas accepté via la configuration du fichier '' | ||
| + | <sxh bash> | ||
| + | |||
| + | # log iptables denied calls (access via ' | ||
| + | -A INPUT -m limit --limit 5/min -j LOG --log-prefix " | ||
| + | -A FORWARD -m limit --limit 5/min -j LOG --log-prefix " | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | ====== Autres exemples de configurations ====== | ||
| + | |||
| + | Ci-dessous, des exemples de configurations additionnelles selon des services courants. | ||
| + | |||
| + | ===== NTP ===== | ||
| + | |||
| + | * Fichier : '' | ||
| + | * Contenu : | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allow NTP | ||
| + | -A INPUT -p udp --dport 123 -j ACCEPT | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | ===== FTP ===== | ||
| + | |||
| + | * Fichier : '' | ||
| + | * Contenu : | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allow FTP and FTPS | ||
| + | -A INPUT -p tcp --dport 20,21 -m state --state NEW, | ||
| + | -A INPUT -p tcp --dport 989 -m state --state NEW, | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | ===== Messagerie ===== | ||
| + | |||
| + | * Fichier : '' | ||
| + | * Contenu : | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allows POP3 and POP3S | ||
| + | -A INPUT -p tcp --dport 110 -m state --state NEW, | ||
| + | -A INPUT -p tcp --dport 995 -m state --state NEW, | ||
| + | |||
| + | # Allow IMAP and IMAPS | ||
| + | -A INPUT -p tcp --dport 143 -m state --state NEW, | ||
| + | -A INPUT -p tcp --dport 995 -m state --state NEW, | ||
| + | |||
| + | # Allow SMTP, SMTPS and SMTPS with STARTTLS | ||
| + | -A INPUT -p tcp --dport 25 -m state --state NEW, | ||
| + | -A INPUT -p tcp --dport 465 -m state --state NEW, | ||
| + | -A INPUT -p tcp --dport 587 -m state --state NEW, | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | ===== Munin node ===== | ||
| + | |||
| + | * Fichier : '' | ||
| + | * Contenu : | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allows Munin connections from Munin server(s) | ||
| + | -A INPUT -p tcp -s 10.1.2.3 --dport 4949 -m state --state NEW, | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | ===== Serveur Web ===== | ||
| + | |||
| + | * Fichier : '' | ||
| + | * Contenu : | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allows HTTP(s) connections | ||
| + | -A INPUT -p tcp --dport 80 -m state --state NEW, | ||
| + | -A INPUT -p tcp --dport 443 -m state --state NEW, | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | ===== MySQL ===== | ||
| + | |||
| + | * Fichier : '' | ||
| + | * Contenu : | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allows MySQL connections | ||
| + | -A INPUT -p tcp --dport 3306 -m state --state NEW, | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | ===== Rsyslog (pour les puist de logs) ===== | ||
| + | |||
| + | * Fichier : '' | ||
| + | * Contenu : | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allows Rsyslog connections | ||
| + | -A INPUT -p tcp -s 10.4.5.6 --dport 514 -j ACCEPT | ||
| + | -A INPUT -p udp -s 10.4.5.6 --dport 514 -j ACCEPT | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | ===== DNS ===== | ||
| + | |||
| + | * Fichier : '' | ||
| + | * Contenu : | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allows DNS connections | ||
| + | -A INPUT -p udp --dport 53 -j ACCEPT | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | ===== NRPE (Services actifs Nagios) ===== | ||
| + | |||
| + | * Fichier : '' | ||
| + | * Contenu : | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allows NRPE connections from Nagios server(s) | ||
| + | -A INPUT -p tcp -s 10.7.8.9 --dport 5666 -m state --state NEW, | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | ===== NSCA (Services passifs Nagios) ===== | ||
| + | |||
| + | * Fichier : '' | ||
| + | * Contenu : | ||
| + | <sxh bash> | ||
| + | |||
| + | # Allows NSCA connections from local network | ||
| + | -A INPUT -p tcp -s 10.0.0.0/8 --dport 5667 -m state --state NEW, | ||
| + | |||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | ====== Conclusion ====== | ||
| + | |||
| + | Une fois les différentes configutions mises en place et le service '' | ||
| + | |||
| + | Exemple : | ||
| + | <sxh bash> | ||
| + | target | ||
| + | ACCEPT | ||
| + | REJECT | ||
| + | ACCEPT | ||
| + | LOG all -- 0.0.0.0/ | ||
| + | DROP | ||
| + | ACCEPT | ||
| + | SHYRKA | ||
| + | ACCEPT | ||
| + | ACCEPT | ||
| + | ACCEPT | ||
| + | ACCEPT | ||
| + | ACCEPT | ||
| + | LOG all -- 0.0.0.0/ | ||
| + | |||
| + | Chain FORWARD (policy DROP) | ||
| + | target | ||
| + | LOG all -- 0.0.0.0/ | ||
| + | DROP | ||
| + | LOG all -- 0.0.0.0/ | ||
| + | |||
| + | Chain OUTPUT (policy ACCEPT) | ||
| + | target | ||
| + | ACCEPT | ||
| + | |||
| + | Chain LOGACCEPT (0 references) | ||
| + | target | ||
| + | LOG all -- 0.0.0.0/ | ||
| + | ACCEPT | ||
| + | |||
| + | Chain LOGDROP (0 references) | ||
| + | target | ||
| + | LOG all -- 0.0.0.0/ | ||
| + | DROP | ||
| + | |||
| + | Chain SHYRKA (1 references) | ||
| + | target | ||
| + | ACCEPT | ||
| + | </ | ||
| + | |||
| + | <callout type=" | ||
| + | Voilà, votre pare-feu est actif et entièrement paramétrable selon vos souhaits.</ | ||
| + | ~~DISCUSSION~~ | ||