OVH Cloud OVH Cloud

Deux passerelles (Linux) et port forwarding...

18 réponses
Avatar
JKB
Bonjour à tous,

J'ai un petit problème avec une machine tournant sous Linux et
accédant à internet par deux passerelle. Je m'explique...

J'ai deux lignes ADSL, l'une publique attanquant la partie serveur
web, smtp, pop3s, imaps et j'en passe et l'autre dédiée à un
intranet. J'ai installé iproute2, configuré le bazar et je peux
accéder en ssh à chacune de mes deux interfaces réseaux par chacune
des deux IP publiques. Donc, ça marche. Le problème est le port
forwarding...

L'interface publique est connectée à un routeur et possède l'adresse
192.168.254.1 et je reroute un port sur mon serveur intranet
(publique:8000 -> intranet:8080). Cela fonctionne à merveille.
Maintenant, je dois router les ports 3000 et 3001 provenant de mon
routeur intranet connecté à ma passerelle sur l'adresse 192.168.1.1
vers les ports de mon serveur intranet 3000 et 3001. J'ai donc
rajouté une règle dans la table nat :

iptables -t nat -A PREROUTING -d 192.168.1.1 -j DNAT -p tcp --dport 3000
--to-destination 192.168.0.130

Cela me semble logique. Sauf que... Rien ne fonctionne. Si je
remplace -d 192.168.1.1 par -d 192.168.254.1 (adresse connectée à
mon routeur "public"), le port forwarding fonctionne. Je sèche. Une
idée ? J'ai lancé un tcpdump sur l'interface côté réseau local et
les paquets arrivant sur l'interface connectée à mon routeur
intranet sont incapables de passer ma passerelle. Ceux qui arrivent
sur le routeur "public" passent sans encombre...

Root kant:[/var/lib/iptables] > iptables -L -t nat -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 192.168.254.1 tcp dpt:8000 to:192.168.0.130:8080
DNAT tcp -- 0.0.0.0/0 192.168.1.1 tcp dpt:3000 to:192.168.0.130

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.0.0/24 0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Root kant:[/var/lib/iptables] >

Cordialement,

JKB

8 réponses

1 2
Avatar
JKB
Le 18-02-2005, à propos de
Re: Deux passerelles (Linux) et port forwarding...,
Guillaume écrivait dans fr.comp.reseaux.ip :
Salut JKB,

JKB a wroté :

Le problème a évolué. En fait, j'ai :

Internet 1 Internet 2
| |
--------- Linux ----------
|
Intranet

J'utilise iproute.


