如何使用linux netfilter / iptables在一定条件下立即在两端重置TCP连接?

亲爱的Serverfault社区,

我有以下问题:如果在数据包数据中遇到某个string,我需要立即重置(断开)两个networking端的tcp连接。 我没有控制双方的应用程序,只能使用Linux的iptables(或类似的工具)做连接中止。

我的第一个想法是使用下面的iptables规则来实现我正在寻找的东西:

/usr/sbin/iptables -A INPUT -p tcp --dport 1234 -m string --algo bm --string 'BAD STRING' -j REJECT --reject-with tcp-reset 

这在远程方面完美地工作,发送一个TCP RST数据包给客户端,因此会立即断开连接。 不幸的是,本地方不会被强制断开连接和服务器进程(连接)通知永远挂起。

我认为要求在一定条件下立即断开双方已经build立的连接(这种情况下,IP包中的string匹配)并不是非常不寻常的。 所以我做了一个谷歌search,但令我惊讶的是在合理的时间内找不到任何可用的东西。

有没有办法使用iptables实现networking两端的tcp断开连接? 如果没有,我可以使用哪些其他工具(请记住,我无法控制客户机/服务器应用程序)?

非常感谢您的宝贵答案!

最好的祝福,

您可以configuration您的应用程序有一个超时。

另一个解决scheme是configurationTCP KeepAlive并进行更频繁的检查,例如每10分钟。

某些应用程序在应用程序级别上实现了KeepAlive。 比如SSH,apache。

当保持活动状态发送,连接在远端closures时,您将从远端收到一个RST。

有状态的防火墙会在一段时间不活动后忘记连接。 这意味着,如果您一段时间没有stream量(30分钟或1小时),您可以获得丢弃的数据包和半打开的连接。

我认为最好是询问你正在努力解决的问题,而不是你想要实现的特定解决scheme。

不幸的是,当地方将不会被强制断开连接通知

应该是,tcp-reset意味着客户端应该被告知连接正在closures。 如果您的客户端在发送重置时挂起,这意味着它不能正确处理从运行IPTables的主机发回的重置。 除非你有办法解决这个问题,否则我想不出有什么办法可以做到这一点。

你可以使用xt_RESET ,例如, -j RESET