Resumo do problema
Aqui está uma tabela de roteamento em um computador Linux:
root@computer:~# ip route show
default via 192.168.1.1 dev eth0
10.0.0.200 dev tun0 proto kernel scope link src 10.0.0.100
Os pacotes com um IP de destino de 1.2.3.5 enviados para tun0 neste computador não estão sendo enviados da eth0.
Descrição longa do que estou tentando construir
O objetivo deste projeto é dar um dos meus computadores (e mais deles em um momento posterior) um endereço IP público. Existem dois requisitos:
- Este computador está por trás de um NAT que eu não controle.
- Não quero que outros computadores da minha LAN precisem passar pela Internet (relativamente) lenta para acessá-la.
Arquitetura
Esta é a arquitetura com a qual estou trabalhando:
Computador:
- A: um computador aleatório na internet que deseja se conectar ao computador F.
- B: tem um IP extra (1.2.3.5) Eu quero rotear para F até E.
- C: fora do meu controle.
- D: meu roteador, ele tem uma rota estática: 1.2.3.5 --- > 192.168.1.3
- E: estabelece um SSH TUN com B, encaminha pacotes de entrada destinados a 1.2.3.5 para seu gateway padrão D.
- F: um servidor que eu quero que todos os outros computadores (ambos em minha LAN na internet) acessem por 1.2.4.5
Configuração
O encaminhamento de IP foi configurado em B, E, F com:
echo 1 > /proc/sys/net/ipv4/ip_forward
/etc/sysctl.conf foi modificado em E:
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
SSH TUN estabelecido em E com:
ssh -w 0:0 1.2.3.4
interface tun0 criada em E com:
ip link set tun0 up
ip addr add 10.0.0.100/32 peer 10.0.0.200 dev tun0
interface tun0 criada em B com:
ip link set tun0 up
ip addr add 10.0.0.200/32 peer 10.0.0.100 dev tun0
Agora posso efetuar o ping E de B com êxito:
ping 10.0.0.100
IP 1.2.3.5 removido da interface em B com:
ifconfig venet0: 1 0.0.0.0
rota adicionada a B com:
ip route add 1.2.3.5/32 via 10.0.0.100 dev tun0
IP adicionado à interface em F com:
ip addr add 1.2.3.5 dev eth0
Testes
O seguinte comando foi executado em A para testar o envio de pacotes:
netcat -u 1.2.3.5 4444
Os seguintes comandos foram executados em E para ver se os pacotes estavam sendo recebidos:
root@computer:~$ tcpdump -n -i tun0 port 4444
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
13:48:21.034003 IP 4.3.2.1.44312 > 1.2.3.5.4444: UDP, length 5
root@computer:~$ tcpdump -n -i eth0 port 4444
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
13:48:21.034061 IP 4.3.2.1.44312 > 1.2.3.5.4444: UDP, length 5
O seguinte comando foi executado em E:
root@computer:~# netcat -u 1.2.3.5 4444
test
Com o seguinte comando executado simultaneamente em F:
root@computer:~# nc -ul 4444
test
Problema
O problema que estou enfrentando é que um dos computadores (E) está recebendo pacotes IP para um determinado IP (1.2.3.5), mas não os encaminhando para seu gateway padrão.
Eu acredito que o que eu estou perdendo é um comando em E que irá encaminhar pacotes de entrada na interface tun0 para seu gateway padrão na interface eth0.
Alguém sabe qual comando posso estar faltando?