Transférer le trafic du périphérique TUN (backend C ++) vers la passerelle par défaut

10

Le problème suivant n'est qu'un morceau de la solution la plus importante avec laquelle j'ai un problème. Tous les autres éléments semblent fonctionner jusqu'à présent, je vais donc essayer de décrire une toute petite pièce avec laquelle j'ai un problème.

J'ai une machine Linux, avec tun0 (interface de tunneling) et eth0 (qui est ma passerelle par défaut vers Internet).

Objectif: mon objectif est de recevoir les paquets entrants de tun0 et de les transmettre à la passerelle par défaut. Donc, en fait, un cas NAT assez simple, où je veux "partager" Internet avec tun0 qui simule une interface physique.

Tun a été créé en utilisant

sudo openvpn --mktun --dev tun0 --user USER
sudo ip addr add 10.2.0.1/24 dev tun0
sudo ip link set tun0 up

Je l'ai donc opérationnel, je peux le cingler, etc. En outre, j'ai une application C ++, qui s'attache à ce périphérique TUN, peut lire et écrire dessus. (fti: voici un tutoriel que j'ai suivi: http://backreference.org/2010/03/26/tuntap-interface-tutorial/ )

J'ai vidé une requête ICMP (ping) correcte faite à 8.8.8.8 dans le tableau d'octets en C ++. Maintenant, en utilisant mon programme, je l'écris sur le périphérique tun0. La demande ICMP a

  • source (10.2.0.10) - pour que le noyau connaisse la route de retour (le même sous-réseau)
  • destination (8.8.8.8) - DNS de Google
  • somme de contrôle correcte, etc. (dans Wireshark / TShark, il apparaît correctement sur tun0)

Ensuite, j'ai les itinéraires suivants:

iptables -F # flush
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface tun0 -j ACCEPT

Et ici, je suis coincé :( Le paquet n'est pas transmis au gw par défaut (tshark le voit uniquement sur tun0 tel qu'il est reçu, ce qui, je suppose, est correct)

Qu'est-ce qui manque? Peut-être une autre approche (mais cela doit être fait en utilisant un périphérique tun et je dois pouvoir le r / w). Information additionnelle:

  • le transfert est activé (/ proc / sys / net / ipv4 / ip_forward)
  • 8.8.8.8 est accessible via eth0 (depuis le local)
  • la passerelle par défaut est correcte (du FAI via eth0)
  • j'ai essayé de désactiver rp_tables (echo 0> / proc / sys / net / ipv4 / conf / eth5 / rp_filter)
  • et plein d'autres...

Merci d'avance pour tout indice!

Marcin Górski
la source
Je sais que cela fait plus d'un an, mais avez-vous obtenu quelque chose avec ça? J ai exactement le même problème.
hplbsh

Réponses:

1

Une solution alternative consisterait à utiliser bridge.Par conséquent, vous pouvez relier votre tun0 à eth0 et il n'est pas nécessaire de définir nat ou ip sur tun0.

Commandes de configuration d'un pont:

# brctl addbr br0
# brctl addif br0 eth0 tun0

www.tldp.org/HOWTO/BRIDGE-STP-HOWTO/set-up-the-bridge

Pour utiliser brctl, vous devez installer le bridge-utilspackage.
Si votre distribution est Ubuntu:aptitude install bridge-utils

Arash
la source
1

J'ai récemment rencontré ce problème (en suivant la même mention d'article dans la question) et après avoir bidouillé un peu, j'ai trouvé que la commande suivante permettait le transfert local des paquets pour le périphérique tun.

echo 1 > /proc/sys/net/ipv4/conf/tun0/accept_local

Je sais que c'est très tard, je poste juste ici pour que toute personne confrontée au même problème puisse avoir une sorte d'aide.

Swarup Sengupta
la source