Somando para servidor e cliente um INPUT
restritivo e um OUTPUT
aberto, ou seja:
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
E de iptables-extensions (8) sobre o exemplo do FTP no modo ativo:
1. NOVO
NEW The packet has started a new connection or otherwise
associated
with a connection which has not seen packets in both directions.
O cliente na porta 50000
(qualquer porta não privilegiada aleatória) se conecta ao servidor FTP na porta 21
, o servidor precisaria de pelo menos isso para aceitar essa conexão de entrada:
iptables -A INPUT --dport 21 -m state --state NEW -j ACCEPT
2. ESTABELECIDO
ESTABLISHED
The packet is associated with a connection which has seen
packets in both directions.
Agora, no lado do cliente, ele abriu uma conexão de saída para o servidor na porta 21
usando uma porta local 50000
e ele precisa dos seguintes iptables para permitir que a resposta chegue de server (21)
a client (50000)
:
sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
3. RELACIONADOS
RELATED
The packet is starting a new connection, but is associated with
an existing connection, such as an FTP data transfer or an ICMP
error.
Agora, depois que a conexão FTP tiver sido estabelecida e uma conexão de dados estiver prestes a ser executada, o cliente abrirá um soquete do servidor (sim, com o cliente FTP ativo se torna um servidor para a conexão de dados) na porta 60000
O cliente compreensivo marcará essa porta 60000
as RELATED
como a outra conexão de 50000->21
) e enviará esse número de porta para o servidor usando o comando PORT
do FTP. Em seguida, o servidor FTP abrirá uma nova conexão da porta 20
para a porta 60000
no cliente e, bem, o cliente agora exige o seguinte para permitir que essa nova conexão seja bem-sucedida:
sudo iptables -A INPUT -m state --state RELATED -j ACCEPT
Por fim, para que isso funcione, você precisa ativar o módulo ip_conntrack_ftp
kernel para permitir que o sistema marque conexões / pacotes como RELATED
(isto é o meu entendimento, eu não pesquisei muito isso):
modprobe ip_conntrack_ftp