iptables / netfilter: “nf_nat_ftp” não está funcionando bem com kernels recentes do Linux

0

Estou enfrentando o seguinte problema com o kernel Linux 4.10-28-genérico, incorporado no Ubuntu-16.04.02-LTE. Minha máquina tem dois adaptadores ethernet, ou seja, os seguintes:

enp0s3: 198.168.56.2 (rede interna)
enp0s8: 172.22.181.41 (rede externa)

Na rede interna, conectada ao enp0s3, existe um servidor FTP e um servidor telnet que eu quero acessar do externo rede conectada através do enp0s8.
O modo FTP é solicitado para estar ativo.

Para realizar essa tarefa, eu uso as seguintes regras do iptables:

modprobe nf_conntrack_ftp  
modprobe nf_nat_ftp  
sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"  

## Masquerade settings
iptables -A POSTROUTING -t nat -o enp0s3 -j MASQUERADE
iptables -A POSTROUTING -t nat -o enp0s8 -j MASQUERADE  

## ftp rules
iptables -t nat -I PREROUTING  -p tcp -m tcp --dport 20         -i enp0s8 -j DNAT --to-destination 192.168.56.2:20 
iptables -t nat -I PREROUTING  -p tcp -m tcp --dport 21         -i enp0s8 -j DNAT --to-destination 192.168.56.2
iptables -t nat -I PREROUTING  -p tcp -m tcp --dport 1024:65535 -i enp0s8 -j DNAT --to-destination 192.168.56.2:1024-65535

## telnet rules
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 23 -i enp0s8 -j DNAT --to-destination 192.168.56.2'

Estas regras funcionam bem com o Ubuntu-10, que tem o kernel Linux 2.6.32-38-genérico, mas com a nova conexão de dados do kernel não pode ser estabelecida: quando o cliente emite o comando PORT, o servidor recebe o IP endereço da rede externa e não a interna. De acordo com o "netstat" rodando no lado do servidor, parece que o módulo "nf_nat_ftp" não está funcionando bem, isto é, ele não substitui o endereço IP do cliente (endereço externo) pelo da interface de entrada enp0s8, (endereço interno) antes encaminhando o comando para o servidor. Por esse motivo, o servidor fica preso tentando estabelecer uma conexão com o endereço IP externo (estado SYN).
Nenhum problema com o FTP trabalhando no modo passivo e com a conexão telnet também.

Você poderia me dar uma sugestão para superar esse problema? É uma regressão ou é esperado que eu mude as regras do iptables de acordo com alguns novos requisitos?

Obrigado antecipadamente!

Atenciosamente, Stefano

    
por Stefano 16.10.2017 / 11:07

1 resposta

1

Eu já respondeu em superuser.com

Os kernels mais recentes (> = 4.7) estão preterindo a atribuição de portas do módulo auxiliar automático em favor de regras explícitas.

Correção para obter o comportamento antigo:

echo 1 > /proc/sys/net/netfilter/nf_conntrack_helper

Melhor correção a longo prazo (exigindo mais trabalho, mas dando melhor controle):

See the CT target description in the iptables-extensions(8) man page for further information.'

e leia também este blog para exemplos:

link

NOTA IMPORTANTE: muitas de suas regras de FTP não fazem sentido (você precisa apenas da segunda regra). Por exemplo, não existe tal --dport 20 . Sempre. FTP ativo usa source porta 20, nunca destino porta 20. O nf_conntrack_ftp / nf_nat_ftp lida com tudo isso já. Não tente conexões relacionadas nat, é o trabalho do ajudante.

Se você estiver fazendo o firewall, nas regras de firewall ( filter not nat ) você só precisa do usual -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT (mas leia o blog sobre isso também para a solução de longo prazo). Talvez você não tenha colocado todas as suas regras ou simplesmente não use nenhum firewall?

    
por 22.10.2017 / 16:15