转载自http://blog.csdn.net/someonea/article/details/5864946

Windows下实现本地透明代理可以通过一个过滤驱动和代理进程实现。
过滤驱动Attach到“//Device//Tcp”和”//Device//Udp”,然后在Dispatch函数中修改
连接的目的地址并保存原始目的地址和源地址。
上层的代理进程在accept到连接时,向过滤驱动查询连接的原始目的地址,
然后向原始目的地址发起连接。

Linux下面使用netfilter(iptables)可以很容易的实现一个TCP透明代理,
使用iptables的REDIRECT选项无需编写内核模块就可以把连接重定向到本地代理进程。
然后代理进程accept到连接时通过SO_ORIGINAL_DST这个socket选项就可以得到原始目的地址,
非常方便。
不过这只是对TCP而言的,对应UDP而言,还是需要编写一个内核模块,自己做一些处理。
对于UDP,可以用nf_register_hook注册一个Hook,然后保存socket目的地址。
另外注册一个字符设备,在字符设备的IOCTL处理函数中把socket的原始目的地址发送给代理进程。
这一点与Windows的过滤驱动很相似,过滤驱动一般也是注册一个控制设备,
用户态程序通过控制设备与过滤驱动通信。

Mac OS X中也有类似的机制(使用ipfw的fwd、divert选项),不过用的人较少。

Mac OS X中可以注册Socket Filters手工过滤特定的连接。

留言