作为程序员的都知道,现在比较流行的科学上网方式是$$。$$搭建步骤简单,速度快,相比其他的科学上网方式比较轻量。但这种方式也有一些缺点,比如需要在本机安装客户端,维护服务端信息等缺点,路由器透明代理就是为了解决这些问题而诞生的 。
传统科学上网实现方式
传统的科学上网方式是在本机安装$$客户端,不同平台的客户端如下:
- IOS
- ShadowRocket(国区已下架)
- Surge(国区已下架)
- Mac OS
- Shadowsocks NG
- Surge
- ss-local
- Linux
- ss-local
- Windows
- Shadowsocks
代理模式
$$一般有两种代理模式,
自动切换模式
- 黑名单模式,只代理被墙的网站,对于名单中匹配的网站进行代理,如果不匹配则直接连接,比较著名的 有GFW List
- 白名单模式,默认代理,对于名单中匹配的网站进行直连。白名单模式在不同平台上的效果不同,在IOS可以实现白名单模式,在Mac OS 上只支持黑名单模式,如果要实现需要做一些hack操作,如:ShadowsocksX-NG实现白名单模式
全局模式
所有流量都走代理,这个在不同平台上表现也不同,在Mac os上只能代理部分流量,像CLI的流量需要额外配置。
传统代理模式的缺点
传统的代理模式的缺点也很明显:
- 需要安装客户端,且需要在所有客户端配置服务器信息
- 无法代理系统级流量或需要额外设置
- 无法实现大陆白名单模式(除了大陆以外的网站都走代理)
- 被屏蔽的网站越来越多,所有客户端都需要更新名单
路由器透明代理
路由器透明代理,说直白点就是在路由器实现科学上网功能。路由器透明代理的优点很明显,无需在本机安装客户端,只需在路由器维护服务器信息及黑白名单,且能代理系统级流量。
数据流逻辑图
如下图所示, 路由器透明代理主要是两个流程,DNS解析流程与流量代理流程。
实现原理
路由器透明代理主要依赖如下工具:
iptables
ipset
ss-redir
ss-tunnel
dnsmasq
dnsmasq
+ss-tunnel
dnsmasq
和ss-tunnel
主要是用来解决域名污染的问题, dnsmasq会将除了国内以外的DNS解析请求通过dnsmasq
会将国外域名dns解析请求通过ss-tunnel
转发到shadowsocks服务器ss-tunnel
转发到shadowsocks服务器
dnsmasq配置文件:
https://cokebar.github.io/gfwlist2dnsmasq/dnsmasq_gfwlist.conf
1 | server=/google.com/127.0.0.1#5353 |
如上面的代码所示,遇到如需要解析google.com
的域名时,dnsmasq会将解析请求转发到ss-tunnel
监听的5353端口,ss-tunnel
会将解析请求转发到远程服务器,通过远程服务器来解析域名。
不建议用上面的方法了,DNS污染太多太频繁,直接上DNS白名单模式:
1 | server=/baidu.cc/114.114.114.114 |
dnsmasq.conf
将ss-tunnel
设置为上游服务器
1 | no-resolv |
iptables+ipset
iptables
和ipset
主要用来区分国内流量和转发代理流量。
ipset
ipset.conf
1 | 1.0.1.0/24 |
shell:
1 | ipset create chnroute hash:net |
上面代码创建了一个名为chnroute
的IP集合。
iptables sample:
1 | iptables -t nat -N 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.
优点:
- 开源,维护者众多
- 插件众多,很多定制功能:广告过滤,文件共享等。
- 图形化管理界面
- OpenWrt x86 支持X86平台,可实现软路由。
缺点:
- 需要一点linux知识
路由器透明代理的不足
当然路由器透明代理也有其不足,路由器一般都是低功耗平台。以ac66u为例,大陆白名单模式下只能跑到30M的带宽,CPU占用已经是100%。
软路由
软路由顾名思义,就是在软件层面实现路由功能,基于x86平台,性能强大,解决硬路由性能不足的问题,这里就不多说了。