Jus*_*rey 5 linux networking tcp iptables linux-kernel
我试图在所有端口上丢弃所有传出的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
Run Code Online (Sandbox Code Playgroud)
我仍然看到RST数据包由内核发送并且还接收RST数据包.请尝试解决此问题
嗯,这很可能是通过前向链而不是输入或输出链,因为你在主机上运行它.
调试这个的一个技巧就是使用iptables -L -v,如果你设置一个发送大量这样的数据包的命令,它会显示每个规则有多少个数据包的计数
watch --interval 0.1 "nc remote.machine CLOSED_PORT"
Run Code Online (Sandbox Code Playgroud)
你可以找出哪个规则受到了影响.您还应该知道有正交表 - 在不同情况下使用的规则链集(例如nat).可能值得在NAT表中查找 - 因为您的虚拟主机可能通过主机进行NAT,而不是拥有自己的IP地址
iptables -L -v -t nat
Run Code Online (Sandbox Code Playgroud)
了解虚拟主机具有哪些IP地址将会提供信息 - 因为如果这与您的网络子网不相交,则可能是NAT.
如果您要删除入站RST数据包,则需要执行以下操作:
iptables -I INPUT -p tcp --tcp-flags ALL RST,ACK -j DROP
iptables -I INPUT -p tcp --tcp-flags ALL RST -j DROP
Run Code Online (Sandbox Code Playgroud)
如果您要删除出站 RST数据包,则需要执行以下操作:
iptables -I OUTPUT -p tcp --tcp-flags ALL RST,ACK -j DROP
Run Code Online (Sandbox Code Playgroud)
为什么RST确认? 根据RFC,对包括SYN的TCP分组的任何响应必须确认该序列号.因此,即使您指示端口已关闭,也会使用RST ACK进行响应.
为什么要关心出境RST? 如果您尝试使用像Scapy这样的工具来试验IP行为,您将经常需要阻止主机的IP堆栈发回RST ACK.或者,您可以在Scapy中实现伪堆栈,声明MAC,响应IPv6的ARP或ICMP ND,并绑定您自己的IP地址,这也将阻止主机的堆栈响应.显然,这比简单地阻止出站RST数据包更有用.
| 归档时间: |
|
| 查看次数: |
13282 次 |
| 最近记录: |