Question bête : pourquoi ? Iptables seul n'est-il pas suffisant ?
(je demande bêtement, je n'utilise que ce dernier et il me suffit :-S)


Parce qu'il y a deux passerelles, donc deux routes par défaut...

Si tu veux bien, j'aimerais bien résumer schématiquement tout ce dont
tu as besoin, pour être bien sûr de comprendre (ce qui va sans dire va
mieux en le disant ;), corrige-moi là ou j'ai mal compris STP . Soit :

- Intranet == ton LAN (réseau local)
- Sur ta linuxette, tu as :
eth0, ip 192.168.1.1 sur "Internet1"
eth1, ip 192.168.254.1 sur "Internet2"
eth2, ip 192.168.0.1 sur "intranet"


eth0: 192.168.254.1 qui va sur un modem routeur -> IP publique
eth2: 192.168.1.1 qui va sur un autre modem routeur -> IP publique pour
l'intranet
eth1: 192.168.0.128 qui donne sur mon LAN (avec mon serveur intranet en
192.168.0.130)


La table par défaut renvoie tout sur Internet 1
qui est NATé.


Donc de "Intranet" vers "Internet1" tout passe en NAT. Ok.


Non, c'est eth0/eth1 qui est NATé.

Le port 8000 d'Internet 1 passe sur Intranet:8080 sans
encombre.


De "Internet1:8000", tu PATes vers "Intranet:8080". Ok.


eth0:8000 -> eth1:8080.

Une table intranet (iproute) autorise l'accès en SSH d'Internet 2
sur la passerelle Linux


Pourquoi iproute t'est-il nécessaire ici ? Ne serait-il pas plus
simple de tout faire faire par iptables dans la table input ?


Non... Ce n'est pas possible.

et iptables transmet les ports 3000 et 3001
à Intranet. Sauf qu'au retour, les paquets provenant des ports
3000 et 3001, marqués par iptables (-j MARK dans mangle, ça
fonctionne) ignorent superbement la table intranet et ressortent
par Internet 1 !


... comme le précise la table par défaut qui NATte, sauf qu'il se
trompe de provenance, et fait le retour sur la mauvaise interface.
J'ai bon ? Et donc, pour ce "retour" de "Intranet" vers "Internet2"
en 3000/3001, tu ne pourrais pas ajouter une règle autorisant et
dirigeant explicitement ce retour en utilisant le flag "established,
related" d'iptables ?

Quelques autres petites questions :

La liaison vers "Internet2" te sert sans doute à une connexion
professionnelle vers un autre réseau local. Celui-ci a sans doute une
plage IP spécifique, que tu pourrais préciser en iptables pour
renvoyer vers la bonne interface, et t'affranchir d'ip route qui
visiblement te pose problème. Pourquoi ne pas procéder comme ça ?

Tu peux poster la sortie de # iptables -L et # ip route list _au_
_complet_ STP ?


Chain INPUT (policy DROP 545 packets, 72495 bytes)
pkts bytes target prot opt in out source destination
3661 740K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
11309 2159K ACCEPT all -- * * 0.0.0.0/0 192.168.254.1
262 43999 ACCEPT all -- * * 0.0.0.0/0 192.168.0.128
914 69272 ACCEPT tcp -- * * 0.0.0.0/0 192.168.1.1 tcp dpt:22

Chain FORWARD (policy ACCEPT 36239 packets, 27M bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 19041 packets, 11M bytes)
pkts bytes target prot opt in out source destination

ip route list
192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.1
192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.128
192.168.254.0/24 dev eth0 proto kernel scope link src 192.168.254.1
default via 192.168.254.254 dev eth0

ip route list table intranet
default via 192.168.1.254 dev eth2

Une idée ?


Cf. çi-dessus, et si je n'ai pas bien compris ton problème, je te
remercie de bien vouloir préciser.

Cordialement,



Ah mais moi aussi :).


JKB


Avatar
JKB
Le 18-02-2005, à propos de
Re: Deux passerelles (Linux) et port forwarding...,
Bruno Bonfils écrivait dans fr.comp.reseaux.ip :
JKB writes:


Une idée ?>


Tu as essaye de desactiver les rp_filter et autre machin plus ou moins
inutiles ?


Seulement "echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter"

JKB


Avatar
point
Bonjour,

Ton problème me dépasse largement, mais comme je suis tout ouïe, je vais
y apporter ma contribution en essayent d'éclaircir un peu.

Pour comprendre je me suis fait un petit schéma.

Donc:
Une machine linux: 3 carte réseaux.
avec:
eth0 d'ip 192.168.254.1 qui vas ver routeur nat internet 1
eth1 d'ip 192.168.0.128 intranet
eth2 d'ip 192.168.1.1 qui vas ver routeur nat internet 2

eth0 doit avoir comme passerelle l'ip privé du routeur net internet 1
et
eth2 doit avoir comme passerelle l'ip privé du routeur net internet 2

Si cela été comme marqué si dessus les deux passerelles entreraient en
conflit, a mois qu'il y est un règle sur l'adressage. Mais j'ai cru
comprendre que tu veux faire une règle sur les ports.

Entre eth0 et eth1 tu as un nat.
Et un dnat entre eth0:8000 et 192.168.0.130:8080 (la je suis pas certain
d'avoir tout compris)
(192.168.0.130 étend le serveur en intranet)

Entre eth2 et eth1: qu'es que tu as ? tu Nate ? tu routeur ?

Car tu veux que la communication fonctionne sur les port 3000 et 3001
entre internet 2 donc eth2 et le serveur intranet d'ip 192.168.0.130 via
eth1

Voila se que j'ai compris et aussi se que je n'ai pas compris!

De la compréhension naîtra la solution.

@+

JM
Avatar
Guillaume
Ainsi parla JKB en cette mémorable journée du vendredi 18 Février 2005
16:34 :

Re - ,

J'utilise iproute.
Question bête : pourquoi ?

Parce qu'il y a deux passerelles, donc deux routes par défaut...



Hm. Je n'avais pas bien compris, ça va mieux maintenant avec tes
précisions et un schéma sur papier (je ne vous le fais pas partager,
je ne suis pas très doué en ascii-art).

C'est vrai que c'est pointu ton truc... je me permets tout de même
quelques suggestions :

- Du temps de ipchains, l'ordre de passage des règles avait son
importance. Est-ce encore le cas dans iptables ? Si oui, as-tu essayé
de passer d'abord la règle conçernant le port 3000, et ensuite celle
sur le port 8080 ? Est-ce que dans ce cas le problème s'inverse ? Et
pour iproute pareil, l'ordre des instructions est-il important et
change-t-il quelque chose ?

- La plage IP de "Internet2" t'est-elle connue, ou est-tu contraint
de prendre en compte 0.0.0.0/0 ? Le routeur DSL transmet tout, ça
arrive sur eth2 où le DNAT prend le relais, mais si tu connais la
plage d'origine, tu pourrais la préciser en "source" dans ta table
PREROUTING, et faire correspondre la table de routage pour forcer
le retour via eth2 / le routeur "Internet2", donc sur la bonne
interface, puisque c'est en sortie qu'est le problème.

- As-tu essayé de détailler encore plus tes chaînes PREROUTING,
en précisant l'interface d'entrée du trafic (à défaut de pouvoir
préciser la plage IP) ? Si ça ne sert à rien à l'aller, ça
l'aiderait peut-être à retrouver son chemin au retour (on peut
rêver).


