Inoltro del traffico dal dispositivo TUN (backend C ++) al gateway predefinito


10

Il seguente problema è solo un pezzo della soluzione più grande con cui ho un problema. Tutti gli altri elementi sembrano funzionare finora, quindi proverò a descrivere un pezzo molto piccolo con cui ho problemi.

Ho una macchina Linux, con tun0 (interfaccia tunneling) ed eth0 (la strega è il mio gateway predefinito per Internet).

Obiettivo: il mio obiettivo è ricevere pacchetti in arrivo da tun0 e inoltrarli al gateway predefinito. Quindi, in realtà, un caso NAT abbastanza semplice, in cui voglio "condividere" Internet con Tun0 che falsa l'interfaccia fisica.

Tun è stato creato usando

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

Quindi ho installato e funzionante, posso eseguire il ping, ecc. Inoltre, ho un'applicazione C ++, che si collega a questo dispositivo TUN, in grado di leggere e scrivere su di esso. (fti: ecco un tutorial che ho seguito: http://backreference.org/2010/03/26/tuntap-interface-tutorial/ )

Ho scaricato alcune richieste ICMP (ping) corrette fatte a 8.8.8.8 nell'array di byte in C ++. Ora, usando il mio programma, lo scrivo sul dispositivo tun0. Richiesta ICMP ha

  • source (10.2.0.10) - così il kernel conosce la route back (la stessa sottorete)
  • destinazione (8.8.8.8) - DNS di Google
  • checksum corretto ecc. (in Wireshark / TShark appare correttamente su tun0)

Quindi, ho i seguenti percorsi:

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

E qui sono bloccato :( Il pacchetto non viene inoltrato al gw predefinito (tshark lo vede solo su tun0 come ricevuto, suppongo sia corretto)

Cosa manca? Forse un approccio alternativo (ma deve essere fatto usando il dispositivo tun, e devo essere in grado di r / w ad esso). Informazioni addizionali:

  • l'inoltro è abilitato (/ proc / sys / net / ipv4 / ip_forward)
  • 8.8.8.8 è raggiungibile tramite eth0 (da locale)
  • il gateway predefinito è corretto (dall'ISP tramite eth0)
  • ho provato a spegnere rp_tables (echo 0> / proc / sys / net / ipv4 / conf / eth5 / rp_filter)
  • e molti altri...

Grazie in anticipo per eventuali suggerimenti!


So che ha più di un anno, ma sei arrivato da qualche parte con questo? Ho esattamente lo stesso problema.
hplbsh,

Risposte:


1

Una soluzione alternativa sarebbe usare bridge. Quindi puoi collegare il tuo tun0 con eth0 e non c'è bisogno di nat o impostare ip su tun0 hai appena messo gli IP dalla stessa sottorete di eth0 e lo stesso gateway che stai usando in questo momento sulle interfacce del tunnel dei client.

Comandi per impostare un bridge:

# brctl addbr br0
# brctl addif br0 eth0 tun0

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

Per usare brctl devi installare il bridge-utilspacchetto.
Se la tua distribuzione è Ubuntu:aptitude install bridge-utils


1

Di recente ho riscontrato questo problema (seguendo lo stesso articolo menzionato nella domanda) e dopo aver frugato un po ', ho scoperto che il seguente comando abilita l'inoltro locale dei pacchetti per il dispositivo tun.

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

So che è molto tardi, sto solo postando qui in modo che chiunque abbia lo stesso problema possa avere un qualche tipo di aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.