亲爱的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