Asumming para servidor e cliente um restritivo INPUTe aberto OUTPUT, ou seja:
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
E de iptables-extensions (8) sobre o exemplo de FTP no modo ativo:
1. NOVO
NOVO O pacote iniciou uma nova conexão ou foi associado a uma conexão que não viu pacotes nas duas direções.
O cliente na porta 50000(qualquer porta sem privilégios aleatórios) se conecta ao servidor FTP na porta 21, o servidor precisaria pelo menos disso para aceitar esta conexão de entrada:
iptables -A INPUT --dport 21 -m state --state NEW -j ACCEPT
2. ESTABELECIDO
ESTABELECIDO O pacote está associado a uma conexão que viu pacotes nas duas direções.
Agora no lado do cliente, ele abriu uma conexão de saída para o servidor na porta 21usando uma porta local 50000e ele precisa as seguintes iptables para permitir a resposta a chegar a partir server (21)de client (50000):
sudo iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
3. RELACIONADOS
RELATED O pacote está iniciando uma nova conexão, mas está associado a uma conexão existente, como uma transferência de dados FTP ou um erro ICMP.
Agora, depois que a conexão FTP for estabelecida e uma conexão de dados estiver prestes a ser realizada, 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(para o meu entendimento, o cliente marcará essa porta 60000quanto RELATEDà outra conexão de 50000->21) e enviará esse número de porta ao servidor usando o PORTcomando FTP . Em seguida, o servidor FTP abrirá uma nova conexão de sua porta 20para porta 60000no cliente e, agora, o cliente 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 habilitar o ip_conntrack_ftpmódulo do kernel para permitir que o sistema marque conexões / pacotes como RELATED(este é meu entendimento, eu não cavei muito nisso):
modprobe ip_conntrack_ftp