校园网 IPv6 环境下的透明代理配置

基本思路

通过 shadow­socks 走 IPv6 渠道在路由器上建立一个透明代理,将全部收费地址范围的流量在路由器端重定向走透明代理,全部免费地址范围的流量继续走 IPv4 渠道。

在路由器上配置定时登录脚本防止 IP 网关中断 IPv4 连接,在路由器上利用 hosts 文件防止 DNS 污染。

服务器的配置

安装 shadowsocks:

$ echo "deb http://shadowsocks.org/debian wheezy main" >> /etc/apt/sources.list
$ wget -O- http://shadowsocks.org/debian/1D27208A.gpg | apt-key add -
$ apt-get update
$ apt-get install shadowsocks-libev

配置 shadowsocks,启用 IPv6 支持,使用 rc4-md5 加密算法:

$ vi /etc/shadowsocks-libev/config.json
{"server":["[::0]","0.0.0.0"],
    "server_port": 8080,
    "local_port": 1080,
    "password": "xxxxxxxx",
    "timeout": 60,
    "method": "rc4-md5",
}

注意,新版本的 shadowsocks 要同时启用 IPv4 与 IPv6 支持,需要使用 ["[::0]","0.0.0.0"] 这样的格式,而不仅仅是使用 "::" 这样的格式。使用 "::" 会导致 shadowsocks 只监听 IPv6,不监听 IPv4。

启动 shadowsocks 服务端:

$ /etc/init.d/shadowsocks-libev restart

至此,服务器配置完毕。

路由器的配置

编辑 shadowsocks 配置文件:

$ vi /etc/shadowsocks.json
{
    "server":" 服务器 IPv6 地址 ",
    "server_port":8080,
    "local":"0.0.0.0"
    "local_port":1080,
    "password":"xxxxxxxx"
    "timeout":60,
    "method":"rc4-md5",
}

配置 ss-iptables 转发脚本:

$ vi /usr/bin/ss-iptables
#!/bin/sh

# Create a new chain named SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS
iptables -t nat -F SHADOWSOCKS

# Ignore shadowsocks server's IPv4 addresses
# iptables -t nat -A SHADOWSOCKS -d [IP] -j RETURN

# Ignore LANs IP address
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

# Redirect all tcp traffic
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 1080

# Apply the rules
iptables -t nat -I PREROUTING -p tcp -j SHADOWSOCKS

将中间省略部分将免费地址范围以 网络号 / 网络掩码 的格式填入其中。

注意:iptables -t nat -A SHADOWSOCKS -d [IP] -j RETURN 这一句最好注释掉,因为 shadowsocks 走的是 IPv6 渠道,iptables 并不会处理 IPv6 流量,不注释掉这一句,从 IPv4 访问 shadowsocks 所在的服务器不会经过 shadowsocks 的处理,而是直接连接,没有开 IP 网关收费地址访问权限的话是无法访问的。这就意味着你不能直接在路由器内侧的电脑上直接 ssh 到服务器,必须手动开 IP 网关收费地址访问。对于非 IPv6 环境下的路由器才需要使用这一句确保 shadowsocks 能够直接走 IPv4 连接服务器,而不会被重定向到 shadowsocks 自身,导致循环。

设定可执行权限:

$ chmod +x /usr/bin/ss-iptables

修改 shadowsocks 启动脚本:

$ vi /etc/init.d/shadowsocks

注释掉 ss-lo­cal 并去掉 ss-redir 的注释,并加入 ss-iptables 脚本:

start() {
        #service_start /usr/bin/ss-local -c $CONFIG -b 0.0.0.0
        service_start /usr/bin/ss-redir -c $CONFIG -b 0.0.0.0
        #service_start /usr/bin/ss-tunnel -c $CONFIG -b 0.0.0.0 -l 5353 -L 8.8.8
        /usr/bin/ss-iptables
}

stop() {
        #service_stop /usr/bin/ss-local
        service_stop /usr/bin/ss-redir
        #service_stop /usr/bin/ss-tunnel
        /etc/init.d/firewall restart
}

为了解决 DNS 污染的问题,采用路由器端 hosts 文件的方式处理,这样可以保证墙内资源能够得到准确快速的解析结果,墙外资源得到正确的解析结果,从 这里 获得 hosts 文件,将文件编码从 UTF-8 with BOM 转换为 UTF-8,将换行符从CRLF 转换为LF,随后上传至路由器覆盖 /etc/hosts,也可以直接下载经过修改后的文件镜像:

$ wget --no-check-certificate https://darknode.in/i/hosts -O /etc/hosts

修改配置文件,使 hosts 生效:

$ vi /etc/config/dhcp

在 dnsmasq 段的末尾插入:

list addnhosts '/etc/hosts'

由于 shadowsocks 服务器地址为 IPv6 地址,shadowsocks 应在 IPv6 访问正常后再启动,编辑 rc.local

$ vi /etc/rc.local

在 exit 0 之前加入:

$ /etc/init.d/shadowsocks start

重启路由器:

$ reboot

至此,路由器端配置完成。