channing / asuswrt-merlin-transparent-proxy

transparent proxy base on ss, ipset, iptables, chinadns on asuswrt merlin.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

使用华硕 merlin 架设透明代理

Billy.Zheng 2016/07/24

本文基于网络上大量资料整理,恕在此不一一列举,没有大量网友的无私分享,就不会有这个文章。

本部署脚本原始基于华硕(ASUS) RT-AC66U MIPS 架构的路由器编写, 也在 RT-AC87U ARM 架构上实测成功. 本文章的部署策略通过修改应该也适用于 OpenWRT 及其他系统, 思路是一样的。

注意:

  1. 本文完全基于命令行操作,无任何 GUI 支持, 你需要具备一定的 CLI 操作能力,以及开启 SSH 自动登陆 (见下述)
  2. 请刷官方版的 asuswrt-merlin, 原始开发基于的版本为 Firmware:380.59, 请不要低于这个版本.
  3. 自动安装脚本需要 ssh 支持,如果你的操作主机是 Linux 或 Mac,应该完全没问题, 如果是 Windows,请百度自行解决。

目的

使用目前最流行的白名单方式,通过维护一份国内网站域名列表dnsmasq-china-list, 实现国内域名跳过, 国外域名自动翻墙的代理

使用本脚本部署的前置条件

升级你的路由器最新版本的 asuswrt-merlin

寻找一个 U 盘, 容量不限, 格式化这个 U 盘到 ext3 分区.

具体操作, Window 下请百度自行解决.

Linux 下, 假设你的 U 盘驱动器设备为 /dev/sdd1

# mkfs.ext3 /dev/sdd1

注意!! 以上操作需谨慎, 盘符一定搞对, 等价于 Window 下的格式化操作, 本文不对因用户不了解造成的任何数据丢失, 承担责任!

初始化 jffs.

