您的位置:首页 > 运维架构 > 反向代理

squid 正向代理 透明代理分析

2016-12-15 10:22 471 查看
squid无论是正向,反向,透明都可以cache。
connect可以作为正向代理来用。客户端向代理发connect方法,代理会根据connect ip:port或host字段连接上游,并返回给客户端 HTTP/1.0 200 Connection established, 以后的客户端(任意协议)请求都会被代理透传到上                   游。clientProcessRequest--> if (r->method == METHOD_CONNECT) sslStart()-->连向上游。

squid transparent(nat代理):经研究是个半透明代理, 客户端不需要在浏览器中指定代理服务器的地址和端口号,代理服务对客户端用户说是“透明”的,用户甚至并不知道自己已经在使用代理服务了。
                             但上游还是知道是经过代理了,这样对客户有acl控制的还是不好使。
                            
                           通过host字段走dns或hosts文件获取 (或SO_ORIGINAL_DST ,有宏控制)从客户端套接字获取上游的ip和端口(因为netfilter会保留nat或redirect过后的数据包的原始数据流,所以可以获取 原始dip)。clientTryParseRequest->parseHttpRequest->clientNatLookup.   parseHttpRequest后会通过urlparse重新生成新request,这样host就换成dip。
                            需要配置nat来实现功能。
                           iptables -t nat -A PREROUTING -i eth0 -p tcp  --dport 80     -j REDIRECT --to-ports 81
                          iptables -t nat -A POSTRO UTING -j MASQUERADE
 
MASQUERADE - SNAT的一种特殊形式,适用于像adsl这种临时会变的ip上
REDIRECT - DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥)

                           

squid tproxy : 全透明模式,上游也认为连接的是客户端。 通过设置IP_TPROXY(2.6版本,4.0版本已改为IP_TRANSPARENT)选项用客户端地址创建socket,然后连接上游(通过request->host字段或dns获取或hosts文件获取,因为是7层代理,可以通过http头部获取dip;如果是4层代理,dip只能通过SO_ORIGINAL_DST
获取)。
                      fwdConnectStart-->用客户端地址设置套接字IP_TPROXY-》commConnectStart
目测需要如下配置:
 /sbin/iptables
-t mangle -N DIVERT
/sbin/iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
/sbin/iptables -t mangle -A DIVERT -j MARK --set-mark 1
/sbin/iptables -t mangle -A DIVERT -j ACCEPT
/sbin/ip rule add fwmark 1 lookup 100
/sbin/ip route add local 0.0.0.0/0 dev lo table 100

 iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 50080

   参数说明:

laddr 为代理服务器的本地监听套接字的本地ip,此例中省略,即取本地ip;

lport 为代理服务器的本地监听套接字的本地port,50080(也可以是别的端口,是另一个服务进程监听的端口,是本控件的数据出口);

mark_value 为mark值,依据此标记值使用ip rule命令工具为标记数据流进行路由选择;

tproxy优势:其的优势在于不对数据包(包头信息)进行任何改变(NAT),就可以重定向数据包。
haproxy透明代理用的就是IP_TRANSPARENT

参考:http://wiki.squid-cache.org/Features/Tproxy4
       http://wiki.squid-cache.org/ConfigExamples/FullyTransparentWithTPROXY
      https://www.stunnel.org/pipermail/stunnel-users/2005-August/000711.html 有关ip_tproxy选项

____________________________________________________________

网桥截取报文到三层

ebtables中的broute表功能:
用于控制进来的数据包是需要进行bridge转发还是进行route转发,即2层转发和3层转发。

BROUTING的ACCEPT/DROP和FORWARD中的区别:

 

ACCEPT
DROP
BROUTING
bridge it
route it
FORWARD
接收该包,当前主Chain后面的rule则不再需要对其进行匹配处理
丢弃该包
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  squid 代理