Linux 如何使所有输出RST下降

Linux 如何使所有输出RST下降,linux,networking,tcp,linux-kernel,iptables,Linux,Networking,Tcp,Linux Kernel,Iptables,我正在尝试删除所有端口上的所有传出RST和传入RST。我正在使用DebianLinux。我尝试了互联网上列出的所有可能的命令组合,但似乎没有任何效果 例如,我尝试: 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 s

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

例如,我尝试:

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数据包。请尝试解决此问题

嗯,这很可能是通过正向链而不是输入或输出链进行的,因为您在主机上运行此操作

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

watch --interval 0.1 "nc remote.machine CLOSED_PORT"
你可以计算出哪个规则被击中了。您还应该知道,存在正交表—在不同情况下使用的规则链集(例如nat)。可能值得在NAT表中查找,因为您的虚拟主机可能通过您的主机进行NAT,而不是拥有自己的IP地址

iptables -L -v -t nat

了解虚拟主机的IP地址会很有用,因为如果该地址与您的网络子网不相交,则可能会被NAT。

重置数据包会激活RST和ACK标志。 因此,正确的规则是:

iptables-I输入-p tcp--tcp标记所有RST、ACK-j DROP

希望它能帮助:

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

如果您希望丢弃入站RST数据包,则需要执行以下操作:

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

如果您希望丢弃出站RST数据包,则需要执行以下操作:

iptables -I INPUT -p tcp --tcp-flags ALL RST,ACK -j DROP
iptables -I INPUT -p tcp --tcp-flags ALL RST -j DROP
iptables -I OUTPUT -p tcp --tcp-flags ALL RST,ACK -j DROP
为什么重新确认? 根据RFC,对包含SYN的TCP数据包的任何响应都必须确认该序列号。因此,即使您指示端口已关闭,也会以RST ACK响应

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

状态跟踪
-m state——与状态相关的、已建立的
看起来不相关(没有双关语),但其余看起来不错。在
输入
/
输出
链中,在您添加的规则之前,可能还有其他规则允许数据包?但最大的问题是,为什么你会想做这样的事情。我正在做一个类项目,在这个问题解决之前我无法前进。无论如何,linux安装在virtualbox中。我不是在我的主机上这么做的你是怎么验证规则不起作用的?如果您在与iptables规则相同的机器上运行wireshark,并且看到RST,则这是意料之中的。Wireshark将看到所有数据包,甚至是那些被iptables丢弃的数据包。我正在我的机器和远程机器上运行Wireshark。有证据表明RST是由我的机器发送并到达远程机器的,他们真的吗?什么?用于不存在的连接的段?你为什么要承认?好的,对不起。我正在处理一个特殊的问题,其中数据包的ack+rst,但并不是所有rst数据包都有ack标志。但贾斯汀的问题可能是,带有rst+ack的数据包并不是只被rst过滤器过滤的。你说得很对,@adrianlzt。如果有人向您发送SYN,正确的响应必须包括序列号+1的ACK。因此,即使关闭的端口也会用RST/ACK响应SYN。它在RFC中。非常感谢,但是我必须使用一个稍微不同的命令行来丢弃出站RST数据包(即,没有ACK标志):“iptables-I OUTPUT-p tcp--tcp标志所有RST-j drop”,这似乎是合适的,因为我在这个回答中明确指出它只丢弃RST-ACK数据包。