通常我们访问外网是开放的,但在企业或机构内部,出于安全或其他原因,不是所有机器都有访问外网的权限。当这些机器有访问需求时,通过与代理服务器通信来实现间接访问。
代理一般有两种方案,方案一需要在客户端配置代理服务器信息,但这种方案不是所有软件都支持。另一种方案是代理在网关或路由器上自动处理,代理对客户端是透明的,故称为透明代理。
Shadowsocks-libev是一个轻量级的SOCKS5代理实现,本文讲述用Shadowsocks-libev来配置一个透明代理网关(路由器)的过程。
本文在一台KVM虚拟机上来展示这个配置过程。
开始之前,先新建一个隔离的虚拟网络home-work,并关闭DHCP服务。该网络内的所有虚拟机都无法直接与外部连接,只能通过接下来配置的这台透明代理网关(路由器)来访问。
有关KVM虚拟网络的更多信息,可参阅: 用KVM虚拟机模拟网络环境。
创建一个虚拟机,操作系统为CentOS 7,配置两个网络接口:
为了不与后续的配置相互干扰,关闭系统的防火墙配置:
# systemctl stop firewalld # systemctl disable firewalld
一个最基本的网关(路由器)配置,只需两步:打开IP转发,开启SNAT。
开启IP转发:
# echo 1 > /proc/sys/net/ipv4/ip_forward
开启SNAT:
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
现在,home-work网络的机器就可以通过该网关上网了。当然,所有机器需要自己配置静态IP、子网掩码、DNS等所有网络参数,并把缺省路由指向该网关。
所以,一般网关(路由器)也提供DHCP服务,免除上述手工配置的烦恼。
我们使用dnsmasq来提供DHCP服务。
安装dnsmasq:
# yum install dnsmasq
编辑/etc/dnsmasq.conf,配置DHCP参数:
port=0 interface=eth0 dhcp-range=10.10.10.100,10.10.10.200,12h dhcp-option=option:dns-server,8.8.8.8,8.8.4.4
启动dnsmasq:
# systemctl enable dnsmasq # systemctl start dnsmasq
启用EPEL源:
# yum install epel-release
启用librehat-shadowsocks源:
# cd /etc/yum.repos.d/ # wget https://copr.fedorainfracloud.org/coprs/librehat/shadowsocks/repo/epel-7/librehat-shadowsocks-epel-7.repo
安装:
# yum install shadowsocks-libev
新建配置文件ss-redir.json,指定Shadowsocks服务器的地址、端口、密码、加密方式等参数,以及本地监听地址和端口:
{ "server": "ssserver_ip", "server_port": 18388, "local_address": "10.10.10.10", "local_port": 12345, "password": "password", "timeout": 300, "method": "aes-256-cfb", "mode": "tcp_and_udp" }
注意:ss-redir必须监听在eth0接口(10.10.10.10)或全部接口(0.0.0.0),但不能是Loopback接口(127.0.0.1),因为:
这里的“incoming interface”就是eth0,所以监听在Loopback是没用的。
启动ss-redir:
# ss-redir -c ss-redir.json -f /var/run/ss-redir.pid
将下面的ssserver_ip替换为真实的Shadowsocks服务器IP:
# Create new chain iptables -t nat -N SHADOWSOCKS # Ignore your shadowsocks server's addresses # It's very IMPORTANT, just be careful. iptables -t nat -A SHADOWSOCKS -d ssserver_ip -j RETURN # Ignore LANs and any other addresses you'd like to bypass the proxy # See Wikipedia and RFC5735 for full list of reserved networks. # See ashi009/bestroutetb for a highly optimized CHN route list. iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN # Anything else should be redirected to shadowsocks's local port iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345 # Apply the rules iptables -t nat -A PREROUTING -i eth0 -p tcp -j SHADOWSOCKS
所有的TCP流量都通过ss-redir转发到Shadowsocks服务器处理,这里Shadowsocks服务器才是幕后真正的代理服务器,所以Shadowsocks服务器必须能访问客户端需要的资源。
UDP的处理和TCP是不同的,这里只处理53端口的UDP流量:
# Create new chain iptables -t mangle -N SHADOWSOCKS # Add any UDP rules ip route add local default dev lo table 100 ip rule add fwmark 1 lookup 100 iptables -t mangle -A SHADOWSOCKS -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01 # Apply the rules iptables -t mangle -A PREROUTING -i eth0 -j SHADOWSOCKS
至此配置完成。
测试没有问题后,可将上述脚本整合在一起,放在/etc/rc.d/rc.local里,以实现开机可用。