iptables:tproxy做透明代理
什么是透明代理
客户端向真实服务器发起连接,代理机冒充服务器与客户端建⽴连接,并以客户端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做透明代理
上海周边2日游注: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。