# [iptables] besoin d'aide -> PREROUTING (résolu)

## truc

Salut tout le monde:), bon et bien voila, il fallait que je m'y mette un jour, et c'set fait, je suis en train de faire joujou avec iptables, et durant tous mes tests, je rencontre une difficultée.

pour vous expliquer mon problème je met la politique pour tout à ACCEPT (et non j'ai pas peur,  j'suis dérrière un NAT t'façons..), ensuite, j'aimerai essayer de tranformer l'addresse de destination 140.211.166.170  (forums.gentoo.org) en 65.214.39.56 (www.ask.com)

Rien de très utile vous devez vous dire, mais qu'à cela ne tienne, c'est mon objectif, si c'est possible:)

je rajoute donc la règle

 iptables -t nat -A PREROUTING --destination 140.211.166.170 -j DNAT --to-destination 65.214.39.56

me voila donc avec:

```
# Generated by iptables-save v1.3.7 on Sat Jan 20 22:59:46 2007

*nat

:PREROUTING ACCEPT [2020:105752]

:POSTROUTING ACCEPT [3225:445378]

:OUTPUT ACCEPT [3225:445378]

-A PREROUTING -d 140.211.166.170 -j DNAT --to-destination 65.214.39.56 

COMMIT

# Completed on Sat Jan 20 22:59:46 2007

# Generated by iptables-save v1.3.7 on Sat Jan 20 22:59:46 2007

*filter

:INPUT ACCEPT [24771:10664130]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [24789:11304718]

COMMIT

# Completed on Sat Jan 20 22:59:46 2007
```

Pourtant que je vais sur https://forums.gentoo.org , bah je vous voir toujours VOUS, alors que je ne veux pas  :Wink:   :Laughing: 

Je me dit que ça n'est peut-être pas possible, que je peux changer l'addresse de destination des paquets passant au travers (à travers?) le pc, mais je ne peux sans doute pas modifier l'adresse de destination d'un paquet généré localement  :Confused: 

EDIT: ça semble bien être le problème, toute fois, si j'mets l'interface tun, que je l'active, lui attribue une IP etc.. (openvpn va le faire pour moi mais bon), si je fais un ping -I 10.8.0.1 140.211.166.170 ce coup si ça passe à travers, non? pourtant, ça ne semble pas mieu quand je regarde avec ethereal (et puis j'ai le temps de réponse qui correspond à quand je ping forums.gentoo, et non www.ask.com ) bref, une explication serait la beinvenue.

voili-voilou, j'ai besoin de vos lumière  :Smile: 

merci d'avance

----------

## loopx

Heu, je me demande si ta commande est bien la bonne ... Le DNAT, c'est du port forwarding en gros ... C'est pour faire des serveurs virtuelle ... C'est pas encore la meme chose je pense... le truc que tu utilise peut faire ceci : 

connection à ton serveur sur un port => ton serveur renvoye vers une autre ip et sur un autre port ...

Il y a moyen de modifier juste l'ip mais je pense que ca doit etre une autre commande (j'ai jamais essayé, je saurais pas vraiment t'aider). 

C'est un NAT simple ce que tu veux : tu as une partie inside et une partie outside. ton ip rentre dans le serveur par eth0 par exemple, il va voir qu'il faut appliquer le nat => le packet va sortir avec une autre ip... Pareil dans le sens inverse

Donc, je pense que tu confond  :Wink: 

----------

## truc

bah oui et non, oui je me trompe certainement, non, ça n'est pas du "vrai" NAT que je veux. 

J'essayais de n'alterer que les paquet ayant pour destination l'@ IP de fgo, rien d'autre, faire ça revient bien à faire du DNAT, j'ai déjà essayé de faire ça

iptables -t nat -A PREROUTING -p tcp --dport 80 --destination 140.211.166.170 -j DNAT --to-destination 65.214.39.56:80

mais toujours pas d'effet :/

 *http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-10.html wrote:*   

> you need to make sure that both future packets and reply packets pass through the NAT box (so they can be altered)

 

