WireGuard 分流(AllowedIPs)
在 WireGuard 中,AllowedIPs 参数同时充当 ACL 过滤器和路由表。NetRoute Pro 从任何网站的域名生成可直接粘贴的 AllowedIPs 字符串 — 无需额外的 ip route 命令,只需编辑对端配置并重新加载。
命令语法
语法:
AllowedIPs = <CIDR1>, <CIDR2>, <CIDR3>
示例:
AllowedIPs = 1.1.1.0/24, 8.8.8.0/24, 162.159.0.0/16
添加到 wg0.conf 的 [Peer] 部分。详见 WireGuard 官方 quickstart。
准备工作
- 任何 WireGuard 客户端:
- Linux 上的
wg-quick - Windows/macOS 上的 WireGuard GUI
- Android/iOS 移动应用
- 支持 WireGuard 的路由器(OpenWrt、MikroTik、Keenetic 等)
- Linux 上的
- 已安装 NetRoute Pro Chrome 扩展
- 对 WireGuard 对端配置的编辑权限
步骤 1. 在 NetRoute Pro 中生成 AllowedIPs
- 在 Chrome 中打开目标网站
- 点击扩展栏中的 NetRoute Pro 图标
- 选择 WireGuard 平台
- 点击 Analyze Website
- 复制 AllowedIPs 行
步骤 2. 粘贴到对端配置
Linux (wg-quick)
编辑 /etc/wireguard/wg0.conf,在 [Peer] 部分替换 AllowedIPs = ...:
[Interface]
PrivateKey = <your-private-key>
Address = 10.8.0.2/24
[Peer]
PublicKey = <peer-public-key>
Endpoint = vpn.example.com:51820
AllowedIPs = 104.21.32.0/24, 172.67.0.0/16, 198.41.128.0/17
PersistentKeepalive = 25
Windows / macOS (GUI)
- 打开 WireGuard 应用
- 选择您的隧道,点击 Edit tunnel
- 修改
AllowedIPs行 - 点击 Save
Android / iOS
- 打开 WireGuard 应用,点击编辑您的隧道
- 打开 Peer 部分
- 在 Allowed IPs 字段中粘贴生成的值
- 明确点击 Save — 有时退出时应用会重置字段
步骤 3. 重启隧道
- Linux:
sudo wg-quick down wg0 && sudo wg-quick up wg0 - GUI (Windows/macOS):在 WireGuard 应用中关闭并重新开启隧道
- 移动端:将开关切换 off/on
DNS 泄漏 — 必读
WireGuard 通过 AllowedIPs 按 IP 路由流量。它不路由 DNS。浏览器仍然向系统解析器(通常是 ISP 的,通过 DHCP 获得)询问 example.com 的 IP — 只有结果 IP 流量才通过隧道。即使数据加密,ISP 仍能看到你访问哪些站点。
根据你的威胁模型,三种选择:
- 对 ISP 完全隐藏 DNS(通过 wg-quick 实现 split-DNS)。在
[Interface]下添加DNS =行 — wg-quick 会在隧道建立时应用:[Interface] PrivateKey = ... Address = 10.0.0.2/24 DNS = 10.0.0.1, ~example.com, ~another-site.com~域名条目让 systemd-resolved 仅对这些域名使用 VPN 的 DNS(split-DNS)。没有它们时,所有 DNS 都走 VPN。 - 降低 ISP 可见性(公共 DoH/DoT)。对所有查询使用公共解析器:
ISP 不再看到域名查询;Cloudflare 会看到。DNS = 1.1.1.1, 1.0.0.1 - 接受泄漏。完全省略
DNS行 — 只加密数据路径,查询仍走默认解析器。仅作内容解锁场景下可以接受。
用 dnsleaktest.com 或 browserleaks.com/dns 验证 — 显示的解析器应属于你的 VPN 提供商或所选 DoH,而非 ISP。
浏览器层 IP 泄漏(WebRTC)
即使在 OS 层面正确配置了分流,网页中的 JavaScript 仍可通过 WebRTC(STUN/ICE)发现你的真实本地与公网 IP,绕过 VPN。这是设计使然(P2P 音视频需要直接地址),并非 bug — 但 VPN 无法在网络层阻止这种泄漏。
- Chrome/Edge:打开
chrome://flags/#enable-webrtc-hide-local-ips-with-mdns并启用。本地 IP 被会话级 mDNS 主机名隐藏。 - Firefox:
about:config→ 将media.peerconnection.enabled设为false,如果你不使用 WebRTC 应用。可通过 per-site 策略更细化。 - uBlock Origin(任何浏览器):Settings → Privacy → 启用 “Prevent WebRTC from leaking local IP addresses”。
- 在 browserleaks.com/webrtc 测试 — 显示的公网 IP 应与 VPN 出口一致,而非 ISP。
IPv6 双栈绕过
WireGuard 的 AllowedIPs 条目对地址族敏感。如果你只列出 IPv4 前缀,到同一域名的 IPv6 流量(按 RFC 6724,大多数现代站点都偏好 v6)会绕过隧道,从 ISP 默认 v6 路由出去。
两种解决方案:
- v6 也走 VPN(如果你的 VPN 有 IPv6 端点)。在 v4 旁边添加 v6 前缀:
全部 v6 流量走隧道:AllowedIPs = 1.1.1.0/24, 8.8.8.0/24, 2606:4700::/32, 2001:4860::/32AllowedIPs = 0.0.0.0/0, ::/0。 - 系统级禁用 IPv6,如果 VPN 不支持 v6。Linux:
sysctl net.ipv6.conf.all.disable_ipv6=1。Windows:在活动适配器上禁用 IPv6。路由器:每个 WAN 上的 IPv6 开关。所有流量回退到 v4 并被隧道化。
故障关闭(kill switch)
当 WireGuard 隧道断开(网络切换、手动停止、路由失败)时,内核会移除绑定到 wg 接口的路由 — 流向先前隧道化 CIDR 的流量会经默认路由泄漏。使用 wg-quick 的 PostUp/PostDown 钩子,将 firewall 规则绑定到隧道生命周期:
[Interface]
PrivateKey = ...
Address = 10.0.0.2/24
# 故障关闭:除非走 %i(本隧道),否则丢弃流向隧道化 CIDR 的流量
PostUp = iptables -I OUTPUT ! -o %i -d 1.1.1.0/24 -j REJECT
PostUp = iptables -I OUTPUT ! -o %i -d 8.8.8.0/24 -j REJECT
PostDown = iptables -D OUTPUT ! -o %i -d 1.1.1.0/24 -j REJECT
PostDown = iptables -D OUTPUT ! -o %i -d 8.8.8.0/24 -j REJECT
%i 会替换为实际接口名(如 wg0)。隧道启动后,流量经它通过;通过 wg-quick down 关闭时,规则被移除。如果隧道异常崩溃而未执行 PostDown,这些 CIDR 仍被阻断 — 这是安全的故障模式(阻断、不泄漏)。
高级:Table = off
默认情况下 wg-quick 会把 AllowedIPs 中的每个 CIDR 安装到主路由表。在 [Interface] 下设置 Table = off 让 wg-quick 完全不安装路由 — 你通过 PostUp/PostDown 自行管理。适用于需要策略路由(按源 IP、fwmark、进程)、自定义路由表或与 frr/bird/quagga 集成的场景。
[Interface]
PrivateKey = ...
Address = 10.0.0.2/24
Table = off # 不自动安装路由
# 自行管理路由 — 策略路由示例:
PostUp = ip route add 1.1.1.0/24 dev %i table 100
PostUp = ip rule add from 192.168.1.100 lookup 100
PostDown = ip rule del from 192.168.1.100 lookup 100
PostDown = ip route flush table 100
大多数用户不需要 — 默认行为(从 AllowedIPs 自动安装路由)正是 NetRoute Pro 输出所期望的。
验证
运行以下命令确认应用的 AllowedIPs:
sudo wg show
输出中的 allowed ips 行应与您粘贴的子网完全匹配。
常见问题
页面卡住或只加载一部分(PMTU 黑洞)
症状:页面开始加载,前几 KB 到达后卡住;或某些站点正常、另一些却停滞。这是经典的 path MTU 黑洞 — 大包在传输途中被分片,但 ICMP “fragmentation needed” 应答被上游防火墙丢弃,发送端盲目重传。
WireGuard 默认 MTU 为 1420(IPv6 上为 1280)。PPPoE 链路实际是 1492;4G/LTE 常为 1400;部分 CGNAT 仅 1280。在 [Interface] 下降低 MTU:
[Interface]
MTU = 1380 # 先试 1380;如果页面仍卡,降到 1280 / 1200
对于通过隧道转发的路由器(WG 客户端 + LAN),还需要钳制 TCP MSS,让下游客户端不超过 PMTU:
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
所有网络丢失
您可能删除了 0.0.0.0/0 但 AllowedIPs 未覆盖所需子网。添加连接 VPN 所需的特定子网,或保留默认网关并仅添加目标前缀。
Android 隧道一直 "connecting"
应用有时会在保存时丢失更改。打开隧道编辑器,明确重新保存配置,然后切换隧道开关。
Error: AllowedIPs has invalid format
检查逗号和换行符 — AllowedIPs 必须是逗号分隔的 CIDR 列表。移除隐藏的空格、BOM 字符或多余的换行。
配置文件示例
带注释的可编辑模板。将示例路由替换为 NetRoute Pro 为目标网站生成的输出。
wireguard-split-tunnel.conf— WireGuard 对等配置,通过AllowedIPs实现分流
# Example WireGuard peer config with split tunneling.
# Generated by NetRoute Pro: https://alexander2k.github.io/netroute-site/
#
# AllowedIPs in [Peer] section doubles as both an ACL and routing table.
# Only the listed networks are sent through the tunnel — everything else
# uses the default route. Replace placeholders with your real keys/addresses.
[Interface]
PrivateKey = YOUR_CLIENT_PRIVATE_KEY
Address = 10.0.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = YOUR_SERVER_PUBLIC_KEY
Endpoint = your.vpn.server:51820
PersistentKeepalive = 25
# Networks to route via VPN — add/remove based on NetRoute Pro output.
AllowedIPs = 1.1.1.0/24, 8.8.8.0/24, 162.159.0.0/16
# To route everything via VPN, use: AllowedIPs = 0.0.0.0/0, ::/0
# Apply with: sudo wg-quick down wg0 && sudo wg-quick up wg0
提示:需要不带注释行的配置?在 NetRoute Pro 选项中取消勾选 「在导出文件中包含注释」,扩展将仅导出路由命令。适用于不支持注释的路由器。
官方文档
- WireGuard Quick Start (en)
- wg-quick(8) man page (en)
- wg(8) — 配置语法 (en)
- Pro Custodibus: AllowedIPs Calculator (en)