Em resumo
Pacotes que são lidos a partir de uma interface TUN, não são encontrados quando são gravados na mesma interface TUN.
Na íntegra
Cenário:
Em uma máquina com apenas 1 NIC (eth0) conectada à Internet, escrevi um aplicativo que lê pacotes IP da interface TUN; então pode:
- escreve o pacote sem qualquer alteração na mesma interface TUN
- bloquear pacote
- faça alterações no pacote (por exemplo, criptografe sua carga útil) e grave o pacote manipulado de volta na interface TUN.
Concluído:
Eu passei pelos seguintes passos:
- Eu corro meu programa. Aloca e instancia o dispositivo TUN e aguarda
para o dispositivo ser criado.
-
Então eu executo os seguintes comandos:
ifconfig tun0 up
ifconfig tun0 10.0.0.2
route add -net 0.0.0.0 netmask 0.0.0.0 dev tun0
echo 1 > /proc/sys/net/ipv4/ip_forward
-
Agora meu programa começa a ler os pacotes com sucesso (e imprime / registra seu conteúdo).
- Meu programa escreve o pacote sem qualquer alteração de volta ao dispositivo tun0
PROBLEMA :
Escreve o pacote de volta, não encontra o seu caminho de volta para ir, por exemplo, para a eth0 ou para a camada de aplicação. Por exemplo, quando eu executo um ping:
ping 4.2.2.4
e em outro terminal:
tshark -i tun0
Eu vejo que o tun0 vê o pacote de eco ICMP (também meu programa):
10.0.0.2 → 4.2.2.4 ICMP 84 Echo (ping) request id=0x14b1, seq=2/512, ttl=64
10.0.0.2 → 4.2.2.4 ICMP 84 Echo (ping) request id=0x14b1, seq=3/768, ttl=64
10.0.0.2 → 4.2.2.4 ICMP 84 Unknown ICMP (obsolete or malformed?)
Meu programa escreve de volta o pacote para tun0 e tshark
o vê (no snippet acima)
Mas a solicitação do ICMP não alcança eth0 para encontrar o caminho para 4.2.2.4
. IMHO há um problema com as regras de roteamento, mas não consegui descobrir como modificá-lo.
Qualquer comentário é bem-vindo,
Atenciosamente