1. 新搬了家,换成了联通的家用宽带,摆脱了之前无敌垃圾的宽带通.构建无墙方案又有了客观因素可以实施了
  1. 前些天由于进行了200Mbps的迅雷下载,居然把ac68u的cpu几乎跑满,瞬间感觉设备遇到了瓶颈,又有了升级理由,考虑之前一直心水的ubnt er-x
  1. 对于er-x这个设备的选型,之前有一个顾虑,就是对mtk这个不怎么高大上的厂商的mt7621方案的顾虑,之前使用过mt7620方案的路由器,印象很一般,但是调研之后,发现7621虽然看起来跟7620型号很相似,但是7621确实是mtk的旗舰级方案,并且配备了众多硬件加速芯片,事实上结果也并没让我失望,另一点,对于er-x原生使用dnsmasq很满意,此外作为准专业设备,可以直接通过命令行配置,在添加大量路由表的情况下,也是ui界面无法做到的方便

实现效果

通过以下配置,可以做到网络环境内设备的无感知翻墙,维护者只需要对域名列表做维护,既可实现翻墙,且翻墙设备故障后不影响正常的网络访问

流程图

ipset-fq

核心服务

翻墙无非要解决的就是两点问题:

  1. dns污染
  2. 通过代理访问被屏蔽的ip

为了解决这两点,我分别使用了dnsencryptshadowsocks-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 将gfwlist全部转换为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解析到的结果的缓存时间设置

参考文档及感谢

感谢以下博客的作者提供了思路和做法