-
A política de uma cadeia interna determina o que acontece com os pacotes que passam por todas as regras da cadeia sem corresponder a uma única com um destino de dispositivo. Em seu exemplo acima, os pacotes que percorrem toda a cadeia
FORWARD
sem corresponder a nenhuma regra com um destino de dispositivo serãoACCEPT
ed, porque a política da cadeia éACCEPT
. -
Cadeias definidas pelo usuário não podem ter uma política. Os pacotes que passam por uma cadeia definida pelo usuário sem corresponder a uma regra com um destino de dispositivo retornam à cadeia da qual foram enviados para a cadeia definida pelo usuário (a "cadeia de chamada") na regra após a que enviou eles lá.
Um alvo dispositivo é aquele que descarta um pacote; exemplos incluem DROP
, ACCEPT
e MASQUERADE
; alvos não-dispositivos incluem LOG
e o alvo nulo (é legal ter uma regra que não tenha destino). Quando um pacote corresponde a uma regra com um destino de dispositivo, o pacote é considerado descartado e não ocorre mais processamento de regra. Quando um pacote corresponde a uma regra sem um destino de dispositivo, o processamento de pacotes continua na próxima regra.
Um corolário importante dessa lógica na correspondência e disposição de alvos é que ganha a primeira correspondência de dispositivo . Demasiadas vezes vemos perguntas sobre SF onde as pessoas têm uma cadeia que diz, por exemplo,
Chain INPUT (policy ACCEPT 210 packets, 22621 bytes)
pkts bytes target prot opt in out source destination
3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
, que contém uma única regra para bloquear o acesso a um servidor da Web ( tcp dpt:80
). Eles desejam permitir que um único endereço IP externo, digamos 1.2.3.4
, acesse esse servidor da Web, então eles adicionam uma regra com
iptables -A INPUT -p tcp --dport 80 -s 1.2.3.4 -j ACCEPT
e eles acabam com uma corrente como esta
Chain INPUT (policy ACCEPT 210 packets, 22621 bytes)
pkts bytes target prot opt in out source destination
3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * 1.2.3.4 0.0.0.0/0 tcp dpt:80
Como você pode ver, o pacote conta que a última regra é zero - e sempre será zero . Nenhum pacote pode igualar a última regra sem ter correspondido a anterior, e a anterior é dispositiva ( DROP
), portanto nenhum pacote alcançará a última regra.
A maneira de lidar com isso corretamente é garantir que suas exceções ocorram antes de suas regras , assim:
Chain INPUT (policy ACCEPT 210 packets, 22621 bytes)
pkts bytes target prot opt in out source destination
20 875 ACCEPT tcp -- * * 1.2.3.4 0.0.0.0/0 tcp dpt:80
3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Agora, as aceitações excepcionais são tratadas primeiro, depois outros pacotes de servidores web que não vêm do servidor excepcional são manipulados e descartados e, finalmente, a política de cadeia cuida de todos os outros pacotes e os aceita.