Bon courage.


--
Guillaume



Avatar
JKB
Le 18-02-2005, à propos de
Re: Deux passerelles (Linux) et port forwarding...,
point écrivait dans fr.comp.reseaux.ip :
Bonjour,

Ton problème me dépasse largement, mais comme je suis tout ouïe, je vais
y apporter ma contribution en essayent d'éclaircir un peu.

Pour comprendre je me suis fait un petit schéma.

Donc:
Une machine linux: 3 carte réseaux.
avec:
eth0 d'ip 192.168.254.1 qui vas ver routeur nat internet 1
eth1 d'ip 192.168.0.128 intranet
eth2 d'ip 192.168.1.1 qui vas ver routeur nat internet 2

eth0 doit avoir comme passerelle l'ip privé du routeur net internet 1
et
eth2 doit avoir comme passerelle l'ip privé du routeur net internet 2

Si cela été comme marqué si dessus les deux passerelles entreraient en
conflit, a mois qu'il y est un règle sur l'adressage. Mais j'ai cru
comprendre que tu veux faire une règle sur les ports.

Entre eth0 et eth1 tu as un nat.
Et un dnat entre eth0:8000 et 192.168.0.130:8080 (la je suis pas certain
d'avoir tout compris)
(192.168.0.130 étend le serveur en intranet)

Entre eth2 et eth1: qu'es que tu as ? tu Nate ? tu routeur ?


Rien. Je route par ma passerelle Linux.
eth2:3000 et 3001 -> 192.168.0.130:3000 et 3001
Et port d'origine eth1:192.168.0.130:3000 et 3001 sont censés être
redirigés sur eth2.

Tout le reste est bon ;-)

Cordialement,

JKB

Avatar
JKB
Le 18-02-2005, à propos de
Re: Deux passerelles (Linux) et port forwarding...,
Guillaume écrivait dans fr.comp.reseaux.ip :
Ainsi parla JKB en cette mémorable journée du vendredi 18 Février 2005
16:34 :

Re - ,

J'utilise iproute.
Question bête : pourquoi ?

Parce qu'il y a deux passerelles, donc deux routes par défaut...



Hm. Je n'avais pas bien compris, ça va mieux maintenant avec tes
précisions et un schéma sur papier (je ne vous le fais pas partager,
je ne suis pas très doué en ascii-art).

C'est vrai que c'est pointu ton truc... je me permets tout de même
quelques suggestions :

- Du temps de ipchains, l'ordre de passage des règles avait son
importance. Est-ce encore le cas dans iptables ? Si oui, as-tu essayé
de passer d'abord la règle conçernant le port 3000, et ensuite celle
sur le port 8080 ? Est-ce que dans ce cas le problème s'inverse ? Et
pour iproute pareil, l'ordre des instructions est-il important et
change-t-il quelque chose ?


L'ordre a une importance. Mais c'est le retour qui coince, lorsque
192.168.0.130 envoie un paquet sur le port 3000, il est routé par
eth0 et non par eth2 alors qu'il est bien marqué par la règle de la
table mangle...

- La plage IP de "Internet2" t'est-elle connue, ou est-tu contraint


Elle n'est pas connue...

