Asumming para servidor e cliente um restritivo INPUT
e 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 21
usando uma porta local 50000
e 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 60000
quanto RELATED
à outra conexão de 50000->21
) e enviará esse número de porta ao servidor usando o PORT
comando FTP . Em seguida, o servidor FTP abrirá uma nova conexão de sua porta 20
para porta 60000
no 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_ftp
mó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