J'ai un problème intéressant pour lequel j'espère que quelqu'un pourra aider. J'essaie de créer un tunnel GRE entre 2 routeurs (sous Linux Ubuntu 12.04) et de transmettre le trafic entre 2 sous-réseaux via ce tunnel.
Ce que j'essaie de réaliser peut être simplifié par la configuration suivante, imaginez 4 ordinateurs (comme le montre le schéma suivant), 2 sont des routeurs, 2 des PC connectés à une passerelle ...
|----------------------| |----------------------|
SUBA--+--ETH0 ETH1--+----------- --+--ETH0 ETH1--+--SUBB
|----------------------| |----------------------|
PC1 as router PC2 as router
Maintenant, si le diagramme est faux, laissez-moi vous l'expliquer. J'ai 2 PC configurés en tant que routeurs ( ip_forwarding=1, proxy_arp=1
). Chaque PC en tant que routeur a 2 interfaces et chaque interface a sa propre adresse IP.
Côté gauche du diagramme (PC1 en tant que routeur)
SUBA=192.165.13.25
- ETH0 sur PC1 en tant que routeur
=192.165.13.254
(GW de SUBA) - ETH1 sur PC1 en tant que routeur
= 192.168.6.40
(adresse fournie par le fournisseur de service) -> il s'agit du GW par défaut du PC1 en tant que routeur.
Côté droit du diagramme (PC2 en tant que routeur)
SUBB=192.160.20.25
- ETH0 sur PC2 en tant que routeur
=192.168.20.41
(adresse fournie par le fournisseur de service) - ETH1 sur PC2 en tant que routeur
=192.160.20.254
(GW de SUBB)
Le routage est assez simple à chaque extrémité et peut être décrit par des mots.
Sur PC1 en tant que routeur:
- pour accéder à 192.165.13.0/24, utilisez eth0
- pour accéder à 192.168.6.0/24, utilisez eth1
- GW par défaut est 192.168.6.40 => il s'agit de eth1
Sur PC2 en tant que routeur:
- pour accéder au 192.160.20.0/24, utilisez eth1
- pour accéder au 192.168.20.0/24, utilisez eth0
- GW par défaut est 192.168.20.41 => c'est eth0
Dans cette configuration, SANS RÈGLES IPTABLES SUPPLÉMENTAIRES, tout le monde peut cingler tout le monde. Et je vais bien. SUBA peut faire un ping sur SUBB et l'inverse est également acceptable.
Maintenant, je crée un tunnel GRE entre PC1 en tant que routeur eth1 et PC2 en tant que routeur eth0 tunnel sur PC1 en tant que routeur possède un tunnel GRE avec local = 192.168.6.40
et remote = 192.168.20.41
et bien sûr, j'ai la symétrie sur l'autre routeur avec tunnel sur PC2 en tant que routeur a GRE tunnel avec local = 192.168.20.41
et distant = 192.168.6.40
...
Je modifie le routage (ajoute une règle) sur PC2 en tant que routeur, juste pour forcer le trafic dans le tunnel: pour accéder, 192.165.13.0/24
utilisez le tunnel GRE.
Rien d'autre n'est fait.
Maintenant, SUBB essaie d'envoyer une requête ping à SUBA et cela ne fonctionne pas, ne fonctionne pas non plus d'essayer d'envoyer une requête ping à GW de SUBA (qui est la deuxième interface de PC1 en tant que routeur)
Voici ce que je vois à l'aide de wireshark ou de tcpdump:
- Le trafic pénètre dans l'interface de tunnel sur PC2 en tant que routeur
- Le trafic sort de l'interface de tunnel sur le PC1 en tant que routeur
- Le trafic n'arrive jamais à l'interface eth0 de PC1 en tant que routeur.
J'ai donc approfondi et ajouté plusieurs règles dans les tables IP pour voir ce qui se passait:
chaque requête ping est comptée dans:
mangle prerouting
nat prerouting
Mais le ping n’est compté ni dans mangle forward (si on essaie de le transmettre à SUBA) ni dans mangle input. Il semble que le noyau élimine silencieusement le paquet dans le routage et je ne sais pas pourquoi. À mon avis, je ne devrais pas avoir à modifier iptables car je n'en avais pas besoin avant la création des tables GRE ...
Toute aide sur ce qui pourrait se passer, comment faire en sorte que le noyau rapporte le paquet ou la raison pour laquelle il est jeté serait hautement appréciée.