de prendre en compte 0.0.0.0/0 ? Le routeur DSL transmet tout, ça
arrive sur eth2 où le DNAT prend le relais, mais si tu connais la
plage d'origine, tu pourrais la préciser en "source" dans ta table
PREROUTING, et faire correspondre la table de routage pour forcer
le retour via eth2 / le routeur "Internet2", donc sur la bonne
interface, puisque c'est en sortie qu'est le problème.


Non. J'ai essayé. Le problème est que la table iproute intranet est
superbement ignorée (j'ai loggué les sorties d'iptables), et c'est
pour cela que mes paquets sortent par eth0 !

- As-tu essayé de détailler encore plus tes chaînes PREROUTING,
en précisant l'interface d'entrée du trafic (à défaut de pouvoir
préciser la plage IP) ? Si ça ne sert à rien à l'aller, ça
l'aiderait peut-être à retrouver son chemin au retour (on peut
rêver).


Oui. Je pensais aussi que le problème venait d'un rebond sur eth2 (à
cause d'un problème de route dans la table intranet qui m'aurait
échappé). Mais forcer la source sur eth1 dans la table mangle ne
change rien.

Bon courage.


Merci, mais je désespère...

JKB




Avatar
Guillaume
Ainsi parla JKB en cette mémorable journée du samedi 19 Février 2005
09:44 :
Bon courage.


Merci, mais je désespère...


Bah non : je connais bien ce sentiment depuis que je m'intéresse
aux manchots, mais nécessité fait loi, et tu vas bien finir par
te dépanner :).

L'ordre a une importance. Mais c'est le retour qui coince, lorsque
192.168.0.130 envoie un paquet sur le port 3000, il est routé par
eth0 et non par eth2 alors qu'il est bien marqué par la règle de la
table mangle...


Il (0.130) renvoie un paquet, mais c'est toujours en réponse à une
requête extérieure.

- La plage IP de "Internet2" t'est-elle connue, ou est-tu contraint
Elle n'est pas connue...



Et c'est bien dommage, je l'avais plutôt compris comme un site
distant de la même entité, un MAN quoi.

Non. J'ai essayé. Le problème est que la table iproute intranet est
superbement ignorée (j'ai loggué les sorties d'iptables), et c'est
pour cela que mes paquets sortent par eth0 !


Hm... le retour du NAT se fait sur la mauvaise interface.

Bon, il reste toujours deux solutions, pour plier le truc :

1) Tu tagges les entêtes de paquets à l'entrée de ta linuxette avant
de les NATer vers ton serveur (comme le disait Bruno Bonfils), et au
retour tu les renvoies vers l'interface kivabien en te fiant à ces
tags.

2) Tu sépares les routeurs pour les dédier respectivement à chaque
ligne. Tu qui aimes les vieusetés, il ne te reste pas un bon vieux
486 des familles dans un coin, et deux cartes réseau ?

Allez, courage et bonne humeur !


--
Guillaume


Avatar
JKB
Le 19-02-2005, à propos de
Re: Deux passerelles (Linux) et port forwarding...,
Guillaume écrivait dans fr.comp.reseaux.ip :
Ainsi parla JKB en cette mémorable journée du samedi 19 Février 2005
09:44 :
Bon courage.


Merci, mais je désespère...


Bah non : je connais bien ce sentiment depuis que je m'intéresse
aux manchots, mais nécessité fait loi, et tu vas bien finir par
te dépanner :).

L'ordre a une importance. Mais c'est le retour qui coince, lorsque
192.168.0.130 envoie un paquet sur le port 3000, il est routé par
eth0 et non par eth2 alors qu'il est bien marqué par la règle de la
table mangle...


Il (0.130) renvoie un paquet, mais c'est toujours en réponse à une
requête extérieure.

- La plage IP de "Internet2" t'est-elle connue, ou est-tu contraint
Elle n'est pas connue...



Et c'est bien dommage, je l'avais plutôt compris comme un site
distant de la même entité, un MAN quoi.

Non. J'ai essayé. Le problème est que la table iproute intranet est
superbement ignorée (j'ai loggué les sorties d'iptables), et c'est
pour cela que mes paquets sortent par eth0 !


Hm... le retour du NAT se fait sur la mauvaise interface.

Bon, il reste toujours deux solutions, pour plier le truc :

1) Tu tagges les entêtes de paquets à l'entrée de ta linuxette avant
de les NATer vers ton serveur (comme le disait Bruno Bonfils), et au
retour tu les renvoies vers l'interface kivabien en te fiant à ces
tags.


Mais ils sont taggués !...

JKB



1 2