利用 OpenWrt 实现无线路由器验证 H3C + SS

利用 OpenWrt 实现无线路由器验证 H3C + SS 智能翻墙
发表于 2015-11-30 | 分类于 工具 |
前言
今年防火墙貌似强大了不少,之前一直使用起来挺稳定的 GreenVPN 在校园网的环境下变得越来越难连接得上,上个月一怒之下在 DigitalOcean 买了个 San Francisco 的 VPS,幸好两年前的我机智地申请了 Github 的教育优惠大礼包,免费得到 50$ 的优惠卷,掐指算一下,应该能免费使用十个月的服务~
配合 Shadowsocks,自己持续用了一段时间,感觉是挺不错的,网络异常稳定,网速也能接近校园网峰值。但是,有一点不太满意,就是 iOS 系统上是没有 SS 客户端的(补充:利用 iOS9 新特性的 Surge 软件是可以走 SS 代理的),有时候躺在床上突然想 Google 一下,除非祈祷 iPhone 能连得上 GreenVPN,不然还得爬下来打开电脑,麻烦死了。
于是,上周末突然萌发了一个想法:改造升级一下自己一年多前在宿舍搭建的无线路由,使它能支持 SS 代理,那么连上 Wifi 的终端无需做任何设置就可以自由地访问国外的世界。想想都觉得兴奋,所以趁有时间赶紧弄,一开始原以为只需要在无线路由器上装一个 SS 客户端即可,但动手过程中发现它是不提供类似于 PC 上 SS 客户端所提供的 PAC 模式功能,也就是说,倘若要区分对待国内与国外网站的访问方式,转发规则还得自己想办法实现。
原理简介
根据网上的「GFW分析报告」,了解到 GFW 屏蔽的方式主要有 DNS 劫持,域名封锁、IP 封锁、关键字审查、暂时访问限制以及流量限制等等方式,而自己在解决 SS 代理区分国内外网站的问题下,需要解决的问题便是如何避免 DNS 劫持与 IP 封锁 。
对于 DNS 劫持问题,在 SourceForge 的一个名为 「OpenWrt-dist」 的项目上,用户 aa65535 提供了六种在 OpenWrt 系统上能防止 DNS 劫持的方案,而我所选择的方案大致上是符合其中方案四的思路的:使用 dnsmasq 搭配 SS 的 UDP 转发功能( ss-tunnel )进行 DNS 查询。
对于 IP 封锁问题,我选择的方案是配置 iptables 防火墙来转发 IP 地址,对局域网,亚洲以及 VPS 服务器的 IP 地址不作任何特殊处理,而对于其他 IP 地址的请求,转发到 SS 透明代理功能( ss-redir )所监听的端口,经由 SS 进行加密访问。
由于之前身边有些朋友会偶尔问我搭建验证 H3C 无线路由的方法,所以在这一篇博客中,顺便在开头讲一下无线路由验证 H3C 的步骤,以供参考。
准备清单
一台已刷 OpenWrt 的无线路由器;
一台搭载 Windows 操作系统的 PC;
一台已开启 ShadowSocks 服务端程序的国外 VPS 服务器。
补充说明:我所使用的路由器为 TP-LINK 旗下的

WR703N 型号 1.6 版本的无线路由器。
验证校园网 H3C
( 注:如果已熟悉 OpenWrt 系统,且已开启路由的无线功能,可直接跳到步骤 7 )
刚刷完 OpenWrt 的路由默认是不开启 Wifi 的,所以需要手动修改网络配置文件。由于还未设置密码,所以 dropbear( SSH 服务 )默认也不会开启,因此一开始我们需要利用 telnet 命令连接路由器。
使用 Telnet 连接路由器。首先用一根网线将路由器的 Lan 口与 PC 相连接,Windows 上设置为 DHCP 模式,添加 Telnet 服务,然后运行 cmd.exe,输入telnet 192.168.1.1。成功后会出现 OpenWrt 的欢迎界面:
设置 root 密码。输入passwd,填写密码,务必记住。设置成功后,dropbear 服务便开启了,我们就可以通过 SSH 来连接管理路由器了。输入exit退出 telnet 连接。
通过 PuTTY 工具的 SSH 方式来连接路由器。在 PuTTY 主界面上,Host Name 填上192.168.1.1,默认会选择 SSH 方式,然后直接按下 Open 按钮即可,如下图所示。填上用户名root以及密码,就会来到路由器的管理界面。
修改网络配置文件。
修改 wireless 文件。输入vi /etc/config/wireless,利用#符号注释掉option disabled 1。然后在wifi-iface下添加option ssid ***(指 Wifi 名)、option encryption psk2( 指 Wifi 加密方式 )以及option key ***( 指 Wifi 密码 )的信息,可参考下图:
修改 network 文件。输入vi /etc/config/network,利用#符号注释掉option ifname 'eth0'。然后增加 wan 接口,即config interface 'wan',在里面填上option ifname 'eth0'以及option proto 'dhcp',可参考下图:
使更改的网络配置生效。输入/etc/init.d/network restart,使配置生效。到了这一步,我们就成功开启路由器的无线功能了。
测试 Wifi 功能。重启路由器,PC 用无线的方式连接路由器,测试连通性。若无问题,可继续下一步。
安装 H3C 验证程序。
下载 H3C 验证程序。综合考虑下,我选择了我们中大一位师兄用纯 C 语言所改写的 CLI H3C Client( Github 地址 ),理由是体积小且运行稳定,在这里我默默地给师兄点个赞。当然,该软件并不一定适合你所处的环境,要根据不同的校园网环境选择不同的验证程序,具体可 Google 一下。
使用 WinSCP 工具传输 IPK 安装文件到路由器。WinSCP 具体使用方法在这里不详细讲了,挺简单的。需要注意的是,文件协议要选择SCP,且尽量把传入的文件放在路由器/tmp目录下吧。
使用 opkg 命令安装 IPK 文件。依然选择 PuTTY 连接,到达安装文件所在目录下,输入opkg install xxx.ipk,其中「xxx,ipk」指的是安装文件名。
测试命令。输入sysuh3c -h查看该命令各自参数所代表的功能,如下图所示,

