Przekazywanie ruchu z urządzenia TUN (backend C ++) do bramy domyślnej

10

Poniższy problem to tylko część większego rozwiązania, z którym mam problem. Wydaje się, że wszystkie inne elementy działają do tej pory, więc postaram się opisać bardzo mały kawałek, z którym mam problem.

Mam maszynę linuxową z tun0 (interfejs tunelowania) i eth0 (która jest moją domyślną bramą do Internetu).

Cel: moim celem jest otrzymywanie pakietów przychodzących z tun0 i przekazywanie ich do domyślnej bramy. Właściwie dość prosty przypadek NAT, w którym chcę „dzielić” internet z tun0, który podrabia fizyczny interfejs.

Tun został utworzony przy użyciu

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

Więc mam to uruchomione, mogę pingować itp. Ponadto mam aplikację C ++, która podłącza się do tego urządzenia TUN, może czytać i pisać na nim. (fti: oto samouczek, który obserwowałem: http://backreference.org/2010/03/26/tuntap-interface-tutorial/ )

Zrzuciłem poprawne żądanie ICMP (ping) złożone do 8.8.8.8 do tablicy bajtów w C ++. Teraz, używając mojego programu, piszę go na urządzeniu tun0. Wniosek ICMP ma

  • source (10.2.0.10) - więc jądro zna trasę powrotną (ta sama podsieć)
  • miejsce docelowe (8.8.8.8) - DNS Google
  • poprawna suma kontrolna itp. (w Wireshark / TShark pojawia się poprawnie na tun0)

Następnie mam następujące trasy:

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

I tutaj utknąłem :( Pakiet nie jest przekazywany do domyślnego gw (tshark widzi go tylko na otrzymanym tun0, co wydaje mi się poprawne)

Czego brakuje? Może jakieś alternatywne podejście (ale trzeba to zrobić za pomocą urządzenia tun i muszę mieć możliwość r / w). Dodatkowe informacje:

  • przekazywanie jest włączone (/ proc / sys / net / ipv4 / ip_forward)
  • 8.8.8.8 jest osiągalny przez eth0 (z lokalnego)
  • domyślna brama jest poprawna (od ISP przez eth0)
  • próbowałem wyłączyć rp_tables (echo 0> / proc / sys / net / ipv4 / conf / eth5 / rp_filter)
  • i wiele innych...

Z góry dziękuję za wszelkie wskazówki!

Marcin Górski
źródło
Wiem, że to ma ponad rok, ale czy udało ci się to osiągnąć? Mam dokładnie ten sam problem.
hplbsh

Odpowiedzi:

1

Alternatywnym rozwiązaniem byłoby użycie bridge. Więc możesz zmostkować swój tun0 z eth0 i nie ma potrzeby nat lub ustawiania ip na tun0, po prostu umieszczasz adresy IP z tej samej podsieci eth0 i tej samej bramy, której używasz teraz na interfejsach tunelowych klientów.

Polecenia do konfiguracji mostu:

# brctl addbr br0
# brctl addif br0 eth0 tun0

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

Aby użyć brctl, musisz zainstalować bridge-utilspakiet.
Jeśli twoją dystrybucją jest Ubuntu:aptitude install bridge-utils

Wysypka
źródło
1

Niedawno natknąłem się na ten problem (po tej samej wzmiance w artykule w pytaniu) i po lekkim kręceniu się, okazało się, że następujące polecenie umożliwia lokalne przekazywanie pakietów dla urządzenia tun.

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

Wiem, że jest bardzo późno, po prostu piszę tutaj, aby każdy, kto boryka się z tym samym problemem, mógł uzyskać jakąś pomoc.

Swarup Sengupta
źródło