DarkNode

Life, the Universe and Everything

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

本文发表于:
最后修改于:
分类:network
合计信息量:10.26kb

相关说明

服务器信息:

路由器信息:

基本思路

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

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

服务器的配置

安装 Shad­ow­socks:

$ echo "deb http://shad­ow­socks.org/de­bian wheezy main" >> /etc/apt/sources.list
$ wget -O- http://shad­ow­socks.org/de­bian/1D27208A.gpg | apt-key add -
$ apt-get up­date
$ apt-get in­stall shad­ow­socks-libev

配置 Shad­ow­socks,启用 IPv6 支持,使用 rc4-md5 加密算法:

$ vi /etc/shad­ow­socks-libev/con­fig.json
{
    "server":["[::0]","0.0.0.0"],
    "server_port": 8080,
    "lo­cal_port": 1080,
    "pass­word": "xxxxxxxx",
    "time­out": 60,
    "method": "rc4-md5",
}

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

启动 Shad­ow­socks 服务端:

$ /etc/init.d/shad­ow­socks-libev restart

至此,服务器配置完毕。

路由器的配置

创建/usr/bin/con­nect,用于连接 IP 网关免费地址范围:

$ vi /usr/bin/con­nect
#!/bin/sh
wget -Y off -T 10 -t 3 -O /dev/null --no-check-cer­tifi­cate "https://its.pku.edu.cn:5428/ip­gate­way­of­pku?uid=校园网账号&pass­word=校园网密码&range=2&op­er­a­tion=con­nect&time­out=1">/dev/null 2>&1

创建/usr/bin/dis­con­nect,用于中断 IP 网关全部连接:

$ vi /usr/bin/con­nect
#!/bin/sh
wget -Y off -T 10 -t 3 -O /dev/null --no-check-cer­tifi­cate "https://its.pku.edu.cn:5428/ip­gate­way­of­pku?uid=校园网账号&pass­word=校园网密码&range=2&op­er­a­tion=dis­con­nec­tall&time­out=1">/dev/null 2>&1

设定可执行权限:

$ chmod +x /usr/bin/con­nect
$ chmod +x /usr/bin/dis­con­nect

配置路由器启动后自动登录 IP 网关,编辑 rc.lo­cal

$ vi /etc/rc.lo­cal

在 exit 0 之前加入:

/usr/bin/dis­con­nect
/usr/bin/con­nect

查看/etc/init.d/cron

$ cat /etc/init.d/cron

检查是否有如下三条命令:

rm -rf /etc/crontabs/root
con­fig_load cron
con­fig_fore­ach task_get task

这三条命令会导致 crontab -e 添加的计划任务在 Open­Wrt 系统重启之后被清除,并加载/etc/con­fig/cron 中的配置项。

配置/etc/con­fig/cron 添加计划任务,每小时尝试连接一次 IP 网关,以确保连接持续稳定:

con­fig task
    op­tion en­abled '1'
    op­tion task_name 're­con­nect'
    op­tion task_Every­day '0'
    op­tion task_Mon­day '0'
    op­tion task_Tues­day '0'
    op­tion task_Wednes­day '0'
    op­tion task_Thurs­day '0'
    op­tion task_Fri­day '0'
    op­tion task_Sar­tu­day '0'
    op­tion task_Sun­day '0'
    op­tion task_time 'everyh_1'
    op­tion task_task '/usr/bin/con­nect'

如果/etc/init.d/cron 中没有上述三条命令,则可直接通过 crontab -e 创建计划任务:

$ crontab -e
0 */1 * * * /usr/bin/con­nect

注意 PKU 校园 IP 网关每日连接上限为 100 次,超过上限将导致 IP 网关无法登陆。

配置路由器 IPv6 访问,PKU 校内 静态 IPv6 地址 规则如下:

配置路由器启动后自动设置 IPv6 地址,编辑 rc.lo­cal

$ vi /etc/rc.lo­cal

在 exit 0 之前加入:

if­con­fig eth0.2 inet add 静态 IPv6 地址
route -A inet6 add ::/0 gw IPv6 网关地址

首先检查路由器固件中预装的 SSL 库:

$ opkg info *ssl

若提示中有如下字样,说明路由器固件中已经安装了 li­bopenssl

Pack­age: li­bopenssl
......
Sta­tus: in­stall ok in­stalled

若提示中有如下字样,说明路由器固件中已经安装了 lib­po­ralssl

Pack­age: lib­po­ralssl
......
Sta­tus: in­stall ok in­stalled

