新剁手了一个Google Home mini,需要科学上网才能正常使用,而 home 本身不支持设置代理,所以需要在网关上动手。正好一直使用树莓派当路由器,所以尝试把树莓派打造成一个带有智能转发功能的透明网关,即国内的 IP 直连,海外的 IP 走代理加速。
配置无线网络
本文关注点不在此,所以一笔带过。
可以通过一键安装脚本 pi-setup-wifi.sh 来安装和配置树莓派的无线。该脚本会创建一个名为SSID
,密码为PASSWORD
的无线网络,使用的网段为 192.168.68/24
。
启动 DoH 服务来避免 DNS 污染
目前 GFW 大概有这么几个级别的干扰:
- 随机丢包、限速
- 域名阻断、IP阻断
- DNS 干扰
一般的网站都基本上处于1或2,一般来说只要 TCP/UDP 流量不直连就行,但是 Google 家的产品比较强,直接上了最高规格的屏蔽,即 DNS 解析污染。
出于性能和速度的考虑, DNS 协议使用了 UDP 这种不可靠的协议,这使得 DNS 解析污染出现,即被中间路由截获并返回了虚假的 IP 地址,因此我们需要建立一个可靠的 DNS 解析服务。
目前已经有很多解决方案,如基于 TCP 的 DNS 解析,但是由于 TCP 流量仍然能够被嗅探,所以出现了 DoH (DNS over Https),这样只要服务器没问题,返回的结果就一定是正确的。
本文权衡各工具,最后选择了 Cloudflare 家的 DoH服务。
首先到 下载页 下载 Binary: ARMv6
这一栏的压缩包,然后解压。
(被屏蔽了,需要用代理下载)
1 | tar -xzvf cloudflared-stable-linux-amd64.tgz |
然后把 cloudflared 移动到 /usr/local 目录下,并启动。
1 | /usr/local/cloudflared proxy-dns --address 0.0.0.0 --port 15353 |
只监听本地的话wifi客户端会有问题
5353 端口被 avahi 占用了,所以使用15353
你可以在 /etc/rc.local 文件中配置开机启动。
1 | nohup /usr/local/cloudflared proxy-dns --port 15353 & |
不同网络层之间协议转换
安装 redsocks
来把无线网卡的流量转发到 socks5 代理,这本质上是转换两个不同网络层的流量。
1 | sudo apt install -y redsocks |
编辑配置文件 /etc/redsocks.conf
1 | redsocks { |
这里的ip必须改成0.0.0.0,实测如果保留127.0.0.1会让wifi客户端无法上网
这里假设已经有一个开放在 1080 端口的 socks5 服务,可以使用 Shadowsocks
来创建一个。
重启 redsocks 以使配置生效
1 | sudo service redsocks restart |
忽略国内地址
安装 ipset
来生成国内地址列表
1 | sudo apt install -y ipset |
在系统重启后,使用如下命令来恢复ipset
1 | sudo ipset restore < /etc/chnroute.ipset |
使用 iptables 来转发流量
1 | sudo iptables -t nat -N SHADOWSOCKS |
覆盖设备自身的 DNS 服务器
因为 Google Home 内置了 DNS 服务器,而不是网关分配的,所以需要把流量截获然后转发到可靠的 DNS 解析。
1 | sudo iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 15353 |
至此,搭建完毕,将 Google Home 连接到 wifi 上,就可以开始欢快的使用各种服务啦^_^。
Hey, Google, nice to meet you ~