IPTables - DNAT somente se o destino não estiver escutando

1

Eu tenho as interfaces eth0 (o acesso à internet) e tap_vpn0 (interface vpn tap, com rede de 192.168.110.0/24). O que eu quero, é para DNAT todas as conexões de entrada através de eth0 para 192.168.110.2 mas SOMENTE se não houver serviço de escuta no próprio servidor (principalmente, o servidor VPN em si, mas basicamente qualquer outro serviço aparecendo em netstat -plunt , incluindo realmente SSH).

Por enquanto, o que estou fazendo é iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 443 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 5555 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 992 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 4500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1701 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 54700 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 63486 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 68 -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

anotando uma longa lista de exceções estáticas. Mas existe uma maneira de dizer ao IPTables para não DNAT no caso de a porta não ser fechada no host atual, se o pacote for tratado localmente com sucesso? Então, se por exemplo eu tiver uma porta aleatória de 9988 aberta posteriormente no servidor, não preciso adicionar outra exceção como iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 9988 -j ACCEPT , mas ela não será apenas DNAT?

    
por Evengard 19.03.2017 / 18:23

1 resposta

0

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!

    
por 19.03.2017 / 20:18