目录

配置基于Shadowsocks-libev的透明代理

通常我们访问外网是开放的,但在企业或机构内部,出于安全或其他原因,不是所有机器都有访问外网的权限。当这些机器有访问需求时,通过与代理服务器通信来实现间接访问。

代理一般有两种方案,方案一需要在客户端配置代理服务器信息,但这种方案不是所有软件都支持。另一种方案是代理在网关或路由器上自动处理,代理对客户端是透明的,故称为透明代理。

Shadowsocks-libev是一个轻量级的SOCKS5代理实现,本文讲述用Shadowsocks-libev来配置一个透明代理网关(路由器)的过程。

准备工作

本文在一台KVM虚拟机上来展示这个配置过程。

开始之前,先新建一个隔离的虚拟网络home-work,并关闭DHCP服务。该网络内的所有虚拟机都无法直接与外部连接,只能通过接下来配置的这台透明代理网关(路由器)来访问。

有关KVM虚拟网络的更多信息,可参阅: 用KVM虚拟机模拟网络环境

初始安装

创建一个虚拟机,操作系统为CentOS 7,配置两个网络接口:

  1. eth0,映射到虚拟网络home-work,配置静态IP:10.10.10.10/24;
  2. 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里,以实现开机可用。