将 U 盘插入到路由器 U 口上, 然后登陆路由器, 按照以下提示操作:

  1. 系统管理 => 系统设置

  2. ``Format JFFS partition at next boot选择是`。

  3. Enable JFFS custom scripts and configs 选择

  4. Enable SSH 选择 LAN+WAN, 或者 LAN 如果你只想通过网线联网时, 才登录 ssh.

  5. SSH Authentication key, 将你的 ssh公钥 粘帖到这里, 不懂啥是公钥, 请自行百度.

  6. 最后, 点击 应用本页面设置,等待提示完成后, 务必重新启动路由器, 确保再次进来时, Format JFFS partition at next boot 选项已经恢复成 .

  7. 测试 ssh 登录是否成功, 假设 192.168.1.1 是你的路由器 IP: sh $ ssh admin@192.168.1.1 如果出现了如下提示符, 进入下一步.

     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#
    
  8. 键入命令 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 退出路由器.

提示: 如果因为各种原因, 之后有任何步骤执行失败, 可以重复执行本步骤, 再次部署, 注意每次初始化后, 需要手动点击重启路由器.

使用本脚本一键部署

请注意: 下面的步骤是在你的本地主机上操作, 而不是在你的路由器上.

clone 项目到你的本地

这里以克隆项目到你的 $HOME 下为例:

$ git clone git@github.com: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  

新增你的 shadowsocks.json 配置脚本

首先进入项目目录

$ 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 admin@192.168.1.1

$ ./ss+dnsmasq+chinadns admin@192.168.1.1

后者额外使用了 chinadns, 同时允许基于 IP 策略进行路由, 个人感觉不用 chinadns 速度更快一些, 推荐 ss+dnsmasq 方案.

脚本如果执行未出错,最后会看到 Rebooting, please wait ... 字样, 路由器自动重启, 基本上就成功了.

部署成功后, 请耐心等待重启, 部署后比未部署时, 启动时间要长一些(重启大概需要两分钟), 这是正常的, 请耐心等待, 但是访问 速度没有任何影响, 事实上, 通过路由 FQ 比在本机或浏览器做代理, 性能好很多.

手动部署

如果你不想配置 SSH 自动登录, 又对这个脚本做了什么不太放心, 你可以选择手动部署.

  1. 请首先尝试读懂 部署脚本 中的命令在干什么.
  2. 将 route/ 目录下的文件, 就按照同样的目录结构, 使用 scp 复制到你的路由器.
  3. 部署脚本 中, deploy_start 这行之后的内容 其实都在路由器中执行, 你可以研究下该命令在做什么, 然后自己通过 ssh admin@192.168.1.1 输入 login 密码登录后, 自己手动键入所需的命令, 一步一步来完成它.

如何知道我部署成功了?

第一步: 访问 http://ip138.com, 你会看到如下提示:

您的IP是:[***.***.***.*** ] 来自:上海市浦东新区 电信

这证明此时, 访问国内的网站 (例如 ip138.com ), 直接走的运营商线路.

第二步. 访问万能的谷歌!! 搜索框中, 输入: my ip, 如果能出结果 ......

恭喜你, 你的各种手机, 电脑, 平板, 可以尝试去体验下无缝的浏览自由世界的乐趣了!!

如果部署出现问题,可以选择以下步骤进行恢复:

  1. 请拔掉 U 盘后重启路由器, 路由器应该会恢复为未翻墙的状态, 通过 ssh 连入, 查看 jffs 下是否有脚本编写错误.
  2. 如果以上步骤无效, 按下蓝色网线口旁边的那个小洞中的初始化按钮,保持不放(你可能需要借助于牙签之类的物件来操作), 看到电源的小蓝灯开始有规律的闪烁, 放开手, 此时会看到蓝色的灯在不断的发生变化, 待变化稳定之后, 路由器已被还原到出厂设置, 重新连接到路由器, 重新部署即可.

基本思路

  1. 路由器启动 ss-redir, 连接远程 ss-server, 并监听 1080 端口.
  2. 路由器启动 ChinaDNS, 监听 5356 端口. (可选)
  3. 使用 dnsmasq-china-list 项目中提供的(accelerated-domains.china.conf) 作为 DNS 白名单。 所有在白名单中的域名, 跳过代理, 剩下的通过代理访问, 可参阅 foreign_domains.conf.
  4. 对 accelerated-domains.china.conf 进行批量替换,生成和白名单条目一一对应的 accelerated-domains-ipset.china.conf 文件.
  5. 访问一个网址时, 如果域名在这个白名单中,dnsmasq 会将这些国内的域名 IP 加入一个叫做 FREEWEB 的 ipset, 这些是我们可以自由访问的 IP.
  6. iptables 中指定,如果访问的 IP 属于 FREEWEB , 则跳过代理直接放行,否则,将流量转发到 ss-redir.(1080端口)
  7. iptables 中指定,如果访问的 IP 是本地 IP, 也是直接放行.

一些更加具体的设定问题,请查看这个 issue 中的讨论. https://github.com/onlyice/asus-merlin-cross-the-gfw/issues/5#issuecomment-234708422

相比较其他方案的优缺点

优点

  1. 采用 域名白名单 机制,相比较黑名单机制来说, 周期性变动不大,并且由 dnsmasq-china-list 维护,方便更新。
  2. 省略了在 iptables 中加入大量国内的 IP 段,常常难以维护, 因为我们已经有域名白名单了,当访问白名单中的网站时,dnsmasq 会帮我们维护这个列表。

缺点

dnsmasq-china-list 的白名单已经有 3W 多条了,因为 ipset 缘故,又加了 3W 多条 ipset 策略, 总共 7W 条规则让 dnsmasq 负载变重。 因此路由器启动时, 会稍稍变慢, 不过在使用时, 在我的 rt-ac66u 之上,看起来完全没有影响, 看 youtube, cpu 基本上小于 4%, 内存稳定在 10m 左右, 没什么瓶颈,就是不知道 dnsmasq 支持的条数是否存在上限 ...

感谢

本文受到了大量网友文章的启发,并综合了各种信息,加以整理而成,无法一一感谢,仅列取最近部分的一些连接。

使用 Asus Merlin 实现路由器翻墙

使用ipset让openwrt上的shadowsocks更智能的重定向流量

利用ipset进行选择性的翻墙

shadowsocks-libev README 文档

如何在路由器中实现透明代理?

ss-redir 的 iptables 配置(透明代理)

搭建智能翻墙路由器

感谢以下 Wonderful 项目的不断努力,才让我们探索自由,科学上网的愿望变为现实。

Shadowsocks-libev

ChinaDNS

dnsmasq-china-list

asuswrt-merlin

Entware-ng

其他

新增最新版(v3.0.6)的 shadowsocks-libev 服务器端部署脚本, 方便不会在服务器上配置 ss 的朋友.

未充分测试, 但是应该在 Centos 7, 较新版本的 openSUSE 与 Ubuntu 16.04 下完美工作. 这个版本的 shadowsocks-libev 依赖 mbedtls, Ubuntu 14.04 没有提供这个包, 因此不再考虑之列.

操作步骤如下:

  1. 购买一台可以连接外网的 VPS.
  2. 确保可以 root 登录.
  3. 参照部署脚本中的注释, 修改 你的密码 为 ss-server 所需真实密码, 稍后路由器连接需要这个密码.
  4. 假设你的 VPS IP 地址是: 123.123.123.123, 运行: ./ss-server_install root@123.123.123.123 等待完成.

补充:

基于你选择的服务商, 如果是 Centos 7 可能需要手动添加 epel 的 source 进来, 否则找不到 mbedtls-devel 这个包.

$: rpm -ivh http://download.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

然后重新运行部署脚本.

有问题, 提 issue, 会不定期解决.

使用华硕 merlin 架设离线下载服务器

About

transparent proxy base on ss, ipset, iptables, chinadns on asuswrt merlin.

License:MIT License


Languages

Language:Shell 100.0%