Toby's 次元裂缝

DD-WRT 路由器配置全局 WireGuard VPN

WireGuard 是一个近来十分热门的 VPN 协议,特点是配置简单、性能优异。相比 OpenVPN 这类用 AES 为主的老牌协议,WireGuard 的 ChaCha20 在路由器、手机等低端硬件上能有数倍的性能提升。以我的 Asus RT-AC56R 为例,AES-128-CBC 的 OpenVPN 由于 CPU 加解密性能瓶颈只有可怜的 15-20 Mbps;而 WireGuard 能跑到 90-100 Mbps。这里不对 WireGuard 做过多介绍,关于如何架设服务端请见官方 Quick Start

配置隧道

DD-WRT 自 2018 年 1 月的版本 (34416) 就内置了 WireGuard 支持。不过和内置的 PPTP / OpenVPN 不太一样,设置页面不在 "Services" (服务) -> "VPN" 里,而是在 "Setup" (设置) -> "Tunnel" (隧道)

打开后在 "Protocol Type" (协议类型) 中可以看到 WireGuard 选项,然后按自己的配置填写并应用。

当然,这一步完成之后你的网络并不会就自动开始走 WireGuard 了。因为这里只是添加了 oet1 这个隧道,接下来还需要设置路由:

修改路由

接下来要做的是添加路由规则,让所有连接走且只走这个 WireGuard 隧道。

在 "Administration" (管理) -> "Commands" (命令) 中输入:

sleep 10
echo "Update route table on startup..."
WGSERVER=$(/usr/sbin/nvram get oet1_rem0)
WANGW=$(/usr/sbin/nvram get wan_gateway)
WANIF=$(/usr/sbin/nvram get wan_iface)
route add -host $WGSERVER gw $WANGW dev $WANIF
route del default
route add default dev oet1
ip route flush cache
mkdir -p /tmp/etc/config
ln -s /tmp/custom.sh /tmp/etc/config/wg-route-fix.wanup
echo "... Done route table update."

然后点击 "Save Startup" (保存为开机命令)。 这段的作用是在每次开机后将所有连接默认走 WAN 的规则改为走 oet1 这个 WireGuard 隧道。

再输入:

WANIF=$(/usr/sbin/nvram get wan_iface)
iptables -t nat -I POSTROUTING -o oet1 -j MASQUERADE
iptables -I FORWARD -i br0 -o $WANIF -m state --state NEW -j REJECT --reject-with icmp-host-prohibited
iptables -I FORWARD -i br0 -p tcp -o $WANIF -m state --state NEW -j REJECT --reject-with tcp-reset

"Save Firewall" (保存为防火墙规则)。添加隧道需要的 NAT 规则,并确保如果 WireGuard 连接意外中断也不会把流量直接漏给 WAN。如果不需要这个屏蔽机制,只添加:

iptables -t nat -I POSTROUTING -o oet1 -j MASQUERADE

就好。

最后输入:

#!/bin/sh
sleep 5
echo "Update route table on wanup ..."
WGSERVER=$(/usr/sbin/nvram get oet1_rem0)
WANGW=$(/usr/sbin/nvram get wan_gateway)
WANIF=$(/usr/sbin/nvram get wan_iface)
route add -host $WGSERVER gw $WANGW dev $WANIF
route del default
route add default dev oet1
ip route flush cache
echo "... Done route table update."

"Save Custom Script" (保存自定义脚本)。同样是设置隧道路由。

完毕后,还差最后一个步骤:修改 DNS。

DNS

前往 "Services" (服务),找到 DNSMasq 并禁用。DNSMasq 是 DD-WRT 内置的 DNS 缓存服务器,因为某种原因 (Bug?) 至少在我测试的 DD-WRT 版本即使将 DNS 设置为另外的服务器,查询依然有一定几率会走 WAN 分配的运营商默认 DNS...所以干脆完全关掉为妙。

然后在 "Setup" (设置) -> "Basic Setup" (基本设置) 中将 DHCP 的 Static DNS (静态 DNS) 设置为你想用的服务器,比如 1.1.1.1。

全部完成后重启路由器。如果配置无误,等待半分钟左右,网络就应该成功连通并全局走 WireGuard 隧道啦。可以通过 https://www.dnsleaktest.com/ 这个网站测试确认没有 DNS 泄露问题。

评论