Encaminhando tráfego do dispositivo TUN (back-end C ++) para o gateway padrão

10

O seguinte problema é apenas um pedaço da solução maior com a qual tenho um problema. Todos os outros elementos parecem funcionar até agora, então tentarei descrever uma peça muito pequena com a qual tenho problemas.

Eu tenho uma máquina Linux, com tun0 (interface de encapsulamento) e eth0 (que é o meu gateway padrão para a Internet).

Objetivo: meu objetivo é receber pacotes recebidos de tun0 e encaminhá-los para o gateway padrão. Então, na verdade, um caso NAT bastante simples, onde eu quero "compartilhar" a internet com o tun0, que falsifica a interface física.

Tun foi criado 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

Então, eu o tenho instalado e funcionando, posso executar o ping etc. Além disso, tenho o aplicativo C ++, que é anexado a este dispositivo TUN, que pode ler e gravar nele. (fti: aqui está um tutorial que eu segui: http://backreference.org/2010/03/26/tuntap-interface-tutorial/ )

Despejei alguma solicitação correta de ICMP (ping) feita para 8.8.8.8 na matriz de bytes em C ++. Agora, usando o meu programa, escrevo-o no dispositivo tun0. Solicitação do ICMP

  • source (10.2.0.10) - para que o kernel conheça a rota de volta (a mesma sub-rede)
  • destination (8.8.8.8) - DNS do Google
  • soma de verificação correta etc. (no Wireshark / TShark aparece corretamente no tun0)

Então, eu tenho as seguintes rotas:

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

E aqui estou eu preso :( Pacote não é encaminhado para o gw padrão (tshark vê apenas no tun0 como recebido, o que eu acho que está correto)

O que está a faltar? Talvez alguma abordagem alternativa (mas isso tenha que ser feito usando o dispositivo tun, e eu precise ser capaz de r / w). Informação adicional:

  • o encaminhamento está ativado (/ proc / sys / net / ipv4 / ip_forward)
  • 8.8.8.8 é alcançável através de eth0 (do local)
  • o gateway padrão está correto (do ISP via eth0)
  • Eu tentei desativar rp_tables (eco 0> / proc / sys / net / ipv4 / conf / eth5 / rp_filter)
  • e muitos outros...

Agradecemos antecipadamente por todas as dicas!

Marcin Górski
fonte
Eu sei que isso tem mais de um ano, mas você chegou a algum lugar com isso? Eu tenho exatamente o mesmo problema.
Hplbsh # 29/13

Respostas:

1

Uma solução alternativa seria usar bridge. Assim, você pode conectar seu tun0 com eth0 e não há necessidade de nat ou configurar ip em tun0; basta colocar IPs da mesma sub-rede de eth0 e do mesmo gateway que você está usando agora nas interfaces de túnel dos clientes.

Comandos para configurar uma ponte:

# brctl addbr br0
# brctl addif br0 eth0 tun0

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

Para usar o brctl, você deve instalar o bridge-utilspacote.
Se sua distribuição é o Ubuntu:aptitude install bridge-utils

Arash
fonte
1

Recentemente, encontrei esse problema (seguindo o mesmo artigo mencionado na pergunta) e, depois de mexer um pouco, descobri que o comando a seguir habilita o encaminhamento local dos pacotes para o dispositivo tun.

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

Sei que é muito tarde, estou postando aqui para que qualquer pessoa que enfrenta o mesmo problema possa ter algum tipo de ajuda.

Swarup Sengupta
fonte