GNU/Linux >> Tutoriels Linux >  >> Linux

Linux IPTables :Exemples de règles entrantes et sortantes (SSH et HTTP)

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.

  1. Supprimez toutes les règles existantes :"iptables -F"
  2. Autoriser uniquement les SSH entrants :"iptables -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT"
  3. 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.

  1. Règle de requête :il s'agit de la requête envoyée par le client au serveur pour la connexion entrante.
  2. 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.

  1. Règle de requête :il s'agit de la requête qui sort du serveur vers l'extérieur pour la connexion sortante.
  2. 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 :

  1. Supprimer toutes les règles existantes
  2. Définir des règles de chaîne par défaut
  3. Autoriser SSH entrant
  4. Autoriser le HTTP entrant
  5. 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)

Linux
  1. Linux IPTables :comment ajouter des règles de pare-feu (avec l'exemple Autoriser SSH)

  2. 25 exemples de règles Linux IPTables les plus fréquemment utilisés

  3. CentOS / RHEL :Comment bloquer les ports entrants et sortants à l'aide d'iptables

  4. Exemples de commandes mkdir et rmdir sous Linux

  5. Exemples de commandes swapon et swapoff sous Linux

Établir une connexion SSH entre Windows et Linux

19 commandes SSH courantes sous Linux avec exemples

Commandes SSH sous Linux avec exemples d'utilisation

Options de commande et exemples de commande Tee sous Linux

50 exemples simples et utiles de la commande Find sous Linux

16 exemples pratiques et utiles de la commande Echo sous Linux