详细阐述透明代理

为什么总强调是“透明”代理,也就是说这样的代理对客户端来说是不可见的,并不需要在客户端的浏览器中作关于代理的设置。假设有这样的典型NAT网络环境:
网关: 192.168.0.1
客户端:192.168.0.2
子网掩码:255.255.255.0
Internet上某个主机的地址为123.123.123.123
客户端需要用HTTP协议访问123.123.123.123,其首先要连接123.123.123.123的80号端口,而这个连接的TCP包会发送的网关192.168.0.1,网关会对数据包做NAT转换,将其源地址修改为对外的公网IP,并将数据包发送回去,这是正常的情况。但是如果使用的是透明代理,也就是说在网关上做了关于透明代理的配置,则网关会检查每一个对80号端口发起连接的TCP数据包,如上面的数据包会被匹配上,这个连接并不会被转发的实际的123.123.123.123,而是网关会将其转发到指定的HTTP代理服务器,这个代理服务器实际去从123.123.123.123取得需要的数据,然后将数据返回给客户端,这样对于客户端来说,它并不知道自己连接的不是实际的服务器,而是HTTP代理服务器。在代理服务器上使用缓存,则可以提高内网的访问速度。
添加图片注释,不超过 140 字(可选)
透明代理在Linux下的实现:
在linux下配合iptables很容易实现透明代理,首先,在网关上启用iptables(一般都是用iptables作NAT),然后在nat表上做REDIRECT,将80号端口的数据重定向到另一个端口,一般是squid所在的端口,配置好squid就可以了。还可以在PREROUTING链上做DNAT,将HTTP连接定向到另一个主机,这样就可以实现负载均衡。
这里面其实有一个问题,比如DNAT的情况,假设一个客户端发起的连接被重定向到了一个HTTP代理,对这个代理来说,他能知道这个这个连接的来源,可是数据包的目的地址已经被改变成了HTTP代理的地址,那么,这个HTTP代理是怎么知道这个连接原来是准备连接哪个主机的呢,要不他怎么知道连接哪个主机以获得数据呢?原来,HTTP代理服务器在接受了这个请求了之后,会分析客户端发送过来的HTTP头,其中有一个Host字段,就是这个连接要连接的主机,于是HTTP代理就去连接这个主机,获取文件,然后将文件返回给客户端(如果缓存有效的话,可以直接从缓存中取),整个偷梁换柱的代理过程就完成了。

进一步,在HTTP代理上做HTTP劫持是可行的,只要在返回的数据中插入一些数据就可以了,客户端啥都不知道,(这样一来,就可以实现万恶的强制推送广告了,打开google的时候都可以让你的浏览器弹出广告)。再进一步,在局域网中,利用ARP欺骗,劫持客户端和网关之间的通讯,然后再配合对HTTP通讯的重定向和代理,就可以控制客户端从网上获得的内容了。想一想,如果某天你从网上下载了一个.exe安装程序,在你完全无感觉的情况下,这个.exe其实已经被同局域网的人用ARP+HTTP劫持替换成了一个木马 华益云HTTP代理
添加图片注释,不超过 140 字(可选)