5

我正在尝试删除所有端口上的所有传出 RST 和传入 RST。我正在使用 Debian linux。我尝试了互联网上列出的所有可能的命令组合,但似乎没有任何效果。

例如,我试过:

iptables -A OUTPUT -o eth0 -p tcp --tcp-flags RST RST -j DROP  
iptables -A OUTPUT -p tcp --tcp-flags RST RST -j DROP
iptables -A INPUT -p tcp --tcp-flags RST RST -m state --state RELATED,ESTABLISHED -j DROP  
iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP  

我仍然看到内核发送 RST 数据包并接收 RST 数据包。请尝试解决此问题

4

4 回答 4

11

如果您希望丢弃入站 RST 数据包,您需要这样做:

iptables -I INPUT -p tcp --tcp-flags ALL RST,ACK -j DROP
iptables -I INPUT -p tcp --tcp-flags ALL RST -j DROP

如果您希望丢弃出站RST 数据包,您需要这样做:

iptables -I OUTPUT -p tcp --tcp-flags ALL RST,ACK -j DROP

为什么要 RST ACK? 根据 RFC,对包含 SYN 的 TCP 数据包的任何响应都必须确认该序列号。因此,即使您指示您的端口已关闭,您也会以 RST ACK 进行响应。

为什么要关心出站 RST? 如果您尝试使用 Scapy 之类的工具来试验 IP 行为,您将经常需要阻止主机的 IP 堆栈发回 RST ACK。或者,您可以在 Scapy 中实现一个伪堆栈,声明 MAC,响应 IPv6 的 ARP 或 ICMP ND,并绑定您自己的 IP 地址,这也会阻止主机的堆栈响应。显然,这比简单地阻止出站 RST 数据包需要更多的工作。

于 2016-07-15T07:21:09.683 回答
7

嗯,这很可能是通过正向链而不是输入或输出链,因为您在主机上运行它。

调试它的一个技巧是使用iptables -L -v,如果您设置一个发送大量数据包的命令,这将显示每个规则有多少数据包的计数

watch --interval 0.1 "nc remote.machine CLOSED_PORT"

您可以计算出哪个规则受到了打击。您还应该知道存在正交表——在不同情况下使用的规则链集(例如,用于 nat)。可能值得查看 NAT 表 - 因为您的虚拟主机可能正在通过您的主机进行 NAT,而不是拥有自己的 IP 地址

iptables -L -v -t nat

知道虚拟主机的 IP 地址是有用的——因为如果它与您的网络的子网不相交,这可能会被 NAT 化。

于 2012-12-10T19:49:37.137 回答
0

复位数据包激活了 RST 和 ACK 标志。所以,正确的规则是:

iptables -I INPUT -p tcp --tcp-flags ALL RST,ACK -j DROP

于 2013-12-04T10:51:12.853 回答
-3

希望能帮助到你:

echo 0 > /proc/sys/net/ipv4/tcp_rst_retries
echo 0 > /proc/sys/net/ipv4/tcp_rst_timeout
于 2014-03-29T08:20:38.367 回答