我们知道,IDS(入侵检测系统)
的主动响应系统“阻止会话”的机制是:IDS将会向通信的两端(服务器端和客户端)各发送三个TCP
RESET包,此时通信双方的堆栈将会把这个RESET包解释为另一端的回应,然后停止整个通信过程,释放缓冲区并撤销所有TCP状态信息,从而实现主动
切断连接的目的。 这时,客户端浏览器看到的现象通常是,打开某一个网页,浏览器提示“连接被重置”而无法查看页面。
IDS在逻辑上是与路由器分离的,很难从路由传输队列中去除或者延迟“有害”报文,通过RESET关闭连接相对较为简单而易于实现,那么,如何绕过IDS“会话阻止”机制呢?
标准的TCP协议,客户端收到RESET包后会中断连接,但是,如果终端两边的节点同时忽略TCP RESET,那样,即使触发了IDS,防火墙也对HTTP传输没有任何影响,这就通过忽略RESET包实现了突破IDS的“会话阻止”功能。
在Linux桌面系统可以用iptables的此命令实现:
iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP
来丢弃传入的RST报文。
如果是FreeBSD的ipfw那么命令是这样的:
ipfw add 1000 drop tcp from any to me tcpflags rst in
因此,在网页传输过程中,可以将中间夹杂的一些防火墙的TCP复位报文完全忽略,因为它们对客户端的TCP/IP栈没有任何影响,客户端仍然继续接收网页。
以上思路翻译自Ignoring the Great Firewall of China,点这里可以下载其PDF文件, 原文很长,内容较多。我自己在Ubuntu系统上,在终端中使用iptables测试,的确可以实现忽略客户端RESET报文的功能,Firefox浏览 器再也没有出现“连接被重置”的信息,可惜由于服务器端RESET信号没有被忽略,导致客户端不能与服务端同步握手,浏览还是有问题,不过,如果服务器段 都可以识别并忽略这些伪造的RESET报文,那么两边的通讯就会正常了。
(即服务器端也运行iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP)
from http://www.williamlong.info/archives/1954.html
IDS在逻辑上是与路由器分离的,很难从路由传输队列中去除或者延迟“有害”报文,通过RESET关闭连接相对较为简单而易于实现,那么,如何绕过IDS“会话阻止”机制呢?
标准的TCP协议,客户端收到RESET包后会中断连接,但是,如果终端两边的节点同时忽略TCP RESET,那样,即使触发了IDS,防火墙也对HTTP传输没有任何影响,这就通过忽略RESET包实现了突破IDS的“会话阻止”功能。
在Linux桌面系统可以用iptables的此命令实现:
iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP
来丢弃传入的RST报文。
如果是FreeBSD的ipfw那么命令是这样的:
ipfw add 1000 drop tcp from any to me tcpflags rst in
因此,在网页传输过程中,可以将中间夹杂的一些防火墙的TCP复位报文完全忽略,因为它们对客户端的TCP/IP栈没有任何影响,客户端仍然继续接收网页。
以上思路翻译自Ignoring the Great Firewall of China,点这里可以下载其PDF文件, 原文很长,内容较多。我自己在Ubuntu系统上,在终端中使用iptables测试,的确可以实现忽略客户端RESET报文的功能,Firefox浏览 器再也没有出现“连接被重置”的信息,可惜由于服务器端RESET信号没有被忽略,导致客户端不能与服务端同步握手,浏览还是有问题,不过,如果服务器段 都可以识别并忽略这些伪造的RESET报文,那么两边的通讯就会正常了。
(即服务器端也运行iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP)
from http://www.williamlong.info/archives/1954.html