透明代理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/inthat/article/details/88898521

概念

高度匿名代理、普通匿名代理和透明
参考URL: https://blog.csdn.net/bytxl/article/details/15334153

从隐藏使用代理用户的级别上划分,代理可以分为三种,即高度匿名代理、普通匿名代理和透明代理.
(1)高度匿名代理不改变客户机的请求.这样在服务器看来就像有个真正的客户浏览器在访问它,这时客户的真实IP是隐藏的,服务器端不会认为我们使用了代理.
(2)普通匿名代理能隐藏客户机的真实IP,但会改变我们的请求信息,服务器端有可能会认为我们使用了代理.不过使用此种代理时,虽然被访问的网站不能知道你的ip地址,但仍然可以知道你在使用代理,当然某些能够侦测ip的网页仍然可以查到你的ip.
(3)透明代理,它不但改变了我们的请求信息,还会传送真实的IP地址.
三者隐藏使用代理者身份的级别依次为高度匿名代理最隐蔽,其次是普通匿名代理,最差的是透明代理.

iptables:tproxy做透明代理

iptables:tproxy做透明代理
参考URL: https://blog.csdn.net/u011431128/article/details/77481678

如何建立透明代理
本地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。

haproxy透传用户ip-方法和原理

haproxy透传用户ip-方法和原理
参考URL: https://blog.csdn.net/frockee/article/details/78641188

为了透传用户ip到后端server, proxy机器需要解决两个问题:

1.在创建到后端server的套接字时, 将用户ip作为套接字的源ip,从而让后端server看到;

2.后端server在回包时, 能够将目的地为用户ip的回包,返回给proxy机器,而proxy机器能够将该包,从网卡驱动(链路层)收下来,并正确递交给应用层的haproxy进程

为了解决这两个问题,haproxy进程和所在机器需要做三个事情:

1.haproxy进程在创建到后端server的tcp套接字时,开启IP_TRANSPARENT选项, 并绑定用户ip为源ip;

2.后端server修改路由规则,将目的地为用户ip的回包,路由给proxy机器;

3.proxy机器在处理回包时, 在ip层, 由TProxy通过结合netfilter/iptables, 对该回包做一些小动作,将该回包的skb->sk = sk(sk为haproxy进程创建的对应套接字),从而让tcp层能够根据skb->sk, 将该回包递交给haroxy进程进行处理,最终返回给客户端。

猜你喜欢

转载自blog.csdn.net/inthat/article/details/88898521