如何使所有传出的RST掉线

时间:2012-11-04 01:08:44

标签: linux networking tcp linux-kernel iptables

我正在尝试删除所有端口上的所有传出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 个答案:

答案 0 :(得分:6)

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

调试这个的一个技巧是使用 iptables -L -v ,如果你设置一个发送大量数据包的命令,它会显示每个规则的数据包数量< / p>

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

你可以找出哪个规则受到了影响。您还应该知道有正交表 - 在不同情况下使用的规则链集(例如nat)。在NAT表中查找可能是值得的 - 因为您的虚拟主机可能通过主机NAT而不是拥有自己的IP地址

iptables -L -v -t nat

了解虚拟主机具有哪些IP地址将会提供信息 - 因为如果这与您的网络子网不相交,则可能是NAT。

答案 1 :(得分:6)

如果您要删除入站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确认? 根据RFC,对包括SYN的TCP分组的任何响应必须确认该序列号。因此,即使您指示端口已关闭,也会使用RST ACK进行响应。

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

答案 2 :(得分:0)

重置数据包已激活RST和ACK标志。 所以,正确的规则是:

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

答案 3 :(得分:-3)

希望有所帮助:

echo 0 > /proc/sys/net/ipv4/tcp_rst_retries
echo 0 > /proc/sys/net/ipv4/tcp_rst_timeout