作为程序员的都知道,现在比较流行的科学上网方式是$$。$$搭建步骤简单,速度快,相比其他的科学上网方式比较轻量。但这种方式也有一些缺点,比如需要在本机安装客户端,维护服务端信息等缺点,路由器透明代理就是为了解决这些问题而诞生的 。

传统科学上网实现方式

传统的科学上网方式是在本机安装$$客户端,不同平台的客户端如下:

  • IOS
    • ShadowRocket(国区已下架)
    • Surge(国区已下架)
  • Mac OS
    • Shadowsocks NG
    • Surge
    • ss-local
  • Linux
    • ss-local
  • Windows
    • Shadowsocks

代理模式

$$一般有两种代理模式,

  1. 自动切换模式

    • 黑名单模式,只代理被墙的网站,对于名单中匹配的网站进行代理,如果不匹配则直接连接,比较著名的 有GFW List
    • 白名单模式,默认代理,对于名单中匹配的网站进行直连。白名单模式在不同平台上的效果不同,在IOS可以实现白名单模式,在Mac OS 上只支持黑名单模式,如果要实现需要做一些hack操作,如:ShadowsocksX-NG实现白名单模式
  2. 全局模式

    所有流量都走代理,这个在不同平台上表现也不同,在Mac os上只能代理部分流量,像CLI的流量需要额外配置。

传统代理模式的缺点

传统的代理模式的缺点也很明显:

  1. 需要安装客户端,且需要在所有客户端配置服务器信息
  2. 无法代理系统级流量或需要额外设置
  3. 无法实现大陆白名单模式(除了大陆以外的网站都走代理)
  4. 被屏蔽的网站越来越多,所有客户端都需要更新名单

路由器透明代理

路由器透明代理,说直白点就是在路由器实现科学上网功能。路由器透明代理的优点很明显,无需在本机安装客户端,只需在路由器维护服务器信息及黑白名单,且能代理系统级流量。

数据流逻辑图

如下图所示, 路由器透明代理主要是两个流程,DNS解析流程与流量代理流程。
数据逻辑图

实现原理

路由器透明代理主要依赖如下工具:

  1. iptables
  2. ipset
  3. ss-redir
  4. ss-tunnel
  5. dnsmasq

dnsmasq+ss-tunnel

dnsmasqss-tunnel主要是用来解决域名污染的问题,dnsmasq会将国外域名dns解析请求通过ss-tunnel转发到shadowsocks服务器 dnsmasq会将除了国内以外的DNS解析请求通过ss-tunnel转发到shadowsocks服务器

dnsmasq配置文件:

https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist.conf

1
2
3
4
5
server=/google.com/127.0.0.1#5353
server=/google.co.ma/127.0.0.1#5353
server=/google.com.af/127.0.0.1#5353
server=/google.com.ag/127.0.0.1#5353
server=/google.com.ai/127.0.0.1#5353

如上面的代码所示,遇到如需要解析google.com的域名时,dnsmasq会将解析请求转发到ss-tunnel监听的5353端口,ss-tunnel会将解析请求转发到远程服务器,通过远程服务器来解析域名。

不建议用上面的方法了,DNS污染太多太频繁,直接上DNS白名单模式:

https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf

1
2
3
4
5
server=/baidu.cc/114.114.114.114
server=/baidu.cm/114.114.114.114
server=/baidu.com/114.114.114.114
server=/baidu.hk/114.114.114.114
server=/baidu.jp/114.114.114.114

dnsmasq.confss-tunnel设置为上游服务器

1
2
3
no-resolv
server=127.0.0.1#5353
conf-dir=/root/dnsmasq.d

iptables+ipset

iptablesipset主要用来区分国内流量和转发代理流量。

ipset

ipset.conf

1
2
3
4
5
1.0.1.0/24
1.0.2.0/23
1.0.8.0/21
1.0.32.0/19
...

shell:

1
2
ipset create chnroute hash:net
ipset -R < ipset.conf

上面代码创建了一个名为chnroute的IP集合。

iptables sample:
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
iptables -t nat -N SHADOWSOCKS
iptables -t mangle -N SHADOWSOCKS

# 直连服务器 IP
iptables -t nat -A SHADOWSOCKS -d [SS-SERVER-IP]/24 -j RETURN

# 允许连接保留地址
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

# 直连中国 IP
iptables -t nat -A SHADOWSOCKS -p tcp -m set --match-set chnroute dst -j RETURN
iptables -t nat -A SHADOWSOCKS -p icmp -m set --match-set chnroute dst -j RETURN

# 重定向到 ss-redir 端口
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 1080
iptables -t nat -A SHADOWSOCKS -p udp -j REDIRECT --to-ports 1080
iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS

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

上面代码的主要含义是:

  • 先判断是不是请求远程$$服务流量,如果是则直接放行
  • 如果是请求内网的流量也会直接放行
  • 如果是请求大陆网站的流量,则直接放行
  • 如果上面的条件都不匹配,则会将流量转发到本机ss-local监听的1080端口

ss-redir

ss-redir会监听端口,并将代理请求转发到$$服务器

路由器透明代理实现方式

一般高端一点的路由器都可以通过刷机来实现,以华硕路由器为例:

梅林固件

梅林固件华硕路由器第三方固件,基于华硕官方固件。这种方式你需要自己搭建整套工具,虽然网上也有一些一键安装的脚本,但与我们上面提到的有一些出入。

官网: https://asuswrt.lostrealm.ca/

优点:开源,基于华硕官方固件,比较稳定。

缺点:

  • 需要熟悉linux
  • 需要自己搭建且坑比较多
  • 定制差
  • 除华硕路由器外,只支持部分非华硕路由器

梅林小宝

梅林小宝是基于梅林的固件,这个实现方式比较傻瓜式,刷机完成后可通过在软件中心安装shadowsocks,配置一下服务器信息就可以实现路由器透明代理。

官网:http://koolshare.cn/forum-96-1.html

优点:

  • 无需自己搭建
  • 有图形化管理界面

缺点:

  • 闭源,存在风险
  • 除华硕路由器外,只支持部分非华硕路由器

OpenWrt

OpenWrt是开源的路由器固件,他能提供一整套linux操作环境,插件众多且大多数插件都提供图形管理界面,大大降低而搭建难度。
当然在刷机之前你需要在Table of Hardware 里查一下你的路由器是否支持openwrt.

官网:https://openwrt.org/

优点:

  • 开源,维护者众多
  • 插件众多,很多定制功能:广告过滤,文件共享等。
  • 图形化管理界面
  • OpenWrt x86 支持X86平台,可实现软路由。

缺点:

  • 需要一点linux知识

路由器透明代理的不足

当然路由器透明代理也有其不足,路由器一般都是低功耗平台。以ac66u为例,大陆白名单模式下只能跑到30M的带宽,CPU占用已经是100%。

软路由

软路由顾名思义,就是在软件层面实现路由功能,基于x86平台,性能强大,解决硬路由性能不足的问题,这里就不多说了。

参考

利用shadowsocks打造局域网翻墙透明网关

dnsmasq gfwlist

China IP List

https://www.v2ex.com/t/503057