Je pense donc que mon problème vient définitivement de là, toutes fois je ne comprends pas pourquoi en ping'ant depuis l'autre interface (l'interface tunça ne fonctionne pas (avec la première règle iptables au moins..) car là ça traverse bien le pc pourtant non?

----------

## loopx

Le nat prendra dans ce cas ci effet quand ton packet arrive sur ton serveur en tant que INPUT (donc, que tu as visé ta passerelle) et vu qu'il le traverse en FORWARD ben la règle ne s'applique pas à lui

le nat que tu veux pas :

```

iptables -t nat -A PREROUTING -p tcp --dport 5555 -i eth0 -j DNAT --to 10.59.13.252:80

```

En fait, le truc que tu veux faire, je me demande si il y a moyen (ou alors, faudra regarder du coté de iproute2)...

Le nat static, j'y ai pensé, mais ca n'a rien avoir... Ton pc qui fait la requette via ta gw qui sera linux, il a un ip ... le packet passe à travers le serveur et ... ben son IP SOURCE est modifiée MAIS son adresse DE DESTINATION reste la meme => il va voir sur le bon site ... Il pourrais ne jamais revenir ton packet (si tu lui fourni une IP SOURCE qui n'est pas ton ip => le packet va aller chez quelqu'un d'autre et rien ne fonctionnera  :Very Happy: )

----------

## truc

j'suis désoléééé, je n'ai pas du être clair... j'ai effectivement dit que j'étais sur un NAT, mais c'était juste pour dire que j'avais pas peur de couper mon parefeu  :Laughing:  après tout j'en n'avais encore jamais mis...

Donc voila un peu plus précisément ce qui se passe:

routeur matériel -------------------------------mon pc

qui fait du NAT

Bon, y'a normalement un autre pc sur le réseau mais il est cassé..:/ mais là n'est pas le problème.. Nous nous situons donc au niveau de mon pc, donc pour l'instant, aucun paquet ne traverse mon pc. Je ne fais que de les générer localement. (et le nat se fait au niveau du routeur donc, je ne m'en occupe pas, et de même mon routeur n'est pas au courtant que j'ai changé la destination, donc normalement il doit faire son boulot sans trop se poser de question:/)

Bon voila pour les précisions. :Smile: 

sinon, juste en réaction à ce que tu dis:

 *Quote:*   

> Le nat prendra dans ce cas ci effet quand ton packet arrive sur ton serveur en tant que INPUT (donc, que tu as visé ta passerelle) et vu qu'il le traverse en FORWARD ben la règle ne s'applique pas à lui 

 

Euh, je débarque je sais, mais j'trouverai ça très bizarre, si le paquet arrive en FORWARD c'est qu'il est arrivé en INPUT quelque part, et que le routage dit tiens c'est pas pour moi ça, j'dois le faire suivre et là il passe en FORWARD. Donc à mon avis (mais je pourrai me tromper) tous les paquets arrivants sur le pc sont concernés par la règle (je n'ai pas précisé d'interface encore)

Bon cela dit, j'pense quej'vais utilisé l'howto sur openvz, histoire d'avoir un autre pc sur le réseau car là j'suis très limité:/

----------

## loopx

Ah non non non, pas du tout... Et si c'était comme tu dis (input et ensuite, forward), ben tout serait dropé au niveau de mon serveur (tout les packets sortant de mon réso passe par mon serveur) vu qu'en input, seulement 4 5 port d'ouvert ...

Un packet arrive sur ton routeur, il est associé à une "table?" :

- INPUT (pour les packets à destination du pc)

- OUTPUT (les packets sortant du pc lui meme !!! qui provienne de ce pc, pas ceux qui provienne d'un autre !)

donc, les deux du dessus ne concerne QUE ton serveur

- FORWARD (concerne les packets traversant ton serveur) => tout les packets que ton serveur va router (donc, tout les packets qui arrive et qui veulent joindre l'extérieur, tout les packets provenant d'un pc dans la gw est le serveur)

Donc en gros, pour un pc qui a comme gw ton serveur, si tu veux activer/desactiver certain port/ip ... tout ce fait au niveau du FORWARD. 

La preuve est que le serveur qui est à l'internat refuse l'acces en INPUT sur le port 22 SAUF pour les admins (comme moi :d), mais ca ne veux pas dire que le FORWARD du port 22 est bloqué !!! Ainsi, tout le monde à accès au port 22 d'une machine extérieur  :Smile: 

Donc, tout ca pour en arriver au fait que une règle s'appliquant à la table INPUT ne touchera aucunement au packet traversant le serveur (FORWARD) => le truc prérouting bazard (INPUT) ne fonctionnera pas du tout...

Ptit dessin, jsuis chaud la  :Very Happy: 

====INPUT=====> (SERVEUR) =====OUTPUT>

==============FORWARD===========>

Vois-tu la différence ? Le pakcet est soit INPUT, OUTPUT ou FORWARD mais jamais il prndre 2 valeurs en meme temps ou a la suite...

ping serveur => le packet va passer en INPUT pour le serveur

et le serveur va répondre un écho => le packet va sortir via le OUTPUT vers le pc qui ping

ping www.google.be (gw=serveur) => le ping traverse le serveur (FORWARD)

ensuite, le packet atterit chez google, qui répond par un echo => le packet repasse à nouveau a travers le serveur (FORWARD a nouveau, mais dans l'autre sens)

 :Smile: 

----------

## truc

 *Quote:*   

> Un packet arrive sur ton routeur, il est associé à une "table?" :
> 
> - INPUT (pour les packets à destination du pc)
> 
> - OUTPUT (les packets sortant du pc lui meme !!! qui provienne de ce pc, pas ceux qui provienne d'un autre !) 

 

alors déjà quand on rentre un nom invalide à la place de OUTPUT, INPUT et compagnie, ça nous dit "Unknown address family" donc, ça doit être famille d'adresse :/

Sinon, merci pour ce point qui m'avait pour ainsi dire vraiment échappé, merci notamment pour ton exemple avec ta fac. Je n'avais pas bien compris :/

Bon un ptit desperate housewives, et j'm'y remet;), mais donc en gros là mon problème c'est que mes paquets (générés donc localement) ne sont ni en INPUT ni en FORWARD, donc je ne peux pas grand chose pour eux? y'a yun moyen pour les faire arriver en INPUT ou FORWARD (comme par magie quoi  :Laughing:  ), mouais, sinon, il me faut une machine virtuelle!! : :Smile: 

----------

## loopx

 *truc wrote:*   

> , mais donc en gros là mon problème c'est que mes paquets (générés donc localement) ne sont ni en INPUT ni en FORWARD, donc je ne peux pas grand chose pour eux? y'a yun moyen pour les faire arriver en INPUT ou FORWARD (comme par magie quoi  ), mouais, sinon, il me faut une machine virtuelle!! :

 

si quand tu parle de "local", tu parles de ton serveur, ben oui, c'est bien de l'OUTPUT que tes packet utiliseront (ainsi que de l'INPUT pour les réponses)

Si tu veux t'amuser à tester les redirections (pour faire un serveur virtuelle par exemple) ben tu peux très bien faire une redirection comme dans le post que j'ai mis plus haut (ou il y a une ligne de code) mais avec la boucle local "lo". Je vois pas trop l'utilité en fait   :Question: 

```

iptables -t nat -A PREROUTING -p tcp --dport 80 -i lo -j DNAT --to 38.99.64.201:80

```

je viens de tester et ca marche pas donc ... ca fonctionne mieux si c'est la gateway qui le fait ...   :Laughing: 

faut regarder du coté d'un proxy ou alors, tester iproute2

EDIT: essaye ca pour les ping:

```

iptables -A INPUT -p icmp -m limit --limit 4/m -m state --state ! INVALID -j ACCEPT

```

----------

## truc

 *loopx wrote:*   

> si quand tu parle de "local", tu parles de ton serveur, ben oui, c'est bien de l'OUTPUT que tes packet utiliseront (ainsi que de l'INPUT pour les réponses)

  oui ça veut dire mon pc, (que je ne considère pas vraiment comme un serveur d'ailleurs  :Smile: 

 *Quote:*   

> Si tu veux t'amuser à tester les redirections (pour faire un serveur virtuelle par exemple) ben tu peux très bien faire une redirection comme dans le post que j'ai mis plus haut (ou il y a une ligne de code)

 ouais je pense que ça sera plus marrant.. car là j'suis vraiment limité :S Pour Openvz faut un noyau spécial, donc j'vais regarder aute chose (j'vais rechercher noter DOW sur la virtualisation  :Smile:   *Quote:*   

> mais avec la boucle local "lo". Je vois pas trop l'utilité en fait  

 euh, j'ai parlé de ça moi?   :Laughing: 

 *Quote:*   

> tester iproute2

 bah je l'ai en fait, mais (mis à part pour les tunnel peut-être) ce sont surtout des outils de consultation je crois:/

----------

## CryoGen

Je me suis servi du DNAT pour un hotel  :Smile: 

Dès que les clients voulaient envoyer des mails avec leurs portables, ils bloquaient sur leurs SMTP de leur propre FAI. Donc moi je choppai tous les paquets qui attaquent sur le port SMTP et un petit DNAT sur le smtp du FAI local  :Very Happy:  vraiment pratique    :Cool: 

Par contre je n'ai plus la commande en tête   :Embarassed: 

Je me demande si c'etait pas en POSTROUTING dans la table MANGLE mais je ne suis vraiment plus sur désolé :/

 *man iptables wrote:*   

>  mangle:
> 
>                   This  table  is  used  for  specialized packet alteration.  Until kernel 2.4.17 it had two built-in
> 
>                   chains: PREROUTING (for altering incoming packets before routing) and OUTPUT (for altering locally-
> ...

 

EDIT : ah non d'après le man c'est forcement en table NAT  pour le DNAT  :Embarassed: 

----------

## truc

 *CryoGen wrote:*   

> Je me suis servi du DNAT pour un hotel 
> 
> Dès que les clients voulaient envoyer des mails avec leurs portables, ils bloquaient sur leurs SMTP de leur propre FAI. Donc moi je choppai tous les paquets qui attaquent sur le port SMTP et un petit DNAT sur le smtp du FAI local  vraiment pratique   

 ahah, pas mal:) 

 *Quote:*   

> Par contre je n'ai plus la commande en tête  
> 
> Je me demande si c'etait pas en POSTROUTING dans la table MANGLE mais je ne suis vraiment plus sur désolé :/
> 
> 

 ça ne peut pas être en POSTROUTING car, tu ne peux pas faire tonroutage, puis  changer la destination, cat pour nous particulier, ça irai on  a une route par défaut et problème résolu, mais ça on avait une vraie table de routage ça ne serait pas possible :/ 

De toutes façons, iptables nous envoi bouler si on essaies de faire quelque chose du genre..

J'avais bien pensé à la table /"famille d'addresse" mangle, mais je n'ai pas trouvé comment changer l'adresse de destination :/ (je ne peux pas utiliser -j DNAT autre part qu'avec -t nat mais si il y a un autre moyen, je suis preneur !D

EDIT: aha t'as édité, et oui c'est bien mon problème:)

----------

## CryoGen

Sinon j'ai trouvé ca

http://www.linux-france.org/prj/inetdoc/guides/iptables-tutorial/dnattarget.html

À voir, ca à l'air d'ètre ce que tu cherches

----------

## truc

 *CryoGen wrote:*   

> Sinon j'ai trouvé ca
> 
> http://www.linux-france.org/prj/inetdoc/guides/iptables-tutorial/dnattarget.html
> 
> À voir, ca à l'air d'ètre ce que tu cherches

 

Merciiiii, bon alors déjà le texte commence par, "Notez que la cible DNAT est disponible uniquement dans les chaînes PREROUTING et OUTPUT de la table nat." Alors j'me dit, hein quoi? n'importe quoi, y'a pas de chaine OUTPUT dans la table nat (oui apparemment ça se dit table donc.. :Smile:  ) ==>je vérifie donc, et bah si y'en a une 

Trop kewl me dis-je donc,  (n'ayant qu'une route par défaut, ça ne va pas me géner t'façons, et au pire ça ne me gènerai que pour atteindre l'adresse du forum  :Smile:  )

```
iptables -t nat -A OUTPUT --destination 140.211.166.170 -j DNAT --to 65.214.39.56
```

je ping, et là j'ai le temps de réponse correspondant à l'adresse 65.214.39.56, donc je me rends sur http://140.211.166.170 et que vois-je? http://65.214.39.56   tadaaa, voila ni vu ni connu  :Very Happy: 

Bon bah voila qui résoud ce mistère merci bien:)

Faudra que je pense à lire la suite de l'article n'empèche, car il avait l'air pas mal:)

Merci à tous, j'vais pouvoir essayer de faire des trucs plus utils maintenant..  :Smile: 

EDIT: Avant de faire des trucs utils on peut aussi s'amuser un peu: iptables -t nat -A OUTPUT --destination 207.46.199.30 -j DNAT --to 38.99.64.201  :Laughing: 

EDIT2: rah les saligaud, ils en ont plein d'adresse IP   :Evil or Very Mad: 

----------

## loopx

lol

faudrais un truc qui check sur l'url  :Wink: 

----------

