Weiterleiten des Datenverkehrs vom TUN-Gerät (C ++ - Backend) an das Standardgateway


10

Das folgende Problem ist nur ein Teil der größeren Lösung, mit der ich ein Problem habe. Alle anderen Elemente scheinen bisher zu funktionieren, daher werde ich versuchen, ein sehr kleines Stück zu beschreiben, mit dem ich Probleme habe.

Ich habe eine Linux-Maschine mit tun0 (Tunneling-Schnittstelle) und eth0 (was mein Standard-Gateway zum Internet ist).

Ziel: Mein Ziel ist es, von tun0 eingehende Pakete zu empfangen und an das Standard-Gateway weiterzuleiten. Also eigentlich ganz einfacher NAT-Fall, bei dem ich das Internet mit tun0 "teilen" möchte, was die physische Schnittstelle vortäuscht.

Tun wurde erstellt mit

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

Ich habe es also zum Laufen gebracht, kann es anpingen usw. Außerdem habe ich eine C ++ - Anwendung, die an dieses TUN-Gerät angeschlossen ist und von diesem lesen und darauf schreiben kann. (fti: Hier ist ein Tutorial, dem ich gefolgt bin: http://backreference.org/2010/03/26/tuntap-interface-tutorial/ )

Ich habe eine korrekte ICMP (Ping) -Anforderung für 8.8.8.8 in das Byte-Array in C ++ geschrieben. Jetzt schreibe ich es mit meinem Programm auf das tun0-Gerät. ICMP-Anfrage hat

  • source (10.2.0.10) - Kernel kennt also die Route zurück (dasselbe Subnetz)
  • Ziel (8.8.8.8) - DNS von Google
  • korrekte Prüfsumme usw. (in Wireshark / TShark erscheint es korrekt auf tun0)

Dann habe ich folgende Routen:

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

Und hier stecke ich fest :( Das Paket wird nicht an das Standard-GW weitergeleitet (tshark sieht es nur auf tun0 als empfangen, was ich denke, dass es korrekt ist)

Was fehlt? Vielleicht ein alternativer Ansatz (aber es muss mit einem Tun-Gerät gemacht werden, und ich muss in der Lage sein, darauf zu r / w). Zusätzliche Information:

  • Weiterleitung ist aktiviert (/ proc / sys / net / ipv4 / ip_forward)
  • 8.8.8.8 ist über eth0 erreichbar (von lokal)
  • Standard-Gateway ist korrekt (vom ISP über eth0)
  • Ich habe versucht, rp_tables auszuschalten (echo 0> / proc / sys / net / ipv4 / conf / eth5 / rp_filter)
  • und viele andere...

Vielen Dank im Voraus für Hinweise!


Ich weiß, das ist über ein Jahr alt, aber bist du damit irgendwohin gekommen? Ich habe genau das gleiche Problem.
hplbsh

Antworten:


1

Eine alternative Lösung wäre die Verwendung von bridge.So können Sie Ihr tun0 mit eth0 überbrücken, und es ist nicht erforderlich, nat oder IP auf tun0 zu setzen. Sie setzen nur IPs aus demselben Subnetz von eth0 und demselben Gateway, das Sie gerade auf den Tunnelschnittstellen der Clients verwenden.

Befehle zum Einrichten einer Brücke:

# brctl addbr br0
# brctl addif br0 eth0 tun0

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

Um brctl verwenden zu können, müssen Sie das bridge-utilsPaket installieren .
Wenn Ihre Distribution Ubuntu ist:aptitude install bridge-utils


1

Ich bin kürzlich auf dieses Problem gestoßen (nach dem gleichen Artikel, der in der Frage erwähnt wurde), und nachdem ich ein wenig herumgespielt hatte, stellte ich fest, dass der folgende Befehl die lokale Weiterleitung der Pakete für das Tun-Gerät ermöglicht.

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

Ich weiß, dass es sehr spät ist. Ich poste nur hier, damit jeder, der mit dem gleichen Problem konfrontiert ist, Hilfe bekommen kann.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.