web-dev-qa-db-fra.com

Quelle est la différence entre PREROUTING et FORWARD dans iptables?

J'essaie de comprendre comment ce système fonctionne et j'ai du mal à comprendre la différence entre utiliser NAT PREROUTING ou filtrer EN AVANT. D'après ce que j'ai compris, le PREROUTE peut envoyer le paquet à un autre serveur en évitant le filtre. Si NAT peut gérer cela via PREROUTE, à quoi sert-il d'avoir une règle FORWARD dans le filtre?

14
GheorGhe

Table NAT :

Cette table ne doit être utilisée que pour NAT (traduction d'adresse réseau) sur différents paquets. En d'autres termes, il ne devrait être utilisé que pour traduire le champ source ou le champ de destination du paquet.

table de filtrage :

La table de filtrage est principalement utilisée pour filtrer les paquets. Nous pouvons faire correspondre les paquets et les filtrer comme bon nous semble. C’est à cet endroit que nous agissons contre les paquets et examinons ce qu’ils contiennent et DROP ou/ACCEPT, en fonction de leur contenu. Bien entendu, nous pouvons également effectuer un filtrage préalable; Cependant, cette table est le lieu pour lequel le filtrage a été conçu.

Dans Parcours des tables et des chaînes , nous pouvons voir que la chaîne FORWARD du filtre est uniquement traversée par les paquets transférés (les paquets provenant du réseau ET se rendant vers le réseau), c’est-à-dire que votre ordinateur agit comme un routeur, tandis que celui de nat La chaîne PREROUTING est traversée à la fois par les paquets transférés et par les paquets dont la destination est l'hôte local.

Vous devez utiliser la commande PREROUTING de nat uniquement pour modifier l'adresse de destination des paquets et le filtre FORWARD du filtre uniquement pour le filtrage (suppression/acceptation de paquets).

Si nous introduisons un paquet dans la première décision de routage qui n'est pas destiné à la machine locale elle-même, il sera routé via la chaîne FORWARD. Par contre, si le paquet est destiné à une adresse IP écoutée par la machine locale, nous l'enverrons par la chaîne INPUT et à la machine locale. enter image description here Les paquets peuvent être destinés à la machine locale, mais l'adresse de destination peut être changée dans la chaîne PREROUTING en faisant NAT. Comme cela a lieu avant la première décision de routage, le paquet sera examiné après ce changement. De ce fait, le routage peut être modifié avant que la décision de routage ne soit prise. Notez que tous les paquets passeront par l’un ou l’autre chemin de cette image. Si vous DNAT un paquet en retour sur le même réseau que celui-ci, il continuera à voyager à travers le reste des chaînes jusqu'à ce qu'il soit de retour sur le réseau.

22
Eric Carvalho

PREROUTING: cette chaîne est utilisée pour prendre toutes les décisions liées au routage avant (PRE) d'envoyer des paquets. Rappelez-vous toujours que, dans la table PREROUTING/POSTROUTING, c'est-à-dire NAT, les cibles ACCEPT/DROP/REJECT etc etc. de la table par défaut FILTER ne fonctionneront pas. La table NAT sert uniquement à prendre des décisions de routage. Vous devez utiliser PREROUTING lorsque vous prenez des décisions de routage, c’est-à-dire les décisions qui doivent être prises avant que le paquet ne commence à traverser le réseau. Voici un exemple, nous redirigeons tout le trafic qui vient d'atteindre le serveur sur le port 80 vers le port 8080:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

FORWARD: Comme son nom l'indique, la chaîne FORWARD de la table FILTER permet de transférer les paquets d'une source à une destination. La source et la destination sont ici deux hôtes différents. Ainsi, comme vous pouvez l’imaginer, les règles FORWARD sont généralement utilisées sur des serveurs où un hôte envoie/reçoit du trafic d’un autre hôte via le serveur. Lorsque le paquet est généré à partir du serveur, la chaîne est OUTPUT, c’est-à-dire que le trafic sort de lui-même, alors que INPUT chain signifie que les paquets sont uniquement destinés au serveur lui-même. Voici un exemple de chaîne FORWARD où tout trafic TCP reçu sur le port 80 sur l'interface eth0 destiné à l'hôte 192.168.0.4 sera accepté et transféré à 192.168.0.4:

iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 192.168.0.4 -j ACCEPT
4
heemayl