同时也能检验是否安装成功。若无问题,可继续下一步。
使用 H3C 验证程序连接校园网。用一条网线将路由器的 Lan 口与校园网网线接口相连接,启动 H3C 验证程序。若是在中山大学校园网环境下,即输入命令sysuh3c -u username -p passwd -d。正常情况下,路由器应该就能连上校园网,并且能发射 Wifi 了~
优化:修改开机启动文件,使重新开机能自动认证。输入vi /etc/rc.local,在空白处加上验证命令。可参考下图:
SS智能翻墙

安装 Shadowsocks 客户端程序。推荐在 PC 上直接下载 IPK 安装文件,然后通过 WinSCP 工具传输文件到路由器,在 CLI 界面下,到达文件所在目录,输入opkg install ***.ipk。下载地址为这里。需要注意的是:
选择匹配芯片的软件安装包。你需要了解你路由器的芯片类型,根据不同的芯片类型选择不同的软件安装包,譬如说,我所使用的路由器 WR703N 需要选择 ar71xx 系列的软件安装包。
选择 shadowsocks-libev-spec 版本的 SS 安装包。有两种类型的 SS 安装包,分别是官方原版的shadowsocks-libev,以及针对 OpenWrt 的优化版本的shadowsocks-libev-spec,而我们需要后者的原因在于,接下来的步骤需要用到后者所提供的透明代理功能( ss-redir )以及 UDP 转发功能( ss-tunnel )。
根据 SSL 库选择相应的安装包。其实,根据依赖的 SSL 库可分为OpenSSL和PolarSSL两种版本。前者支持加密方式多但体积大,后者加密方式少但体积小,除此之外,并无差异,可在/usr/lib目录下查看路由器预装的 SSL 库进行选择。
修改 Shadowsocks 配置文件。输入vi /etc/shadowsocks.json进行修改,可参考以下代码:
1
2
3
4
5
6
7

{
"server":"***.**.*.**",
"server_port":****,
"local_port":8024,
"password":"WhatIsGFW",
"method": "aes-256-cfb"
}
其中,server所填写的 IP 为 VPS 的 IP,server_port所填写的端口号为 VPS 上开启 SS 服务的端口号,password为对应的密码,method为加密方式,这些信息都需要根据 VPS 上 SS 服务器所设置的进行填写。而local_port为用于透明代理的本地端口,,可自定义。
配置 dnsmasq。因为 OpenWrt 默认会自带 dnsmasq 软件,所以可以省略安装的步骤。
在/etc目录下新建dnsmasq.d文件夹:
root@OpenWrt:~# mkdir /etc/dnsmasq.d
修改配置文件dnsmasq.conf:
root@OpenWrt:~# echo "conf-dir=/etc/dnsmasq.d" >> /etc/dnsmasq.conf
下载国内域名加速列表( accelerated-domains.china.conf )和污染地址屏蔽列表( bogus-nxdomain.china.conf ),前者是国内访问网站的白名单,后者是污染 IP 的黑名单。OpenWrt 自带了wget软件,然而它是不支持 htt

