Em uma placa customizada (rodando um kernel 4.x), eu tenho duas interfaces físicas de ethernet e um modem de rádio que me dá uma interface ppp. O iproute2 foi instalado e estou usando o nftables (não o iptables).
Meu problema é que eu quero encaminhar o tráfego UDP específico (para as portas 41000-41002) chegando em ppp0 ou eth0 para um host específico que fica em eth1. O encaminhamento funciona como deveria, mas não consigo fazer com que o tráfego de retorno funcione corretamente. Veja um exemplo de como eu configuro isso:
eth0 has IP 192.168.10.10
eth1 has IP 192.168.100.10
ppp0 has IP 10.10.10.10
O host externo para o qual desejo enviar tráfego (e retornar o tráfego), tem o IP 192.168.100.1 e está fisicamente conectado à mesma rede que a eth1.
Agora, a configuração nftables é assim:
table ip firewall {
chain incoming {
type filter hook input priority 0; policy drop;
ct state established,related accept
iifname "lo" accept
icmp type echo-request accept
tcp dport { ssh} accept
}
chain prerouting {
type nat hook prerouting priority 0; policy accept;
iifname "ppp0" udp dport 41000-41002 dnat 192.168.100.1
iifname "eth0" udp dport 41000-41002 dnat 192.168.100.1
}
chain postrouting {
type nat hook postrouting priority 100; policy accept;
oifname != "lo" masquerade
}
}
Minhas regras de roteamento para o iproute2 são assim:
0: from all lookup local
1000: from 192.168.100.1 lookup ppproute
2000: from 10.10.10.10 lookup ppproute
32766: from all lookup main
32767: from all lookup default
E a tabela ppproute contém apenas uma rota padrão sobre ppp0:
default dev ppp0 scope link
Com essa configuração, tudo funcionará corretamente se o tráfego de entrada chegar por cima de ppp0. Os pacotes são reescritos corretamente pelo nftables / netfilter e saem da eth1. O tráfego de retorno atinge a regra 1000 e sai de volta para o remetente.
Se o tráfego chegar através de eth0, ele também atingirá o host em 192.168.100.1 como deveria, mas o tráfego de retorno também será roteado de volta pelo ppp0, o que é um problema meu.
Eu procurei por uma solução, e ela provavelmente me encarou, mas não consegui resolver isso. Tenho certeza que há uma maneira simples de consertar isso, então agora eu espero que alguém seja gentil a ponto de me ajudar com isso. Eu sei que deveria ter encontrado uma solução adequada para mim, mas de alguma forma estou sentindo falta disso.