Dans notre article précédent sur le pare-feu IPTables, nous avons examiné comment ajouter une règle de pare-feu à l'aide de "iptables -A".
Nous avons également expliqué comment autoriser la connexion SSH entrante. À un niveau élevé, cela implique de suivre 3 étapes.
- Supprimez toutes les règles existantes :"iptables -F"
- Autoriser uniquement les SSH entrants :"iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT"
- Supprimer tous les autres paquets entrants :"iptables -A INPUT -j DROP"
Ce qui précède fonctionne. Mais ce n'est pas complet. Un problème avec les étapes ci-dessus est qu'il ne limite pas les paquets sortants.
Politique de chaîne par défaut
La politique par défaut d'une chaîne est ACCEPTER. Si vous ne savez pas ce que signifie une chaîne, vous feriez mieux de lire notre article d'introduction à iptables. Ainsi, la politique par défaut de la chaîne INPUT et OUTPUT est ACCEPTER. Dans les 3 étapes ci-dessus, nous avons supprimé tous les paquets entrants à la fin (sauf ssh entrant). Cependant, nous n'avons pas limité le trafic sortant.
Comme vous le remarquez ci-dessous, il est écrit "(policy ACCEPT)" à côté des trois noms de chaîne (INPUT, OUTPUT et FORWARD). Cela indique que la stratégie de chaîne par défaut est ACCEPTER.
# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh DROP all -- anywhere anywhere Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Donc, vous avez deux options ici.
Option 1 :Ajouter des règles de dépôt
À la fin, ajoutez les trois règles de suppression suivantes qui supprimeront tous les paquets entrants, sortants et transmis (à l'exception de ceux qui sont définis au-dessus de ces trois règles). Si vous faites cela, la stratégie de chaîne par défaut est toujours ACCEPTER, ce qui ne devrait pas avoir d'importance, car vous supprimez de toute façon tous les paquets à la fin.
iptables -A INPUT -j DROP iptables -A OUTPUT -j DROP iptables -A FORWARD -j DROP
Option 2 :Changer la stratégie de chaîne par défaut en DROP
Au début, exécutez les trois commandes suivantes qui changeront la politique par défaut de la chaîne en DROP.
iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP
Maintenant, si vous ajoutez la règle allow ssh :« iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT », et faites iptables -L, vous remarquerez qu'il est écrit « (policy DROP) » à côté de toutes les trois chaînes.
# iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh DROP all -- anywhere anywhere Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination
Mais il y a un problème ici. La règle d'autorisation de connexion entrante ssh ne fonctionnera plus, car tous les paquets sortants sont abandonnés.
Autoriser les connexions entrantes
Lorsque la stratégie par défaut est DROP pour les chaînes INPUT et OUTPUT, pour chaque règle de pare-feu entrante, vous devez spécifier les deux règles suivantes.
- Règle de requête :il s'agit de la requête envoyée par le client au serveur pour la connexion entrante.
- Règle de réponse :il s'agit de la réponse qui sort du serveur vers le client (pour la requête entrante correspondante).
Exemple 1 :Autoriser la connexion SSH entrante
C'est pour permettre une connexion SSH de l'extérieur à votre serveur. c'est-à-dire que vous pouvez vous connecter en ssh à votre serveur depuis l'extérieur.
Cela implique deux étapes. Tout d'abord, nous devons autoriser les nouvelles connexions SSH entrantes. Une fois la connexion ssh entrante autorisée, nous devons également autoriser la réponse pour cette connexion ssh entrante.
Tout d'abord, autorisez les demandes de connexion SSH entrantes, comme indiqué ci-dessous.
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
Dans l'exemple ci-dessus :
- iptables -A INPUT :ajoute la nouvelle règle à la chaîne INPUT. Pour une demande de connexion entrante, cela doit toujours être INPUT.
- -i eth0 :cela fait référence à l'interface d'entrée. Pour les connexions entrantes, cela doit toujours être "-i".
- -p tcp :indique qu'il s'agit du protocole TCP.
- –dport 22 :il s'agit du port de destination pour la connexion entrante. Le port 22 est pour ssh.
- -m state :Ceci indique que le module de correspondance "state" est utilisé. Nous discuterons plus en détail de l'option "-m" (et de tous les modules correspondants disponibles pour iptables) dans un prochain article.
- –state NEW, ESTABLISHED :options pour le module de correspondance "state". Dans cet exemple, seuls les états NEW et ESTABLISHED sont autorisés. La 1ère fois qu'une demande de connexion SSH est initiée du client vers le serveur, l'état NEW est utilisé. L'état ESTABLISHED est utilisé pour toute demande ultérieure du client au serveur.
Ensuite, autorisez la réponse de connexion SSH sortante (état ESTABLISHED uniquement) (pour la demande de connexion SSH entrante correspondante).
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Dans l'exemple ci-dessus :
- iptables -A OUTPUT :ajoute la nouvelle règle à la chaîne OUTPUT. Puisqu'il s'agit de la règle de réponse (pour la demande entrante correspondante) qui sort du serveur, cela devrait être OUTPUT.
- -o eth0 :cela fait référence à l'interface de sortie. Pour les connexions sortantes, cela doit toujours être "-o".
- -p tcp :indique qu'il s'agit du protocole TCP.
- –sport 22 :il s'agit du port source de la connexion sortante. Le port 22 est pour ssh. Étant donné que la requête entrante (de la règle précédente) est arrivée au port "destination", la réponse sortante passera par le port "source".
- -m state :Ceci indique que le module de correspondance "state" est utilisé.
- –state ESTABLISHED :étant donné qu'il s'agit d'une règle de réponse, nous n'autorisons que les connexions ESTABLISHED (et non les NOUVELLES connexions).
Exemple 2 :Autoriser la connexion HTTP entrante
C'est pour permettre une connexion HTTP de l'extérieur vers votre serveur. c'est-à-dire que vous pouvez voir votre site Web en cours d'exécution sur le serveur depuis l'extérieur.
Tout comme les règles entrantes SSH ci-dessus, cela implique également deux étapes. Tout d'abord, nous devons autoriser la nouvelle connexion HTTP entrante. Une fois la connexion HTTP entrante autorisée, nous devons autoriser la réponse pour cette connexion HTTP entrante.
Tout d'abord, autorisez les demandes de connexion HTTP entrantes, comme indiqué ci-dessous.
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
Ensuite, autorisez la réponse de connexion HTTP sortante (ETABLI uniquement) (pour la demande de connexion SSH entrante correspondante).
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Remarque :Dans la règle de requête et de réponse HTTP ci-dessus, tout est identique à l'exemple SSH, à l'exception du numéro de port.
Autoriser les connexions sortantes
Lorsque la politique par défaut est DROP pour les chaînes INPUT et OUTPUT, pour chaque règle de pare-feu sortante, vous devez spécifier les deux règles suivantes.
- Règle de requête :il s'agit de la requête qui sort du serveur vers l'extérieur pour la connexion sortante.
- Règle de réponse :c'est pour la réponse qui revient de l'extérieur vers le serveur (pour la requête sortante correspondante).
Exemple 3 :Autoriser la connexion SSH sortante
C'est pour permettre la connexion SSH de votre serveur vers l'extérieur. c'est-à-dire que vous pouvez vous connecter en ssh à un serveur externe à partir de votre serveur.
Cela implique deux étapes. Tout d'abord, nous devons autoriser une nouvelle connexion SSH sortante. Une fois que la connexion ssh sortante est autorisée, nous devons également autoriser la réponse pour cette connexion ssh sortante.
Tout d'abord, autorisez la demande de connexion SSH sortante, comme indiqué ci-dessous.
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
Dans l'exemple ci-dessus :
- iptables -A OUTPUT :ajoute la nouvelle règle à la chaîne OUTPUT. Pour une demande de connexion sortante, cela doit toujours être OUTPUT.
- -o eth0 :cela fait référence à l'interface de sortie. Pour les connexions sortantes, cela doit toujours être "-o".
- -p tcp :indique qu'il s'agit du protocole TCP.
- –dport 22 :cela fait référence au port de destination pour la connexion sortante.
- -m state :ceci indique que le module de correspondance "state" est utilisé.
- –state NEW, ESTABLISHED :options pour le module de correspondance "state". Dans cet exemple, seuls les états NEW et ESTABLISHED sont autorisés. La 1ère fois qu'une demande de connexion SSH est initiée du serveur vers l'extérieur, l'état NEW est utilisé. L'état ESTABLISHED est utilisé pour toute demande ultérieure du serveur vers l'extérieur.
Ensuite, Autoriser la réponse de connexion SSH sortante (ETABLI UNIQUEMENT) (pour la demande de connexion SSH entrante correspondante).
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Dans l'exemple ci-dessus :
- iptables -A INPUT :ajoute la nouvelle règle à la chaîne INPUT. Puisqu'il s'agit de la règle de réponse (pour la requête sortante correspondante) qui vient de l'extérieur vers le serveur, cela devrait être INPUT.
- -i eth0 :cela fait référence à l'interface d'entrée. Pour les connexions entrantes, cela doit toujours être "-i".
- -p tcp :indique qu'il s'agit du protocole TCP.
- –sport 22 :il s'agit du port source de la connexion entrante. Étant donné que la requête sortante (de la règle précédente) est allée au port "destination", la réponse entrante proviendra du port "source".
- -m state :Ceci indique que le module de correspondance "state" est utilisé.
- –state ESTABLISHED :étant donné qu'il s'agit d'une règle de réponse, nous n'autorisons que les connexions ESTABLISHED (et non les NOUVELLES connexions).
Tout mettre ensemble
Créez un script shell rules.sh qui effectue les opérations suivantes :
- Supprimer toutes les règles existantes
- Définir des règles de chaîne par défaut
- Autoriser SSH entrant
- Autoriser le HTTP entrant
- Autoriser SSH sortant
Commencez par créer le fichier rules.sh
$ vi rules.sh # 1. Delete all existing rules iptables -F # 2. Set default chain policies iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # 3. Allow incoming SSH iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # 4. Allow incoming HTTP iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT # 5. Allow outgoing SSH iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Ensuite, exécutez le fichier rules.sh et affichez les règles.
# chmod u+x rules.sh # ./rules.sh # iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:http state NEW,ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp spt:ssh state ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp spt:ssh state ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp spt:http state ESTABLISHED ACCEPT tcp -- anywhere anywhere tcp dpt:ssh state NEW,ESTABLISHED
En utilisant cela comme base, vous devriez pouvoir écrire vos propres règles de pare-feu iptables entrantes et sortantes. Il y a beaucoup plus à couvrir dans IPTables. Restez à l'écoute !
Articles précédents de la série iptables :
- Didacticiel sur le pare-feu Linux :Tables IPTables, chaînes, principes de base des règles
- IPTables Flush :Supprimer / Supprimer toutes les règles sur RedHat et CentOS Linux
- Linux IPTables :comment ajouter des règles de pare-feu (avec l'exemple Autoriser SSH)