Parece que iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT
faz o truque. -m socket
pela descrição faz exatamente isso - corresponde se existe algum soquete de aceitação para este pacote. O truque era usar a opção --nowildcard
, que eu omiti anteriormente - mesmo que a página man diga: "A correspondência de socket não aceita ouvintes com limite zero por padrão, já que os serviços locais poderiam interceptar tráfego que seria redirecionado." - que é exatamente o que eu precisava - que os serviços locais interceptem se houver algum disponível!
As regras resultantes são:
iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT
iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2
Eu deixei a porta 22 (ssh) para o caso de ela não funcionar como esperado - mas os testes parecem estar funcionando perfeitamente!