本地透明代理的实现

 本地透明代理的实现
 
 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手工过滤特定的连接。
 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值