Iptables para permitir o recebimento de FTP

32

Quero permitir o tráfego FTP recebido.

CentOS 5.4:

Este é o meu /etc/sysconfig/iptablesarquivo.

# Generated by iptables-save v1.3.5 on Thu Oct  3 21:23:07 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [133:14837]
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --sport 20 -j ACCEPT
COMMIT
# Completed on Thu Oct  3 21:23:07 2013

Além disso, por padrão, o módulo ip_conntrack_netbios_n está sendo carregado.

#service iptables restart

Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]

Mas o problema não está nesse módulo, pois tentei descarregá-lo e ainda não tive sorte.

Se eu desativar o iptables, posso transferir meu backup de outra máquina para o FTP. Se o iptables estiver sendo aplicado, a transferência falhou.

Sendo Gokul
fonte

Respostas:

27

Seu servidor ftp precisa de um canal para transferir dados. Porta 21é usada para estabelecer a conexão. Portanto, para tornar possível a transferência de dados, você também precisará ativar a porta 20. Veja a seguinte configuração

Primeiro carregue o módulo a seguir para garantir que as conexões ftp passivas não sejam rejeitadas

modprobe ip_conntrack_ftp

Permitir conexões FTP na porta de 21entrada e saída

iptables -A INPUT  -p tcp -m tcp --dport 21 -m conntrack --ctstate ESTABLISHED,NEW -j ACCEPT -m comment --comment "Allow ftp connections on port 21"
iptables -A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 21"

Permitir porta FTP 20para conexões ativas de entrada e saída

iptables -A INPUT  -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"
iptables -A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow ftp connections on port 20"

Finalmente, permita o tráfego de entrada passivo de FTP

iptables -A INPUT  -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT -m comment --comment "Allow passive inbound connections"
iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment "Allow passive inbound connections"

Para mais informações sobre problemas de FTP e firewall, consulte: http://slacksite.com/other/ftp.html#active

Editar: adicionado NEWà regra de entrada da porta 21.

Valentin Bajrami
fonte
2
Esqueci de mencionar que --sport 1024: and --dport 1024:significa que estamos incluindo todas as portas no intervalo 1024:32535que são portas sem privilégios, o que significa que usuários sem acesso privilegiado podem usá-las para testar seus aplicativos.
Valentin Bajrami
@ Ser Gokul, está correto. Podemos controlar nosso servidor em quais portas ele deve escutar para conexões de clientes. No entanto, no modo passivo, devemos usar --sportum modo não privilegiado para problemas particulares de firewall e permitir que os clientes se conectem ao servidor.
Valentin Bajrami
2
Bem, você pode adicionar, NEW,ESTABLISHEDmas isso não deve importar. Uma conexão está sempre sempre em um NEWestado e, em seguida, salta para o RELATEDque indica que essa conexão está relacionada a uma conexão já permitida. Quando a conexão muda para o ESTABLISHEDestado, informa que uma conexão foi estabelecida nos dois lados (servidor / cliente). Você pode tentar -m state --state ....
Valentin Bajrami
1
O NEWfato realmente importa. Parece não funcionar sem ele.
Leandros
1
@ val0x00ff Não entendo a necessidade --sport 1024:. Por que a porta do cliente seria útil para a regra? Se ele se conectar de uma porta 80 às portas passivas do servidor, ele também deverá se conectar.
Yvan
15

Eu já vi regras tão extensas em vários blogs, etc., e me perguntei por que não usar simplesmente

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT

junto com o nf_conntrack_ftpmódulo. Isso é mais conciso e legível, o que geralmente é uma coisa boa, especialmente com firewalls ...

FWIW, parece que houve uma alteração no kernel 4.7, de modo que você precisa configurar net.netfilter.nf_conntrack_helper=1via sysctl(por exemplo, colocá-lo /etc/sysctl.d/conntrack.conf) ou usar

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp

(veja aqui para mais detalhes)

