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.
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.
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:
x.x.x.x:y
(IP de l'expéditeur à partir du port Internet et source utilisé pour la transmission de paquets)192.168.1.1:80
(en supposant que votre IP de passerelle linux sur une carte réseau externe, c'est-à-dire p1p1
)-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
.172.31.0.23:80
. 192.168.1.1:80
)? Non, donc je n'enverrai pas à l'entrée [~ # ~] [~ # ~] chaîne.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.
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.