Alguém pode me ajudar a entender a regra abaixo iptables?
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
Alguém pode me ajudar a entender a regra abaixo iptables?
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
Respostas:
Radhil foi muito cauteloso, excluindo sua resposta, que está correta, embora necessite de integração.
Primeiro, o significado literal da regra: cai (-j DROP) todos os pacotes que iniciam uma nova conexão (-m state --state NEW) que são não do tipo SYN (! - syn) para o protocolo TCP (-p tcp).
Então alguns comentários. No protocolo TCP, uma conexão é iniciada pela troca ritual de três pacotes, SYN (cliente para servidor) - & gt; SYN / ACK (servidor para cliente) - & gt; ACK (cliente para servidor). Uma conexão não iniciado pelo pacote SYN, como aquele descartado pela regra iptables acima, é uma maneira imprópria de estabelecer uma conexão que persegue objetivos diferentes, como corretamente apontado por radhil.
Esta regra é frequentemente, e incorretamente, considerada necessária para suprimir ataques de inundação de sin na Web: veja por exemplo esta página da web , onde é explicitamente declarado:
O próximo padrão a rejeitar é um ataque syn-flood.
iptables -A INPUT -p tcp! --syn -m state --state NOVO -j DROP
SYN-Flood-Attacks significa que os atacantes abrem uma nova conexão, mas não declaram o que querem (ou seja, SYN, ACK, o que quer que seja). Eles só querem pegar os recursos dos nossos servidores. Nós não aceitamos tais pacotes.
Claro, não faz sentido tentar desarmar os ataques de inundação de aceitando (!!!!) Pacotes SYN para novas conexões. E deve ser pacotes, não pacotes.
Ataques Syn-flood colocam alguns problemas que ainda não estão completamente resolvidos. Isto levou ao desenvolvimento de um novo módulo iptables, chamado SYNPROXY, que você pode encontrar discutido Aqui . A limitação de taxa é frequentemente usada, veja por exemplo Aqui , mas isso incorre no problema mencionado na referência anterior, isto é o módulo conntrack, que é necessário para rastrear quais conexões são novas e quais são antigas e em qual estado, funciona sem falhas para um número limitado de conexões, mas consome quantidades desproporcionais de tempo quando o número de conexões aumenta (por exemplo, um ataque de inundação SYN). Isto é o que se entende por um escalabilidade questão.
No geral, não está totalmente claro para mim que a regra iptables acima serve para qualquer propósito significativo.
-A INPUT
- acrescentar ao final da cadeia "INPUT"
-p tcp
- corresponde ao protocolo TCP
! --syn
- combinar pacotes sem o sinalizador TCP SYN
-m state
- use o módulo "state" (obsoleto; novos conjuntos de regras devem usar "conntrack")
--state NEW
- combinar pacotes com o estado "NEW" (ou seja, não pertencentes a qualquer conexão estabelecida)
-j DROP
- pula para o alvo "DROP" (que é um alvo final que descarta o pacote)
Basicamente, os pacotes TCP abrem uma nova conexão (e sempre têm o sinalizador SYN) ou pertencem a uma conexão existente ou tentam fechar uma conexão abortada (com o sinalizador RST) ou são lixo. Portanto, essa regra tenta descartar pacotes dentro da última categoria, que não tenta abrir uma nova conexão nem pertence a uma existente.
IMHO isso é um pouco redundante ... Talvez seja para proteger contra vários tipos de portscan estranhos (como visto no nmap). Poderia ser apenas paranoia também.