Iptables: regra para aceitar tráfego com ip local, mas a partir da interface remota

1

Considere que temos um site público example.com resolvendo para 1.1.1.1 . O servidor web real está atrás de um roteador / firewall e está escutando na porta 8080 .

AconfiguraçãosimpleséaceitávelparausuáriosdaInternet,masnãoparaoutrosclientesnointervalo192.168.1.0.Umclienteem192.168.1.3nãopodeseconectara1.1.1.1:80.Temosoproblema NAT hairpinning (descrito também em wiki do mikrotik ).

Suponha que resolvemos o problema não configurando o roteador, mas com iptables no próprio servidor da web. Este comando instrui todos os pacotes de saída na porta 8080 a serem enviados via roteador:

iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8080 -j MARK --set-xmark 1
ip rule add fwmark 1 table natreflect
ip route add default via 192.168.1.1 table natreflect

A configuração acima resolve todos os clientes em 192.168 range, mas não os clientes em 192.168.1.2 em si.

Quando um cliente 192.168.1.2 deseja se conectar a 1.1.1.1:80 , ele envia um pacote como 192.168.1.2:34567->1.1.1.1:80 para o roteador. O roteador faz NAT e envia um pacote 192.168.1.2:34567->192.168.1.2:8080 para o servidor da Web (por exemplo, na interface eth0 ). Servidores da Web recebem este pacote. O pacote percorre as cadeias mangle.PREROUTING e nat.PREROUTING , mas não alcança mangle.INPUT (e a conexão não estabelece).

Qual é o problema? ( rp_filter está definido como 0 em todas as interfaces)

    
por Taha Jahangir 20.01.2018 / 09:26

1 resposta

1

Parece ser difícil para o servidor 192.168.1.2 aceitar que um pacote de entrada venha de seu próprio IP 192.168.1.2 mas do escopo link , não do escopo host , portanto, a partir de seu próprio IP, mas não de si mesmo. Isso parece um problema de roteamento para o qual pode ou não haver uma solução. Ainda é possível contornar essa situação para que nunca aconteça.

Para evitar essa situação, antes mesmo de ter o pacote inicial deixando o servidor web 192.168.1.2 e ir na linha, basta adicionar uma regra iptables sobre ele redirecionando uma conexão de si mesmo para 1.1.1.1:80 diretamente para o lugar certo: .

iptables -t nat -A OUTPUT -s 192.168.1.2 -d 1.1.1.1 -p tcp --dport 80 -j REDIRECT --to-ports 8080

Uma regra alternativa e equivalente (pelo menos em kernels recentes, talvez não em kernels antigos) seria:

iptables -t nat -A OUTPUT -s 192.168.1.2 -d 1.1.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2:8080

Ao adicionar esta regra, além das outras configurações, as conexões vindas de fora, da LAN e do servidor web se comportam da mesma forma: elas funcionam, mantêm o IP de origem e, em todos os casos, o IP de destino é% código%. A única desvantagem é ter que saber que há 192.168.1.2 .

    
por 23.01.2018 / 00:56

Tags