Forum Linux.général Iptables et NAT

Posté par  .
Étiquettes : aucune
2
28
sept.
2009
Bonjour,
après une longue période sans pratique, je reviens à IPtables, en l'occurence pour faire du NAT.
Mes souvenirs ne doivent plus être au top, car impossible à faire fonctionner, même en m'aidant de google....

Je veux donc simplement faire du nat de façon à ce que lorsque qu'un poste accède à l'adresse 10.1.0.1:80, il accès en réalité à 10.1.0.2:80.

j'ai donc voulu mettre la règle suivante :
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.8.0.1:80

mais ça marche pô....


pour info, iptables -t filter -L me donne ACCEPT pour INPUT, FORWARD et OUTPUT
et iptables -t nat -L me donne ACCEPT également pour tout

Je sais que je suis fatigué aujourd'hui, mais vu que je tourne en rond depuis un moment, si quelqu'un pouvais m'éclairer, je lui en serais reconnaissant.
  • # --to-destination

    Posté par  . Évalué à 2.

    Je ne connais pas l'option --to, pour ma part j'utilise --to-destination :

    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.8.0.1:80
  • # mauvaises adresses

    Posté par  . Évalué à 5.

    Tu veux rediriger 10.1.0.1 vers 10.1.0.2, donc ta cible (DNAT) doit être 10.1.0.2.

    Par ailleurs, si tu veux rediriger uniquement les requêtes initialement à destination de 10.1.0.1, et non les requêtes HTTP à destination de n'importe quelle machine du réseau ou d'Internet, il faut ajouter cette adresse en condition :

    iptables -t nat -A PREROUTING -i eth0 -p tcp -d 10.1.0.1 --dport 80 -j DNAT --to-destination 10.8.0.2:80
  • # Mention de l'interface inutile

    Posté par  . Évalué à 2.

    Je ne pense pas qu'il soit nécessaire de préciser l'interface :

    iptables -t nat -A PREROUTING -p tcp -d 10.1.0.1 --dport 80 -j DNAT --to-destination 10.8.0.2:80
  • # Dans l'autre sens?

    Posté par  . Évalué à 3.

    Manquerait pas un morceau, genre ça?
    -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

    Autrement dit: Que la machine derrière le NAT puisse envoyer des paquets, c'est bien.
    Qu'elle puisse recevoir la réponse, c'est mieux.
    Sinon, je suppose que tu as pensé à ceci:
    echo 1 > /proc/sys/net/ipv4/ip_forward ?

    THIS IS JUST A PLACEHOLDER. YOU SHOULD NEVER SEE THIS STRING.

  • # Quelques éléments en plus.... (marche toujours pas...)

    Posté par  . Évalué à 1.

    Bon, j'avais fait quelques erreurs en copiant ma règle ici, mais j'utilisais bien --to-destionation 10.8.0.2:80

    Par contre, je n'avais effectivement pas mis la règle " -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT"

    Ceci étant dis, je viens de la rajouter, et ça ne fonctionne toujours pas.........

    Je viens de faire également le test suivant, sur ma machine locale,
    iptables -t nat -A PREROUTING -i lo -p tcp --dport 12345 -j DNAT --to-destination 127.0.0.1:80

    et ça ne marche pas non plus !
    Je ne vois l'erreur....
  • # je dis surement une betise mais

    Posté par  . Évalué à 2.

    il me semble que le DNAT doit se mettre dans la chaine POSTROUTING (modification de la destination)

    iptables -t nat -A POSTROUTING -d 10.0.1.1 --dport 80 -j DNAT --to-destination 10.8.0.2:80

    le PREROUTING etant pour le SNAT (modification de la source)
    • [^] # Re: je dis surement une betise mais

      Posté par  . Évalué à 1.

      Pas nécessairement :
      http://www.netfilter.org/documentation/HOWTO/fr/NAT-HOWTO-6.(...)

      Sinon, le plus simple est tout de même de log-er histoire de voir quel type de paquet passe à la trappe.
      Voir aussi avec lsmod si tu as bien iptable_nat ou quelque chose de ce genre (sauf bien sûr si c'est en dur dans le noyau).
      --to est le raccourci de --to-destination et fonctionne donc aussi.
      Une petite chose également, cette règle est sur quelle machine ? :)
  • # De tête

    Posté par  . Évalué à 3.


    echo 1 > /proc/sys/net/ipv4/ip_forward

    iptables --table nat --append PREROUTING --destination $LOCAL_IP --protocol tcp --destination-port 80 --jump DNAT --to-destination $DEST_IP
    iptables --table nat --append POSTROUTING --destination $DEST_IP --protocol tcp --destination-port 80 --jump SNAT --to-source $LOCAL_IP


    Sinon socat, rinetd, stone, etc sont des logiciels libres fait pour cela.

    Le "-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT" n'a aucune utilitée dans le cas du NAT.
    • [^] # Re: De tête

      Posté par  . Évalué à 2.


      Effectivement, il est important de modifier la source des paquets forwardé, sinon la machine qui va les recevoir répondra directement à ton client. Ton client recevra (si le réseau et les routes le permettent) des paquets tel que les premiers ACK mais il les ignorera car ils ne viennent pas d'une connection qu'il a initié (response source IP != request destination IP).


      Si tu as deux cartes réseaux sur ton 'routeur':

      #!/bin/bash
      IN_DEVICE=eth0
      LOCAL_IP=192.168.0.250
      LOCAL_PORT=22

      OUT_DEVICE=eth1
      OUT_DEVICE_IP=192.168.2.250
      NEW_IP=192.168.2.105
      NEW_PORT=22
      echo 1 > /proc/sys/net/ipv4/ip_forward

      iptables -t nat -A PREROUTING -i ${IN_DEVICE} -p tcp -d ${LOCAL_IP} --dport ${LOCAL_PORT} -j DNAT --to-destination ${NEW_IP}:${NEW_PORT}
      iptables -t nat -A POSTROUTING -o ${OUT_DEVICE} -p tcp -d ${NEW_IP} --dport ${NEW_PORT} -j SNAT --to-source ${OUT_DEVICE_IP}


      Mais ça marche aussi si tu n'as qu'une seule carte et une seule adresse tel que:

      OUT_DEVICE=IN_DEVICE
      OUT_DEVICE_IP=LOCAL_IP

      INPUT et OUTPUT ne sont traversé que pour ce qui va a destination des processus locaux, seul FORWARD est traversé dans ton cas.

      ouch, it's openarena mumuse time, @+
  • # il manque un peu de contexte, mais...

    Posté par  . Évalué à 3.

    Déjà il faut s'assurer que le trafic que tu veux translater rentre bien par eth0 en PREROUTING (donc depuis le routeur proprement dit, ça ne marchera pas, il faut le faire depuis un hôte qui est connecté à eth0, directement ou pas). Il y a quelque part dans la doc netfilter un schéma du routage dans le noyau et des hooks netfilter associés, à accrocher jusqu'à ce qu'on le connaisse par coeur (je l'ai pas sous la main mais quelqu'un d'autre aura sûrement le lien).

    D'autre part, si tu veux que ça marche, il faut que ton routeur soit la passerelle utilisée quand l'hôte de destination va répondre (si l'hôte de destination est dans le même réseau que la source, il va tenter de répondre directement, et ça va poser problème). Si ce n'est pas le cas, il faut modifier la route correspondante sur l'hôte destination, ou prévoir aussi du SNAT sur le routeur.

    Enfin, je vois que tu veux que le trafic à destination de 10.1.0.1 accède à 10.1.0.2. On est plus dans le cas d'un REDIRECT que dans celui d'une translation, là... Ou alors il faut que tu fasse aussi un SNAT sur le routeur pour que les connexions aient l'air de venir de lui (ce qui n'est pas forcément ce que tu veux).

    Si tu veux faire un proxy transparent, utilise REDIRECT.

    Cela dit il est d'usage quand on a ce genre de souci de fournir un petit schéma simplifié afin qu'on ait une vue d'ensemble plutôt que d'imaginer ce qui pourrait éventuellement poser problème dans tel ou tel cas ;-)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.