web-dev-qa-db-fra.com

iptables FORWARD et INPUT

J'ai un réseau domestique avec des PC Linux, qui fonctionnaient tous avec iptables. Je pense qu'il est plus facile de mettre mon LAN derrière une passerelle/pare-feu Linux, j'ai donc mis un PC (avec Fedora, pas de GUI) entre mon routeur et LAN et configuré iptables. Pas de problème ici, INPUT n'autorise que le DNS (et quelques trucs locaux), le transfert fonctionne bien: le LAN se connecte à Internet.

Mais ma question est: est-ce que FORWARD autorise tout de l'extérieur, ou seulement les ports que j'ai configurés avec INPUT? FORWARD et INPUT fonctionnent-ils ensemble ou sont-ils séparés?

Voici mes iptables:

*nat
:PREROUTING ACCEPT [16:1336]
:INPUT ACCEPT [14:840]
:OUTPUT ACCEPT [30:2116]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -o p1p1 -j MASQUERADE
COMMIT
# Completed on Tue Oct 16 09:55:31 2012
# Generated by iptables-save v1.4.14 on Tue Oct 16 09:55:31 2012
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [91:9888]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p UDP --dport 53 -j ACCEPT
-A INPUT -p TCP --dport 53 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp -m multiport --dports 20,21 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp -m multiport --dports 20,21 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp -m tcp --dport 5000:5100 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp -m tcp --dport 5000:5100 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i p1p1 -p tcp -m tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.2.0/24 -i p3p1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 192.168.1.0/24 -i p1p1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i p1p1 -p tcp -m multiport --dports 20,21,443 -j DROP
-A INPUT -i p1p1 -p tcp --dport 5000:5100 -j DROP
-A INPUT -i p1p1 -p icmp -m icmp --icmp-type 8 -j DROP
-A FORWARD -s 192.168.2.0/24 -j ACCEPT
-A FORWARD -d 192.168.2.0/24 -j ACCEPT
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7
-A OUTPUT -j LOG --log-prefix "denied out: "

COMMIT

p1p1 (.1.x) est mon nic externe, p3p1 (.2.x) est interne.

29
user1754764

RedHat a un grand doc sur iptables (un peu long), mais le sujet à couvrir est complexe et il y en a tellement de nombreux cas d'utilisation différents que je ne vois pas comment l'éviter.

iptables kernel routing

Voici le chapitre sur FORWARD et NAT Rules. Comme il l'indique:

Par exemple, si vous souhaitez transférer les requêtes HTTP entrantes à votre serveur Apache HTTP dédié au 172.31.0.23 , utilisez la commande suivante en tant qu'utilisateur root:

~]# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80

Voici ce qui se passe:

  • votre passerelle linux reçoit un paquet de votre routeur. L'en-tête du paquet a:
    • source: x.x.x.x:y (IP de l'expéditeur à partir du port Internet et source utilisé pour la transmission de paquets)
    • destination: 192.168.1.1:80 (en supposant que votre IP de passerelle linux sur une carte réseau externe, c'est-à-dire p1p1)
  • votre passerelle linux applique la [~ # ~] pré-routage [~ # ~] chaîne pour trouver une correspondance. En supposant que vous avez tapé ce qui précède, le paquet correspond à la règle puis appelle (saute -j) Au Fonction DNAT ( Traduction de l'adresse du réseau de destination) qui change la destination de l'en-tête du paquet du 192.168.1.1:80 initial au 172.31.0.23:80.
  • ensuite, le paquet arrive à la décision de routage . La destination du paquet est désormais 172.31.0.23:80.
    • Votre passerelle Linux se demande: est-ce pour moi (192.168.1.1:80)? Non, donc je n'enverrai pas à l'entrée [~ # ~] [~ # ~] chaîne.
    • => Je vais l'envoyer à la chaîne [~ # ~] avant [~ # ~] .
  • puisque vous avez défini les règles sur FORWARD tout sur votre réseau local (table filter chaîne FORWARD), le paquet doit être transmis correctement à votre serveur Apache HTTP local (par exemple).

J'espère que cela vous aidera à comprendre un peu plus le fonctionnement du routage interne avec iptables.

80
Samuel Phan

INPUT, FORWARD et OUTPUT sont séparés. Un paquet ne touchera qu'une des trois chaînes.

Si la destination est to ce serveur, il frappe la chaîne INPUT. Si sa source est from ce serveur, il frappe OUTPUT. Si sa source et sa destination sont les deux autres machines - il est routé via le serveur - alors il frappe la chaîne FORWARD.

66
John Kugelman