ps 下载的版本,我们需要额外安装一个 GNU wget:
root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install wget
利用 wget 命令下载两个列表文件:
root@OpenWrt:~# wget -4 --no-check-certificate -O /etc/dnsmasq.d/accelerated-domains.china.conf https://https://www.360docs.net/doc/4711846658.html,/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf
root@OpenWrt:~# wget -4 --no-check-certificate -O /etc/dnsmasq.d/bogus-nxdomain.china.conf https://https://www.360docs.net/doc/4711846658.html,/felixonmars/dnsmasq-china-list/master/bogus-nxdomain.china.conf
补充:要是 opkg 不能顺利安装软件或者 wget 不能成功下载文件的话,可以选择另一种方式:利用 PC 直接下载,然后通过 WinSCP 传输两个文件到/etc/dnsmasq.d目录下。
在/etc/dnsmasq.d目录下新建gfwlist.conf,在文件中添加规则server=/#/127.0.0.1#7913。可用以下命令来实现:
root@OpenWrt:~# echo "server=/#/127.0.0.1#7913" > /etc/dnsmasq.d/gfwlist.conf
对于这一条规则,第一个#是通配符,代表所有域名。dnsmasq 匹配域名的特点是优先匹配具有详细特征的规则,因此会先匹配 accelerated-domains.china.conf 上的域名,如果都不匹配,再匹配gfwlist.conf文件下的这一条规则:转发到本地端口 7913 进行 DNS 查询。接下来的步骤我们会使用 ss-tunnel 来转发本地端口 7913 的 DNS 查询到 VPS。
补充:解释一下accelerated-domains.china.conf文件里面规则的含义,譬如,server=/https://www.360docs.net/doc/4711846658.html,/114.114.114.114,它的意思是访问以 「https://www.360docs.net/doc/4711846658.html,」 结尾的域名时,dnsmasq 会转发到国内的域名服务器 114.114.114.114 进行 DNS 查询。
配置 iptables。
在/usr/bin目录下新建shadowsocks-firewall文件,并修改权限:
root@OpenWrt:~# cd /usr/bin
root@OpenWrt:/usr/bin# touch shadowsocks-firewall
root@OpenWrt:/usr/bin# chmod +x shadowsocks-firewall
编辑shadowsocks-firewall文件,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72

#!/bin/sh
#create a new chain named SHADOWSOCKS
iptables -t nat -N SHADOWSOCKS
# Ignor

e your shadowsocks server's addresses
# It's very IMPORTANT, just be careful.
iptables -t nat -A SHADOWSOCKS -d xxx.xx.x.xx -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
# Ignore Asia IP address
iptables -t nat -A SHADOWSOCKS -d 1.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 14.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 27.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 36.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 39.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 42.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 49.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 58.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 59.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 60.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 61.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 101.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 103.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 106.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 110.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 111.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 112.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 113.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 114.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 115.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 116.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 117.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 118.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 119.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 120.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 121.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 122.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 123.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 124.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 125.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 126.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 169.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 175.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 180.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 182.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOC

KS -d 183.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 202.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 203.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 210.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 211.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 218.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 219.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 220.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 221.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 222.0.0.0/8 -j RETURN
iptables -t nat -A SHADOWSOCKS -d 223.0.0.0/8 -j RETURN
# Anything else should be redirected to shadowsocks's local port
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 8024
# Apply the rules
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
解释:对局域网,亚洲以及 VPS 服务器的 IP 地址不作任何特殊处理,而对于其他 IP 地址的请求,转发到 SS 透明代理功能( ss-redir )所监听的端口,经由 SS 进行加密访问。
注意:必须把上述内容第九行的xxx.xx.x.xx改为自己 VPS 服务器的 IP 地址。而倒数第三行中的端口号必须和 SS 配置文件shadowsocks.json里面的local_port的端口号一致。
修改 Shadowsocks 的启动文件。编辑/etc/init.d目录下shadowsocks文件的启动函数start以及关闭函数stop:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

start() {
echo "conf-dir=/etc/dnsmasq.d" >> /etc/dnsmasq.conf
/etc/init.d/dnsmasq restart
service_start /usr/bin/ss-redir -c /etc/shadowsocks.json
service_start /usr/bin/ss-tunnel -c /etc/shadowsocks.json -l 7913 -L 8.8.8.8:53 -u
/usr/bin/shadowsocks-firewall
}
stop() {
sed -i '/conf-dir=\/etc\/dnsmasq.d/d' /etc/dnsmasq.conf
/etc/init.d/dnsmasq restart
service_stop /usr/bin/ss-redir
service_stop /usr/bin/ss-tunnel
/etc/init.d/firewall restart
}
解释:利用 ss-tunnel 功能监听本地 7913 端口,转发分配到该端口的 UDP 请求到远端服务器来向 8.8.8.8 进行 DNS 查询。利用 ss-redir 功能,将从 iptables 转发到端口 8024 的 IP 地址请求通过 SS 加密访问。
启动 Shadowsocks 程序。到了这一步骤,路由器便配置完成了~赶紧开启 SS 程序测试一下吧:
root@OpenWrt:~# /etc/init.d/shadowsocks start
可以设置 shadowsocks 在路由器启动时自动启动:
root@OpenWrt:~# /etc/init.d/shadowsocks enable
遇到的问题
我觉得不同的路由器不同的 OpenWrt 固件版本,在配置过程中肯定会有不一样的问题。在这里,我列出我主要遇到的两个问题,以作参考:
iptables 加载 shadowsocks-firewall 文件时,提示找

不到--to-ports参数。
解决方案:安装iptables-mod-nat-extra模块。
开启 Shadowsocks 程序时,提示Segmentation fault。原因在于库文件libpolarssl版本过低。
解决方案:升级到新版本即可。反正我是升级到 1.3.8 版本就可以了。

相关文档
最新文档