想像这么一个场景你想截获(hijack)一个本地的出口连接(LOCALOUT)或者转发的连接(PREROUTING),对这个连接的两个方向的内容 做修改,比如:1、将这个连接连接到远程socks代理(在通讯头部加上socks通信协议部分)2、对这个连接进行记录(用于协议分析)3、任何你能想 到的折腾方式,比如我们叫他tcpgrep,:)。
那么我们该如何做呢?
一、获得连接
首先,我们要能获得这个连接,很容易想到的是用iptables连接REDIRECT方法(和DNAT类似),如果你做过squid的透明代理,应该会觉得很熟悉。
#iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports 8010
当然,你应该忽略一些不感兴趣的连接,可以单独建立一个chains,然后配和-j RETURN就可以做到。如果你熟悉iptables,这个应该很容易做到,我就
不多说了。
现在呢?
nc -l 8010 (注:BSD style 的nc,如果你是GNU nc,用nc -l -p 8010)
然后nc www.baidu.com 80
很好,连接已经被第一个nc hijack了。但是,问题来了,他要去哪里呢?
二、获得ORGINAL DESTINALTION
这里就是透明代理技术的关键所在了。
0、socks代理方式的
这个方式并不是我们所需要的东西,因为这个需要涉及到用户程序的修改。因为用户需要将目的地址发送给服务器(按照socks协议),如果用户程序本身没有考虑
支持socks协议那么就没有直接的办法了。
1、方法一:做一个专用内核模块
我曾经做过一个,在http://s5snake.gro.clinux.org有相关信息,是专门用于socks[45]的东西。不过在kernel 2.6.9以后因为设计上的问题,对于LOCALOUT
的连接就失效了,现在我已经不维护这个老的模块了。
这种方法太吃力,而且调试困难,需要同时维护netfilter/iptables的内核态模块和用户态模块,所以不推荐再使用了。
2、方法二: PRELOAD方式
通过PRELOAD一个库,修改socks,connect函数的调用来达到目的。
tsocks就是这么做的(http://tsocks.sourceforge.net/)
这样的方式非常像windows下的sockscap32程序,但是有个最大的问题是,只能在本机使用,对转发的连接就不适用了。
3、方式三:SO_ORIGINAL_DST
SO_ORIGINAL_DST是一个socket参数(SOL_IP层的)。
那么我们该如何做呢?
一、获得连接
首先,我们要能获得这个连接,很容易想到的是用iptables连接REDIRECT方法(和DNAT类似),如果你做过squid的透明代理,应该会觉得很熟悉。
#iptables -t nat -A OUTPUT -p tcp -j REDIRECT --to-ports 8010
当然,你应该忽略一些不感兴趣的连接,可以单独建立一个chains,然后配和-j RETURN就可以做到。如果你熟悉iptables,这个应该很容易做到,我就
不多说了。
现在呢?
nc -l 8010 (注:BSD style 的nc,如果你是GNU nc,用nc -l -p 8010)
然后nc www.baidu.com 80
很好,连接已经被第一个nc hijack了。但是,问题来了,他要去哪里呢?
二、获得ORGINAL DESTINALTION
这里就是透明代理技术的关键所在了。
0、socks代理方式的
这个方式并不是我们所需要的东西,因为这个需要涉及到用户程序的修改。因为用户需要将目的地址发送给服务器(按照socks协议),如果用户程序本身没有考虑
支持socks协议那么就没有直接的办法了。
1、方法一:做一个专用内核模块
我曾经做过一个,在http://s5snake.gro.clinux.org有相关信息,是专门用于socks[45]的东西。不过在kernel 2.6.9以后因为设计上的问题,对于LOCALOUT
的连接就失效了,现在我已经不维护这个老的模块了。
这种方法太吃力,而且调试困难,需要同时维护netfilter/iptables的内核态模块和用户态模块,所以不推荐再使用了。
2、方法二: PRELOAD方式
通过PRELOAD一个库,修改socks,connect函数的调用来达到目的。
tsocks就是这么做的(http://tsocks.sourceforge.net/)
这样的方式非常像windows下的sockscap32程序,但是有个最大的问题是,只能在本机使用,对转发的连接就不适用了。
3、方式三:SO_ORIGINAL_DST
SO_ORIGINAL_DST是一个socket参数(SOL_IP层的)。