Jakob
fonte
1
As informações sobre o kernel 4.7 salvaram minha vida, estavam tentando por horas para que isso funcionasse. Um simples echo "1" > /proc/sys/net/netfilter/nf_conntrack_helpere tudo funciona como esperado.
Keeper
1
Ótimo! 4.7 foi um problema que não consegui resolver no Jessie kernel 4.9!
Arunas Bartisius
@Jakob há um problema com conexões RELACIONADAS que podem ser usadas para acessar outros serviços: home.regit.org/wp-content/uploads/2011/11/… e github.com/rtsisyk/linux-iptables-contrack-exploit
Yvan
6

Cliente FTP:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

SERVIDOR FTP:

lsmod | grep ftp
modprobe nf_conntrack_ftp
lsmod | grep ftp
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --dport 20 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024: --dport 1024: -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 21 -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 20 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -s 192.168.1.0/24 -d 192.168.1.0/24 -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Para alternar entre o modo passivo e ativo no lado do cliente

ftp> passive
Passive mode on.
ftp> passive
Passive mode off.
Sathish
fonte
3
Você definitivamente merece alguns votos positivos por isso. Esquecer de carregar o módulo nf_conntrack_ftp é uma fonte de dores de cabeça ao solucionar problemas de conexões FTP passivas e rastreamento de conexões de tabelas de ip. O uso deste módulo permite remover o tipo "NEW" para que essas portas sejam protegidas contra conexões arbitrárias sem que uma sessão FTP anterior seja estabelecida.
Ryan Griggs
5

Adicionar NEW corrigiu, acredito.

Agora, meu arquivo iptables fica assim ..

# Generated by iptables-save v1.3.5 on Thu Oct  3 22:25:54 2013
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [824:72492]

-A INPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Thu Oct  3 22:25:54 2013

Digitando como resposta, já que muitos caracteres não são permitidos nos comentários. Muito obrigado por sua ajuda.

Sendo Gokul
fonte
2
Legal, funcionou e feliz por ter apontado a direção certa. Marque sua própria resposta como resolvida para ajudar outras pessoas que buscam a resposta certa.
Valentin Bajrami
Acredito que haja um erro de digitação na resposta aceita. Acredito que --dport 20:65535está deixando todas as portas de 20 a 65535 abertas a partir de qualquer porta de origem entre 1024: 65535, o que deixa muitos serviços expostos que provavelmente não deveriam, a menos que explicitamente permitido. Eu acredito que o que se pretendia é--dport 1024:65535
itnAAnti
0

Se você precisar de conexões ativas e passivas e já aceitar ESTABLISHEDconexões, como:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

Então você só precisa abrir a porta 21 e adicionar uma regra especial para portas passivas. Nenhuma regra é necessária para a porta 20, pois ela já é aceita pela ESTABLISHEDregra acima.

Primeiro aceite novas conexões em port 21:

iptables -A INPUT -p tcp --dport 21 -j ACCEPT

Em seguida, adicione o auxiliar CT para portas passivas 1024::

iptables -A PREROUTING -t raw -p tcp --dport 21 -j CT --helper ftp
iptables -A INPUT -p tcp -m conntrack --ctstate RELATED -m helper --helper ftp --dport 1024: -j ACCEPT

Veja também:

Nota: você deve definir o 1024:como no seu servidor FTP: procure as portas passivas padrão na sua configuração de FTP. Caso contrário, você abriria muitas portas que podem não ser relativas ao FTP.

Nota importante: eu não adicionei OUTPUTregras conforme meus padrões iptables -P OUTPUT ACCEPT. Significando que eu confio no que está saindo da minha caixa. Essa pode não ser uma boa opção, especialmente em uma configuração de NAT.

Nota muito importante: o FTPS não funcionará com essa configuração, pois a porta passiva está oculta (criptografada), portanto, não há como iptablesadivinhar a boa porta. Consulte Alterando IPTables para permitir FTP através de TLS usando portas passivas e https://serverfault.com/questions/811431/are-my-iptables-for-ftps-with-tls-ok

Yvan
fonte