Buckminster
(usa Debian)
Enviado em 13/09/2013 - 00:54h
É a pilha do protocolo TCP/IP em ação. É o famoso "Aperto de Mão em Três Vias".
Antes de enviar ou solicitar um dado, um site por exemplo, o cliente solicita a conexão enviando um pacote com a flag SYN, o servidor responde com as flags SYN+ACK e o cliente responde com um ACK e a transmissão se inicia, ou seja, você recebe teu site.
Mais ou menos assim:
O cliente diz para o servidor que está enviando uma mensagem 100 (número de sequência do cliente), o servidor responde e sincroniza a mensagem 200 (número de sequência do servidor) e diz para o cliente prosseguir com a mensagem 101 (ACK). O cliente envia a mensagem 101 e diz para o servidor prosseguir com a mensagem 201 (ACK) e assim sucessivamente.
Depois de feita a sincronização, começa a troca de pacotes.
Veja nessa RFC:
http://www.ietf.org/rfc/rfc793.txt
URG: Urgent Pointer field significant (aponta para conteúdo urgente)
ACK: Acknowledgment field significant (reconhecimento)
PSH: Push Function (um dado deve ser passado à aplicação)
RST: Reset the connection (reinicia a conexão)
SYN: Synchronize sequence numbers (sincroniza números de sequência para iniciar a conexão)
FIN: No more data from sender (finaliza a conexão)
No Iptables:
[!] --syn :: Somente corresponde pacotes TCP com o bit SYN e com os bits RST, ACK e FIN limpos. Esses pacotes são utilizados para solicitar o início da conexão TCP, por exemplo, bloquear esses pacotes em uma interface vai evitar conexões TCP de entrada, mas as conexões TCP de saída não serão afetadas. É equivalente a --tcp-flags syn, rst, ack, fin syn. Se o "!" precede a flag "--syn", o sentido da opção é invertido.
invalid :: Significa que o pacote está associado com nenhuma conexão conhecida.
new :: Significa que o pacote começou uma nova conexão ou está associado a uma conexão que não tem pacotes vindos de ambas as direções.
established :: Significa que o pacote está associado com uma conexão que tem pacotes vindos de ambas direções.
related :: Significa que o pacote está começando uma nova conexão, mas está associado a uma conexão existente, como uma transferência de dados de FTP, ou um erro ICMP.
untracked :: Significa que o pacote não é seguido em tudo. Isso acontece se você usa o alvo notrack na tabela raw.
snat :: É um estado virtual, combina se o endereço de origem for diferente do endereço de destino.
dnat :: É um estado virtual, combina se o endereço de destino difere do endereço de origem.
iptables -A INPUT -p tcp --dport 22 --syn -m state --state NEW -m limit --limit 6/minute -j ACCEPT
iptables adicione uma regra na chain INPUT com o protocolo tcp na porta 22 para os pacotes com a flag SYN que tenham o estado NEW (nova conexão), corresponda até o limite de 6 minutos ser atingido então aceite (ACCEPT).
Trocando em miúdos, uma nova conexão (NEW) com a flag SYN (início da conexão, pois uma nova conexão pode ter a flag FIN, fim da conexão) é para esperar 6 minutos e só então aceitar o pacote, ou seja, é usado para restringir a taxa de pacotes dentro do limite especificado.
iptables -A INPUT -p tcp --dport 22 --syn -m limit --limit 6/minute -j ACCEPT
Essa regra acima limita todos os pacotes na chain INPUT com a flag SYN, não importando se forem pacotes novos ou não.
Veja que há uma diferença entre conexão e pacotes novos. Uma conexão já estabelecida pode solicitar pacotes novos.
Essa é a diferença entre SYN e NEW.
Não sei se fui claro.
Fale com o Manuel nesse link:
http://www.vivaolinux.com.br/artigo/Manual-do-IPtables-Comentarios-e-sugestoes-de-regras