- 新搬了家,换成了联通的家用宽带,摆脱了之前无敌垃圾的宽带通.构建无墙方案又有了客观因素可以实施了
- 前些天由于进行了200Mbps的迅雷下载,居然把ac68u的cpu几乎跑满,瞬间感觉设备遇到了瓶颈,又有了升级理由,考虑之前一直心水的ubnt er-x
- 对于er-x这个设备的选型,之前有一个顾虑,就是对mtk这个不怎么高大上的厂商的mt7621方案的顾虑,之前使用过mt7620方案的路由器,印象很一般,但是调研之后,发现7621虽然看起来跟7620型号很相似,但是7621确实是mtk的旗舰级方案,并且配备了众多硬件加速芯片,事实上结果也并没让我失望,另一点,对于er-x原生使用dnsmasq很满意,此外作为准专业设备,可以直接通过命令行配置,在添加大量路由表的情况下,也是ui界面无法做到的方便
实现效果
通过以下配置,可以做到网络环境内设备的无感知翻墙,维护者只需要对域名列表做维护,既可实现翻墙,且翻墙设备故障后不影响正常的网络访问
流程图
核心服务
翻墙无非要解决的就是两点问题:
- dns污染
- 通过代理访问被屏蔽的ip
为了解决这两点,我分别使用了dnsencrypt
和shadowsocks-libev
dnsencrypt
无需细说,直接搭建并找到合适的服务器即可使用(我是用的cisco的服务),但是也计划将此服务实现的功能合并通过shadowsocks-libev完成,结构越简单,可靠性越高
shadowsocks-libev
使用的是官方推荐的一个较为高级的用法,核心是ss-redir
,具体搭建方法可以参考文档的Transparent proxy
部分: https://github.com/shadowsocks/shadowsocks-libev
我使用树莓派2b来作为以上两个服务的载体,性能足够,实际测试在翻墙服务端连接状况良好的情况下,youtube 4k是无压力的
调度工具为dnsmasq,通过制定策略,实现域名的分开解析,避免了国内服务使用国外dns解析到国外cdn的尴尬,解析这一步,本人的原则为宁可不完善,也不可泛滥,即可以接受一些域名被污染,也不接受大量域名依赖翻墙服务.因为我认为各种国内外域名名单及gfwlist是不够准确的
流程实现
个人是很不喜欢将ss服务跑在路由上的,路由器的孱弱的cpu我认为并不适合跑这类服务,乖乖做好路由功能就好,ss服务的性能消耗影响了路由器网络质量就有点得不偿失
此流程实现的核心在于ipset
,通过此工具,可以将dnsmasq
解析到的地址添加到一个firewall group
中,再通过防火墙策略,匹配group
中的ip地址,如果符合则附加路由规则, 指定下一跳地址到翻墙终端,实现翻墙
ipset
依赖2.66以后版本的dnsmasq
,最新的edgeos
版本为v1.10.3,已经内置了2.78版本的dnsmasq
,所以省去了编译的流程,直接使用既可
配置不多,参照以下
树莓派已经固定了ip地址,为10.0.0.3
# 创建firewall group,并通过ipset将地址添加到此group,此处写出两条作为实例,扩展方法后面讲
set firewall group address-group CROSS_WALL_SET
set service dns forwarding options server=/google.com/10.0.0.3
set service dns forwarding options ipset=/google.com/CROSS_WALL_SET
set service dns forwarding options server=/twitter.com/10.0.0.3
set service dns forwarding options ipset=/twitter.com/CROSS_WALL_SET
# 创建一条static table,内容为指定下一跳地址为10.0.0.3
set protocols static table 1 route 0.0.0.0/0 next-hop 10.0.0.3
# 创建防火墙规则,将符合firewall group中的ip按照刚才配置的static table走
set firewall modify AUTO_VPN rule 20 action modify
set firewall modify AUTO_VPN rule 20 destination group address-group CROSS_WALL_SET
set firewall modify AUTO_VPN rule 20 modify table 1
set firewall modify AUTO_VPN rule 20 protocol all
# 将防火墙规则应用到switch0虚拟接口,即路由器的lan区域
set interfaces switch switch0 firewall in modify AUTO_VPN
通过以上流程既可完成对路由器的配置,如果想手动维护域名,只需要将要翻墙的域名转换为dnsmasq
命令(一条解析及一条ipset
为一组)继续添加既可,如果想大而全,可以通过此github项目https://github.com/smallfount/gfwlist2dnsmasq 将gfwli
st全部转换为dnsmasq
配置,具体对于性能的损耗暂时还没有调研
如果开启了vlan
需要额外设置
set firewall source-validation disable
并且在对应的vlan中应用防火墙规则
set interfaces ethernet eth1 vif 10 firewall in modify AUTO_VPN
参考:https://help.ui.com/hc/en-us/articles/360005460813-UniFi-USG-Advanced-Policy-Based-Routing-
流程验证
配置完成后,尝试解析一个规则内的域名,解析完成后,通过一下命令来查看firewall group
中的地址列表变更情况
show firewall group CROSS_WALL_SET
将firewall group
中的地址进行traceroute,并检查路由,如果顺利的到了翻墙服务器,则流程走通
todo
- 对
dnsmasq
解析到的结果的缓存时间设置
参考文档及感谢
感谢以下博客的作者提供了思路和做法
- https://xiaoding.org/?p=391
- https://sskaje.me/misc/ubnt/page/2/
- https://help.ubnt.com/hc/en-us/articles/204952274-EdgeRouter-Policy-based-routing-source-address-based-
- https://help.ubnt.com/hc/en-us/articles/205223470-EdgeRouter-Policy-based-routing-for-destination-port
- https://51mx.xyz/2016/03/22/fq-edgeos/