我创建了iptables
规则:
iptables -I INPUT -p tcp --tcp-flags SYN,RST,ACK,FIN SYN --dport 10000 -j REJECT --reject-with tcp-reset
但实际上,这样做是拒绝所有带有RST
和ACK
标志的数据包。
仅在设置标志的情况下才可以拒绝吗RST
?
我知道在正常环境中这没有任何意义,但我有一个实验室,我需要完全按照描述进行。
答案1
我在中国,所以在我这样做之前dig +tcp twiter.com @1.1.1.1
,我需要执行以下两行:
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
然后我会得到正确的答案:
;; ANSWER SECTION:
twitter.com. 204 IN A 104.244.42.65
如果我只执行第一个iptables
命令,我的挖掘就会失败:
";; communications error to 1.1.1.1#53: connection reset"
中国的防火墙很奇怪...
答案2
要丢弃入站 RST 数据包,
iptables -I INPUT -p tcp --tcp-flags ALL RST,ACK --dport 10000 -j DROP
要丢弃出站 RST 数据包,
iptables -I OUTPUT -p tcp --tcp-flags ALL RST,ACK --dport 10000 -j DROP
前几年:
RST/ACK 不是 RST 的确认,就像 SYN/ACK 不完全是 SYN 的确认一样。 TCP 建立实际上是一个四向过程:发起主机向接收主机发送 SYN,接收主机发送该 SYN 的 ACK。接收主机向发起主机发送 SYN,发起主机发回 ACK。这建立了状态通信。
SYN -->
<-- ACK
<-- SYN
ACK -->
为了提高效率,接收主机可以确认 SYN,并在同一数据包中发送自己的 SYN,从而创建我们习惯看到的三向过程。
SYN -->
<-- SYN/ACK
ACK -->
在 RST/ACK 的情况下,设备通过 ACK 确认序列中先前数据包中发送的任何数据,然后通过 RST 通知发送方连接已关闭。设备只是将两个数据包合并为一个数据包,就像 SYN/ACK 一样。 RST/ACK 通常不是关闭 TCP 会话的正常响应,但它也不一定表示存在问题。