Billy.Zheng 2016/07/24
本文基于网络上大量资料整理,恕在此不一一列举,没有大量网友的无私分享,就不会有这个文章。
本部署脚本原始基于华硕(ASUS) RT-AC66U MIPS 架构的路由器编写, 也在 RT-AC87U ARM 架构上实测成功. 本文章的部署策略通过修改应该也适用于 OpenWRT 及其他系统, 思路是一样的。
注意:
- 本文完全基于命令行操作,无任何 GUI 支持, 你需要具备一定的 CLI 操作能力,以及开启 SSH 自动登陆 (见下述)
- 请刷官方版的 asuswrt-merlin, 原始开发基于的版本为 Firmware:380.59, 请不要低于这个版本.
- 自动安装脚本需要 ssh 支持,如果你的操作主机是 Linux 或 Mac,应该完全没问题, 如果是 Windows,请百度自行解决。
使用目前最流行的白名单方式,通过维护一份国内网站域名列表dnsmasq-china-list, 实现国内域名跳过, 国外域名自动翻墙的代理
升级你的路由器最新版本的 asuswrt-merlin
具体操作, Window 下请百度自行解决.
Linux 下, 假设你的 U 盘驱动器设备为 /dev/sdd1
# mkfs.ext3 /dev/sdd1
注意!! 以上操作需谨慎, 盘符一定搞对, 等价于 Window 下的格式化操作, 本文不对因用户不了解造成的任何数据丢失, 承担责任!
将 U 盘插入到路由器 U 口上, 然后登陆路由器, 按照以下提示操作:
-
系统管理 => 系统设置
-
``Format JFFS partition at next boot
选择
是`。 -
Enable JFFS custom scripts and configs
选择是
。 -
Enable SSH
选择LAN+WAN
, 或者LAN
如果你只想通过网线联网时, 才登录 ssh. -
SSH Authentication key
, 将你的ssh公钥
粘帖到这里, 不懂啥是公钥, 请自行百度. -
最后, 点击
应用本页面设置
,等待提示完成后, 务必重新启动路由器, 确保再次进来时,Format JFFS partition at next boot
选项已经恢复成否
. -
测试 ssh 登录是否成功, 假设 192.168.1.1 是你的路由器 IP:
sh $ ssh [email protected]
如果出现了如下提示符, 进入下一步.ASUSWRT-Merlin RT-AC87U 380.65-0 Fri Feb 3 05:19:42 UTC 2017 admin@RT-AC87U-4A68:/tmp/home/root# admin@RT-AC87U-4A68:/tmp/home/root#
-
键入命令
entware-setup.sh
, 来初始化包管理系统 opkg.
admin@RT-AC66U-20F0:/tmp/home/root# entware-setup.sh
如果你的 U 盘分区格式没问题,这个脚本会出现类似如下提示让你选择:
admin@RT-AC66U-20F0:/tmp/mnt/sda/asusware/etc# entware-setup.sh
Info: This script will guide you through the Entware installation.
Info: Script modifies "entware" folder only on the chosen drive,
Info: no other data will be changed. Existing installation will be
Info: replaced with this one. Also some start scripts will be installed,
Info: the old ones will be saved on Entware partition with name
Info: like /tmp/mnt/sda1/jffs_scripts_backup.tgz
Info: Looking for available partitions...
[1] --> /tmp/mnt/sda
=> Please enter partition number or 0 to exit
[0-1]:
此时选择 1 即可, 等待 opkg 包管理安装完成后, exit
退出路由器.
提示: 如果因为各种原因, 之后有任何步骤执行失败, 可以重复执行本步骤, 再次部署, 注意每次初始化后, 需要手动点击重启路由器.
请注意: 下面的步骤是在你的本地主机上操作, 而不是在你的路由器上.
这里以克隆项目到你的 $HOME 下为例:
$ git clone [email protected]:zw963/asuswrt-merlin-transparent-proxy.git ~/asuswrt-merlin-transparent-proxy-master
不会用 Git 的同学, 可以从 这个地址 下载, 如果你使用 mac 或 linux, 使用下面的 curl 命令就足够了.
$: curl -L https://github.com/zw963/asuswrt-merlin-transparent-proxy/archive/master.zip > transparent-proxy.zip
$: unzip transparent-proxy.zip
Archive: transparent-proxy.zip
ee43fd6ad2aa2e890b7f792c309fa5e270442676
creating: asuswrt-merlin-transparent-proxy-master/
inflating: asuswrt-merlin-transparent-proxy-master/.gitignore
inflating: asuswrt-merlin-transparent-proxy-master/LICENSE
inflating: asuswrt-merlin-transparent-proxy-master/README.md
creating: asuswrt-merlin-transparent-proxy-master/functions/
inflating: asuswrt-merlin-transparent-proxy-master/functions/deploy_start.sh
inflating: asuswrt-merlin-transparent-proxy-master/generate_dns
creating: asuswrt-merlin-transparent-proxy-master/route/
creating: asuswrt-merlin-transparent-proxy-master/route/opt/
creating: asuswrt-merlin-transparent-proxy-master/route/opt/etc/
creating: asuswrt-merlin-transparent-proxy-master/route/opt/etc/dnsmasq.d/
extracting: asuswrt-merlin-transparent-proxy-master/route/opt/etc/dnsmasq.d/foreign_domains.conf
creating: asuswrt-merlin-transparent-proxy-master/route/opt/etc/init.d/
inflating: asuswrt-merlin-transparent-proxy-master/route/opt/etc/init.d/S22ss-tunnel
inflating: asuswrt-merlin-transparent-proxy-master/route/opt/etc/iptables.sh
inflating: asuswrt-merlin-transparent-proxy-master/route/opt/etc/patch_dnsmasq
inflating: asuswrt-merlin-transparent-proxy-master/route/opt/etc/restart_dnsmasq
inflating: asuswrt-merlin-transparent-proxy-master/ss+dnsmasq
inflating: asuswrt-merlin-transparent-proxy-master/ss+dnsmasq+chinadns
首先进入项目目录
$ cd ~/asuswrt-merlin-transparent-proxy-master
创建连接到墙外的跳板服务器的 shadowsocks.json 脚本. (可能是自己的 VPS 或 第三方收费 VPN)
$ touch route/opt/etc/shadowsocks.json
使用编辑器打开 shadowsocks.json, 内容示例如下, 具体内容请自行百度解决或向你的 VPN 提供商咨询. 如何在自己的 VPS 上部署 SS, 请参阅相关文章, 在此不再赘述.
// 这只是一个例子, 如果你要复制修改, 麻烦先手动删除所有 // 开头的注释!
{
"server":"123.123.123.123", // 这是你国外服务器地址(服务器上应该运行一个 shadowsocks server)
"server_port": 12345, // ss-server 监听的端口
"local_address":"192.168.1.1", // 确保这个地址设为你的路由器 ip 地址
"local_port": 1080, // 无需更改
"password": "yours_password", // ss-server 上设定的密码.
"timeout":600, // 不用改
"method":"rc4-md5" // ss-server 上设定的加密方式.
}
此时,在你的电脑上应该已经可以自动 ssh 登陆到你的路由器, 假设路由器 ip 地址是 192.168.1.1, 则在你的 宿主电脑上
执行以下命令.
$ ./ss+dnsmasq [email protected]
或
$ ./ss+dnsmasq+chinadns [email protected]
后者额外使用了 chinadns, 同时允许基于 IP 策略进行路由, 个人感觉不用 chinadns 速度更快一些, 推荐 ss+dnsmasq
方案.
脚本如果执行未出错,最后会看到 Rebooting, please wait ...
字样, 路由器自动重启, 基本上就成功了.
部署成功后, 请耐心等待重启, 部署后比未部署时, 启动时间要长一些(重启大概需要两分钟), 这是正常的, 请耐心等待, 但是访问 速度没有任何影响, 事实上, 通过路由 FQ 比在本机或浏览器做代理, 性能好很多.
如果你不想配置 SSH 自动登录, 又对这个脚本做了什么不太放心, 你可以选择手动部署.
- 请首先尝试读懂 部署脚本 中的命令在干什么.
- 将 route/ 目录下的文件, 就按照同样的目录结构, 使用 scp 复制到你的路由器.
- 部署脚本 中,
deploy_start
这行之后的内容 其实都在路由器中执行, 你可以研究下该命令在做什么, 然后自己通过ssh [email protected]
输入 login 密码登录后, 自己手动键入所需的命令, 一步一步来完成它.
第一步: 访问 http://ip138.com, 你会看到如下提示:
您的IP是:[***.***.***.*** ] 来自:上海市浦东新区 电信
这证明此时, 访问国内的网站 (例如 ip138.com ), 直接走的运营商线路.
第二步. 访问万能的谷歌!! 搜索框中, 输入: my ip
, 如果能出结果 ......
恭喜你, 你的各种手机, 电脑, 平板, 可以尝试去体验下无缝的浏览自由世界的乐趣了!!
如果部署出现问题,可以选择以下步骤进行恢复:
- 请拔掉 U 盘后重启路由器, 路由器应该会恢复为未翻墙的状态, 通过 ssh 连入, 查看 jffs 下是否有脚本编写错误.
- 如果以上步骤无效, 按下蓝色网线口旁边的那个小洞中的初始化按钮,保持不放(你可能需要借助于牙签之类的物件来操作), 看到电源的小蓝灯开始有规律的闪烁, 放开手, 此时会看到蓝色的灯在不断的发生变化, 待变化稳定之后, 路由器已被还原到出厂设置, 重新连接到路由器, 重新部署即可.
- 路由器启动 ss-redir, 连接远程 ss-server, 并监听 1080 端口.
- 路由器启动 ChinaDNS, 监听 5356 端口. (可选)
- 使用 dnsmasq-china-list 项目中提供的(accelerated-domains.china.conf) 作为 DNS 白名单。 所有在白名单中的域名, 跳过代理, 剩下的通过代理访问, 可参阅 foreign_domains.conf.
- 对 accelerated-domains.china.conf 进行批量替换,生成和白名单条目一一对应的 accelerated-domains-ipset.china.conf 文件.
- 访问一个网址时, 如果域名在这个白名单中,dnsmasq 会将这些国内的域名 IP 加入一个叫做 FREEWEB 的 ipset, 这些是我们可以自由访问的 IP.
- iptables 中指定,如果访问的 IP 属于 FREEWEB , 则跳过代理直接放行,否则,将流量转发到 ss-redir.(1080端口)
- iptables 中指定,如果访问的 IP 是本地 IP, 也是直接放行.
一些更加具体的设定问题,请查看这个 issue 中的讨论. https://github.com/onlyice/asus-merlin-cross-the-gfw/issues/5#issuecomment-234708422
- 采用
域名白名单
机制,相比较黑名单机制来说, 周期性变动不大,并且由 dnsmasq-china-list 维护,方便更新。 - 省略了在 iptables 中加入大量国内的 IP 段,常常难以维护, 因为我们已经有域名白名单了,当访问白名单中的网站时,dnsmasq 会帮我们维护这个列表。
dnsmasq-china-list 的白名单已经有 3W 多条了,因为 ipset 缘故,又加了 3W 多条 ipset 策略, 总共 7W 条规则让 dnsmasq 负载变重。 因此路由器启动时, 会稍稍变慢, 不过在使用时, 在我的 rt-ac66u 之上,看起来完全没有影响, 看 youtube, cpu 基本上小于 4%, 内存稳定在 10m 左右, 没什么瓶颈,就是不知道 dnsmasq 支持的条数是否存在上限 ...
本文受到了大量网友文章的启发,并综合了各种信息,加以整理而成,无法一一感谢,仅列取最近部分的一些连接。
使用ipset让openwrt上的shadowsocks更智能的重定向流量
感谢以下 Wonderful 项目的不断努力,才让我们探索自由,科学上网的愿望变为现实。
新增最新版(v3.0.6)的 shadowsocks-libev 服务器端部署脚本, 方便不会在服务器上配置 ss 的朋友.
未充分测试, 但是应该在 Centos 7, 较新版本的 openSUSE 与 Ubuntu 16.04 下完美工作. 这个版本的 shadowsocks-libev 依赖 mbedtls, Ubuntu 14.04 没有提供这个包, 因此不再考虑之列.
操作步骤如下:
- 购买一台可以连接外网的 VPS.
- 确保可以 root 登录.
- 参照部署脚本中的注释, 修改
你的密码
为 ss-server 所需真实密码, 稍后路由器连接需要这个密码. - 假设你的 VPS IP 地址是: 123.123.123.123, 运行:
./ss-server_install [email protected]
等待完成.
补充:
基于你选择的服务商, 如果是 Centos 7 可能需要手动添加 epel
的 source 进来, 否则找不到 mbedtls-devel
这个包.
$: rpm -ivh http://download.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
然后重新运行部署脚本.
有问题, 提 issue, 会不定期解决.