====== 配置基于Shadowsocks-libev的透明代理 ====== 通常我们访问外网是开放的,但在企业或机构内部,出于安全或其他原因,不是所有机器都有访问外网的权限。当这些机器有访问需求时,通过与代理服务器通信来实现间接访问。 代理一般有两种方案,方案一需要在客户端配置代理服务器信息,但这种方案不是所有软件都支持。另一种方案是代理在网关或路由器上自动处理,代理对客户端是透明的,故称为透明代理。 [[https://github.com/shadowsocks/shadowsocks-libev|Shadowsocks-libev]]是一个轻量级的SOCKS5代理实现,本文讲述用Shadowsocks-libev来配置一个透明代理网关(路由器)的过程。 ===== 准备工作 ===== 本文在一台KVM虚拟机上来展示这个配置过程。 开始之前,先新建一个隔离的虚拟网络home-work,并关闭DHCP服务。该网络内的所有虚拟机都无法直接与外部连接,只能通过接下来配置的这台透明代理网关(路由器)来访问。 {{:computer:net:home-work.png}} 有关KVM虚拟网络的更多信息,可参阅:[[:computer:env:net_simulation | 用KVM虚拟机模拟网络环境]]。 ===== 初始安装 ===== 创建一个虚拟机,操作系统为CentOS 7,配置两个网络接口: - eth0,映射到虚拟网络home-work,配置静态IP:10.10.10.10/24; - eth1,映射到物理机外网,自动获取IP,是home-work网络的出口。 为了不与后续的配置相互干扰,关闭系统的防火墙配置: # 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 ===== 配置透明代理 ===== ==== 安装Shadowsocks-libev ==== 启用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 ==== 新建配置文件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),因为: REDIRECT is exactly equivalent to doing DNAT to the address of the incoming interface. 这里的“incoming interface”就是eth0,所以监听在Loopback是没用的。 启动ss-redir: # ss-redir -c ss-redir.json -f /var/run/ss-redir.pid ==== 配置TCP代理 ==== 将下面的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代理 ==== 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里,以实现开机可用。 {{tag>Shadowsocks proxy}}