Différence entre DNAT et REDIRECT dans IPTABLES

14

D'accord, c'est peut-être parce que je suis dense ou que je ne trouve tout simplement pas la bonne source, mais je ne comprends pas pourquoi l'une de ces configurations IPTABLES serait meilleure que l'autre.

Voici ma configuration:

J'ai une boîte qui sert de proxy transparent et un routeur ou trie. Il possède deux interfaces, ETH0 et ETH1, et le schéma d'adresse suivant:

ETH0 = DHCP ETH1 = 192.168.5.1/24 servant DHCP pour le réseau 192.168.5.0/24 aux clients derrière lui dans le LAN

J'ai installé et écouté privoxy sur le port 8080 en tant que proxy transparent. Ce que j'accomplis avec cette configuration est de pouvoir déposer cette boîte dans un réseau existant avec une configuration minimale et des clients attachés au proxy.

Voici mon fichier IPTABLES original

*nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-port 8080
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
COMMIT

Cette configuration fonctionne correctement et le trafic circule sans problème. J'obtiens l'adresse IP des clients d'origine dans les fichiers journaux privoxy, et la vie est bonne.

Ma confusion survient lorsque je commence à regarder les configurations des autres et que je vois qu'ils utilisent DNAT au lieu de REDIRECT, et j'essaie de comprendre le véritable avantage de l'un sur l'autre. Voici un exemple de configuration:

*nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to 192.168.5.1:8080
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
COMMIT

Encore une fois, cette configuration fonctionne aussi et me donne tout ce dont j'ai besoin du point de vue de la journalisation ...

Qu'est-ce qui est juste, ou peut-être PLUS, que l'autre?

Merci d'avoir pris le temps de lire jusqu'ici ...

QWade
la source

Réponses:

14

REDIRECTmodifie l'adresse IP de destination à envoyer à la machine elle-même. En d'autres termes, les paquets générés localement sont mappés à l'adresse 127.0.0.1. C'est pour rediriger les paquets locaux. Si vous souhaitez uniquement rediriger le trafic entre les services sur la machine locale, ce sera un bon choix.

DNATest la traduction d'adresse réseau réelle . Si vous voulez que les paquets destinés à l'extérieur du système local aient la destination modifiée, c'est le meilleur choix des deux, car REDIRECTcela ne fonctionnera pas.

Warner
la source
ok, donc si j'ai un client assis derrière le proxy, disons sur 192.168.5.234, et que je veux "traiter" ses requêtes HTTP via le proxy sur 192.168.5.1, vous proposez que je devrais DNAT le trafic du port 80 sortant vers 192.168 .5.1: 8080 sur le proxy. Je peux l'acheter, mais POURQUOI ???? Est-ce que cela a à voir avec la façon dont le trafic est traité une fois qu'il quitte l'ETH0 du proxy en sortant via la passerelle par défaut vers Internet? J'ai besoin de faire ça ou ma tête va exploser
QWade
2
DNAT change l'adresse au fur et à mesure que le paquet traverse le pare-feu pour arriver à l'hôte souhaité, et au contraire semble provenir du pare-feu. DNAT ne s'applique presque jamais au trafic sortant, qui est géré par la règle MASQUERADE. Si le proxy privé se trouvait sur un autre hôte, alors DNAT serait approprié, avec une exception appropriée pour cet hôte.
BillThor
Bill, merci. C'est là qu'allait mon cerveau reptilien, mais est-ce toujours agréable d'avoir une validation. Donc, si j'envoie un paquet destiné à google.com à partir de 192.168.5.234 et qu'il a son gw par défaut défini comme 192.168.5.1 (eth1 sur le proxy), je dois "REDIRIGER" ce paquet vers le port 8080 sur le proxy et laisser privoxy faire le reste. La raison en est que privoxy vit sur 192.168.5.1 et non sur un autre hôte. Suis-je en train de fumer quelque chose que je ne devrais pas?
QWade
9

REDIRECTne modifie pas l'adresse IP de destination à envoyer à la machine elle-même, comme l'a répondu Warner @. Mais je dirais que cette réponse n'est pas totalement correcte, ou un peu trompeuse.

REDIRECTn'est pas seulement pour rediriger les paquets locaux. C'est vraiment DNATdans lequel l'adresse IP de destination à utiliser est implicite, 127.0.0.1 s'il s'agit d'un paquet local ou l'adresse IP de l'interface machine sinon, 192.168.5.1 dans le cas de l'OP.

Donc, dans cette question, quelle que soit la destination finale, les paquets doivent d'abord atteindre le proxy, c'est donc REDIRECTparfaitement adapté.

Étant donné que REDIRECTvous n'avez pas besoin de spécifier l'adresse IP, elle prendra simplement la bonne, elle présente certains avantages par rapport à DNAT:

  • Si l'adresse IP de la machine change pour une raison quelconque, vous n'avez pas besoin de modifier vos règles, et en particulier DNATne fonctionnera pas pour les interfaces contrôlées par DHCP.

  • Vous pouvez écrire et maintenir les mêmes règles pour plusieurs systèmes (plusieurs instances de proxy par exemple) sans conserver de versions légèrement différentes en raison des adresses IP spécifiques.

Julio Diez
la source
en quelque sorte comme snat / mascarade.
Jichao
@Hod, j'entends que REDIRECT est un cas particulier de DNAT, mais j'utilise REDIRECT et TOR connaît la destination réelle d'un paquet, donc je conclus que daddr et dport des structures iphdr et tcphdr sont intacts, et le paquet vient de retourner à destination REDIRECT en noyau. DNAT va en fait modifier les structures. Ai-je tort?
mèche