O FTP não funciona corretamente quando conectado ao OpenVPN

1

Estou conectado a um servidor OpenVPN e gostaria de listar todos os arquivos em um servidor FTP.

ftp> ls
500 I won't open a connection to 10.125.1.20 (only to 31.x.x.100)
ftp: bind: Address already in use
ftp> 

A interface tun tem o IP 10.125.1.20 e parece que meu cliente FTP (que é o comando ftp no Linux) reporta esse IP para o servidor FTP e não o IP fornecido pelo servidor OpenVPN.

Posso fazer algo com o encaminhamento do iptables para que ele funcione?

    
por Rox 27.12.2014 / 16:39

1 resposta

1

Parece que você está executando o seu cliente FTP em um host que está conectado a um servidor OpenVPN e seu tráfego é roteado dentro da VPN (portanto, para o mundo externo, seu endereço IP de origem é o da interface externa do seu servidor OpenVPN).

É verdade?

Se não .... por favor, nos dê detalhes.

Se sim, o problema se relaciona exatamente com a "caixa" do OpenVPN que:

  • está NATting corretamente suas conexões IP "padrão" (e, de fato, você é capaz de se conectar com sucesso ao servidor FTP remoto)

  • é NÃO corretamente NATting o protocolo FTP (que, infelizmente, não é muito compatível com NAT e, para ser NATted, requer tratamentos especiais).

Para resolver seu problema, você deve garantir que o módulo do kernel correto esteja carregado na sua caixa NAT (OpenVPN). No meu Ubuntu (e provavelmente também no CentOS 6):

 # modprobe nf_conntrack_ftp

Esse módulo observará cuidadosamente todo o tráfego que flui pela conexão de "controle" por FTP (aquele que você pode estabelecer, autenticar e "iniciar" transferências de arquivos) para verificar quais portas cliente seu cliente FTP declarou usar para transferências de arquivos e "controlar" apropriadamente a conexão de controle (para "falsificar" essas portas, impondo as de caixa NAT).

Em outras palavras:

  • sem os módulos acima:
    • 1) O cliente FTP estabelece uma conexão FTP com o servidor remoto;
    • 2) O cliente de FTP deseja iniciar uma transferência de arquivos (um simples "ls"). Como tal ...
    • 3) ... Cliente FTP "abre" uma porta TCP para que o servidor FTP se conecte de volta a essa porta para transmitir o conteúdo;
    • 4) ... cliente FTP "avisa" servidor FTP qual porta foi aberta, usando a conexão de controle estabelecida no ponto 1)
    • 5) infelizmente, sem "tratamento especial", seu servidor FTP remoto, que está lendo / gravando corretamente ao longo da conexão estabelecida no ponto 1), recebe o par IP / PORT especificado na etapa 4) que contém seu "private" Endereço IP.
    • 6) para que o servidor FTP veja que a conexão de controle vem de um IP enquanto a conexão de dados está relacionada a um IP diferente. Ele (corretamente) não gosta de tal cenário, pois pode levar a algum cenário de reflexão / DDOS. Como tal, envia a mensagem de erro que você vê.

.

  • com o módulo acima carregado
    • tudo é como acima, exceto para a etapa 5. Essa etapa se tornou ...
    • 5) sua caixa NAT, graças ao módulo conntrack_ftp, abre uma própria porta TCP (na interface externa) e se prepara para receber de volta o tráfego de dados FTP nessas portas. Uma vez recebido, retransmite esse tráfego de volta para o seu cliente de FTP. Além disso, a "conexão de controle" é desconfigurada, portanto, para substituir o par IP / PORT enviado pelo seu cliente com o IP / PORT da caixa NAT.
    • ... e, graças a isso, tudo deve funcionar sem problemas :-) (... ou, pelo menos, espero).
por 27.12.2014 / 23:05