A obtenção do tráfego NAT voltou à interface correta

1

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.

    
por mroek 09.11.2016 / 16:59

0 respostas