
Eu criei iptables
regra:
iptables -I INPUT -p tcp --tcp-flags SYN,RST,ACK,FIN SYN --dport 10000 -j REJECT --reject-with tcp-reset
Mas, na verdade, o que isso faz é rejeitar todos os pacotes com sinalizadores RST
e ACK
.
É possível rejeitar apenas com RST
flag definido?
Sei que em um ambiente normal isso não faz sentido, mas tenho um laboratório e preciso fazer exatamente como descrito.
Responder1
Estou na China, então antes de fazer isso dig +tcp twiter.com @1.1.1.1
, preciso fazer estas 2 linhas:
sudo iptables -A INPUT -p tcp -s 1.1.1.1/32 --tcp-flags ALL RST,ACK -j DROP
sudo iptables -A INPUT -p tcp -s 1.1.1.1/32 --tcp-flags ALL RST -j DROP
Então obterei a resposta certa:
;; ANSWER SECTION:
twitter.com. 204 IN A 104.244.42.65
Se eu fizer apenas o primeiro iptables
comando, minha escavação falhará:
";; communications error to 1.1.1.1#53: connection reset"
O Grande Firewall da Chinaé estranho...
Responder2
Para descartar pacotes RST de entrada,
iptables -I INPUT -p tcp --tcp-flags ALL RST,ACK --dport 10000 -j DROP
Para descartar pacotes RST de saída,
iptables -I OUTPUT -p tcp --tcp-flags ALL RST,ACK --dport 10000 -j DROP
ARJ:
Um RST/ACK não é um reconhecimento de um RST, assim como um SYN/ACK não é exatamente um reconhecimento de um SYN. O estabelecimento do TCP, na verdade, é um processo de quatro vias: o host inicial envia um SYN para o host receptor, que envia um ACK para esse SYN. O host receptor envia um SYN para o host inicial, que envia um ACK de volta. Isso estabelece comunicação com estado.
SYN -->
<-- ACK
<-- SYN
ACK -->
Para tornar isso mais eficiente, o host receptor pode ACK o SYN e enviar seu próprio SYN no mesmo pacote, criando o processo de três vias que estamos acostumados a ver.
SYN -->
<-- SYN/ACK
ACK -->
No caso de um RST/ACK, o dispositivo reconhece quaisquer dados que foram enviados no(s) pacote(s) anterior(es) na sequência com um ACK e depois notifica o remetente de que a conexão foi fechada com o RST. O dispositivo simplesmente combina os dois pacotes em um, assim como um SYN/ACK. Um RST/ACK geralmente não é uma resposta normal ao fechar uma sessão TCP, mas também não é necessariamente indicativo de um problema.