(转)iptables:tproxy做透明代理

https://blog.csdn.net/u011431128/article/details/77481678

什么是透明代理

客户端向真实服务器发起连接,代理机冒充服务器与客户端建立连接,并以客户端ip与真实服务器建立连接进行代理转发。因此对于客户端与服务器来说,代理机都是透明的。
如何建立透明代理
本地socket捕获数据包
nat方式

iptables -t nat -N MY_TCP #在nat表上新建名为MY_TCP自定义链
iptables -t nat -p tcp -A MY_TCP -j REDIRECT --to-ports 8081 #将进入MY_TCP链的数据包端口重定向到8081上
iptables -t nat -N MYNAT #在nat表上新建名为MYNAT自定义链
iptables -t nat -A PREROUTING -p tcp -j MYNAT #将MYNAT加入到PREROUTING链后
iptables -t nat -A MYNAT -p tcp -m multiport --dports 80 -j MY_TCP #在端口为80时执行MY_TCP链
nat方式在代理机上使用netstat查看,看到的目标地址将是本机socket侦听的地址。而下面的tproxy不会改变服务端地址。
tproxy方式

iptables -t mangle -N DIVERT #在nat表上新建名为DIVERT自定义链
iptables -t mangle -A PREROUTING -p tcp -m socket --transparent -j DIVERT #已建立的socket且被tproxy标记过的数据包执行DIVERT
iptables -t mangle -A DIVERT -j MARK --set-xmark 0x10000000/0xf0000000 #进入DIVERT设置标记
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -N MY_TCP
iptables -t mangle -p tcp -A MY_TCP -j TPROXY --on-port 8081 --tproxy-mark 0x10000000/0xf0000000
#MY_TCP执行TPROXY转发为8081端口并进行标记
iptables -t mangle -A MY_TCP -j ACCEPT
iptables -t mangle -N MYMANGLE
iptables -t mangle -A PREROUTING -p tcp -j MYMANGLE #MYMANGLE链加入到PREROUTING
iptables -t mangle -A MYMANGLE -p tcp -m multiport --dports 80 -j MY_TCP #80端口的包执行MY_TCP
ip rule add fwmark 0x10000000/0xf0000000 table 200 pref 200 #对标记过的数据包执行序号为200的规则
ip route add local default dev lo table 200 #200规则:数据包发送到本地回环
更推荐tproxy做透明代理
注:tproxy对于内核以及iptables版本有一定要求,需要先查阅是否支持
为socket设置IP_TRANSPARENT选项

在设置完iptables规则之后,还须为socket设置IP_TRANSPARENT选项。
设置之后可以bind一个不属于本机的IP地址,作为客户端,它可以使用一个不属于本机地址的IP地址作为源IP发起连接,作为服务端,它可以侦听在一个不属于本机的IP地址上,而这正是透明代理所必须的。面对真实的客户端,透明代理明知道目标地址不是自己,却还是要接受连接,对于真实的服务器,透明代理明显不是真实的客户端,却还要使用真实客户端的地址发起连接。
setsockopt(fd,SOL_IP, TRANSPARENT,&opt,sizeof(opt));
setsockopt之后,作为代理服务器bind真实服务器addr,作为代理客户端bind真实客户端addr。
 

猜你喜欢

转载自blog.csdn.net/zyb418/article/details/84677067