若无提示信息出现,则说明路由器固件中尚未安装 SSL 库。

最后,从 这里 寻找对应 Open­Wrt 版本与路由器架构下的 pack­ages 目录,下载最新版 kmod-ipt-nat-ex­tra 和 ipt­a­bles-mod-nat-ex­tra

将全部包上传到路由器上并安装:

$ opkg in­stall --force-de­pends *

编辑 Shad­ow­socks 配置文件:

$ vi /etc/shad­ow­socks.json
{
    "server":"服务器 IPv6 地址",
    "server_port":8080,
    "lo­cal":"0.0.0.0"
    "lo­cal_port":1080,
    "pass­word":"xxxxxxxx"
    "time­out":60,
    "method":"rc4-md5",
}

配置 ss-ipt­a­bles 转发脚本:

$ vi /usr/bin/ss-ipt­a­bles
#!/bin/sh

# Cre­ate a new chain named SHAD­OW­SOCKS
ipt­a­bles -t nat -N SHAD­OW­SOCKS
ipt­a­bles -t nat -F SHAD­OW­SOCKS

# Ig­nore shad­ow­socks server's IPv4 ad­dresses
# ipt­a­bles -t nat -A SHAD­OW­SOCKS -d [IP] -j RE­TURN

# Ig­nore LANs IP ad­dress
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 0.0.0.0/8 -j RE­TURN
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 10.0.0.0/8 -j RE­TURN
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 127.0.0.0/8 -j RE­TURN
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 169.254.0.0/16 -j RE­TURN
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 172.16.0.0/12 -j RE­TURN
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 192.168.0.0/16 -j RE­TURN
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 224.0.0.0/4 -j RE­TURN
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 240.0.0.0/4 -j RE­TURN

# Ig­nore CER­NET FREE IP ad­dress
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 1.8.1.0/255.255.255.0 -j RE­TURN
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 1.8.6.0/255.255.255.0 -j RE­TURN
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 1.8.8.0/255.255.254.0 -j RE­TURN
......
ipt­a­bles -t nat -A SHAD­OW­SOCKS -d 223.252.192.0/255.255.192.0 -j RE­TURN

# Redi­rect all tcp traf­fic
ipt­a­bles -t nat -A SHAD­OW­SOCKS -p tcp -j REDI­RECT --to-ports 1080

# Ap­ply the rules
ipt­a­bles -t nat -I PRE­ROUT­ING -p tcp -j SHAD­OW­SOCKS

将中间省略部分将免费地址范围以 网络号/网络掩码 的格式填入其中,注意 CER­NET 提供的 免费地址范围 与 PKU 官方提供的 免费地址范围 并不相同,推荐参考 PKU 官方提供的 免费地址范围,为了减少文件体积,可以使用十进制位掩码格式而不是十进制点分式数掩码格式,即将 1.8.1.0/255.255.255.0 表示为 1.8.1.0/24

另外也可以直接下载制作好的脚本:

$ wget --no-check-cer­tifi­cate https://dar­k­n­ode.in/i/ipt­a­bles -O /usr/bin/ss-ipt­a­bles

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

设定可执行权限:

$ chmod +x /usr/bin/ss-ipt­a­bles

修改 shad­ow­socks 启动脚本:

$ vi /etc/init.d/shad­ow­socks

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

start() {
        #ser­vice_start /usr/bin/ss-lo­cal -c $CON­FIG -b 0.0.0.0
        ser­vice_start /usr/bin/ss-redir -c $CON­FIG -b 0.0.0.0 
        #ser­vice_start /usr/bin/ss-tun­nel -c $CON­FIG -b 0.0.0.0 -l 5353 -L 8.8.8
        /usr/bin/ss-ipt­a­bles
}
        
stop() {                               
        #ser­vice_stop /usr/bin/ss-lo­cal
        ser­vice_stop /usr/bin/ss-redir  
        #ser­vice_stop /usr/bin/ss-tun­nel
        /etc/init.d/fire­wall restart
}

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

$ wget --no-check-cer­tifi­cate https://dar­k­n­ode.in/i/hosts -O /etc/hosts

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

$ vi /etc/con­fig/dhcp

在 dns­masq 段的末尾插入:

list addnhosts '/etc/hosts'

由于 Shad­ow­socks 服务器地址为 IPv6 地址,Shad­ow­socks 应在 IPv6 访问正常后再启动,编辑 rc.lo­cal

$ vi /etc/rc.lo­cal

在 exit 0 之前加入:

$ /etc/init.d/shad­ow­socks start

重启路由器:

$ re­boot

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