利用TPROXY在网桥上实现透明代理(Fully Transparent Proxy)功能 (CentOS 7)
1、TPROXY是什么 你可能听说过TPROXY,它通常配合负载均衡软件HAPrxoy或者缓存软件Squid使用。 在所有"Proxy"类型的应用中都一个共同的问题,就是后端的目标服务器上看到的连接的Source IP都不再是用户原始的IP,而是前端的"Proxy"服务器的IP。 拿HAProxy举例来说,假设你有3台后端Web服务器提供服务,前端使用HAProxy作为负载均衡设备。所有用户的HTTP访问会先到达HAProxy,HAProxy作为代理,将这些请求按照指定的负载均衡规则分发到后边的3台Web服务器上。这个操作本身没有任何问题,因为HAProxy就应该是这么工作的。但是对于某些对于用户的访问IP有限制的敏感应用,问题来了: 后端服务器上的ACL无法限制哪些IP可以访问,因为在它看来,所有连接的SOURCE IP都是HAProxy的IP。 这就是为什么TPROXY产生的原因,最早TPROXY是作为Linux内核的一个patch,从2.6.28以后TPRXOY已经进入官方内核。TPRXOY允许你"模仿"用户的访问IP,就像负载均衡设备不存在一样,当HTTP请求到达后端的Web服务器时,在后端服务器上用netstat查看连接的时候,看到连接的SOURCE IP就是用户的真实IP,而不是haproxy的IP。TPROXY名字中的T表示的就是transparent(透明)。 TPROXY主要功能如下: 1.重定向一部分经过路由选择的流量到本地路由进程(类似NAT中的REDIRECT) 2.使用非本地IP作为SOURCE IP初始化连接 3.无需iptables参与,在非本地IP上起监听 如果想要了解TPROXY的具体工作原理,请参考作者本人写的PPT,介绍的比较详细了: http://people.netfilter.org/hidden/nfws/nfws-2008-tproxy_slides.pdf 2、Centos 7系统,iptables透明网桥实现 在2.6.28以后的内核中,TPROXY已经是官方内核的一部分了。CentOS 7 默认使用的是3.10内核,所以不需要额外添加。 在一切开始之前,需要安装两个包:bridge-utils,ebtables #yum install bridge-utils ebtables 首先建立网桥:(使用bridge) 示例 桥接eth0 与 eth1 网口 /sbin/modprobe bridge /usr/sbin/brctl addbr br0 /sbin/ifup eth0 /sbin/ifup eth1 /usr/sbin/brctl addif br0 eth0 /usr/sbin/brctl addif br0 eth1 /sbin/ip link set br0 up 在网桥上设置IP地址,示例 # ifconfig br0 192.168.10.90 netmask 255.255.255.0 这样就完成了网桥的配置工作。但这时配置没有保存下来,如果要重启有效,需要添加网桥的配置文件,可以添加如下文件: /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 TYPE=Bridge BOOTPROTO=static ONBOOT=yes IPADDR=192.168.10.90 NETMASK=255.255.255.0 /etc/sysconfig/network-scripts/ifcfg-eth0 TYPE="Ethernet" BOOTPROTO="none" NAME="eth0" DEVICE="eth0" ONBOOT="yes" BRIDGE="br0" /etc/sysconfig/network-scripts/ifcfg-eth1 TYPE="Ethernet" BOOTPROTO="none" NAME="eth1" DEVICE="eth1" ONBOOT="yes" BRIDGE="br0" 这样,机器重启以后也会保留已配置好的网桥。 ...