← 返回首页

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

准备工作

步骤 1. 在 NetRoute Pro 中生成 AllowedIPs

  1. 在 Chrome 中打开目标网站
  2. 点击扩展栏中的 NetRoute Pro 图标
  3. 选择 WireGuard 平台
  4. 点击 Analyze Website
  5. 复制 AllowedIPs
提示:启用 RIPE BGP 优化 获得稳定前缀 — 它会用真实公告的 BGP 前缀替换单个 IP,当 CDN 轮换 IP 时路由不会失效。注意:RIPE BGP 会返回该 AS 公告的所有前缀 — 对于多租户 CDN(Cloudflare AS13335、AWS AS16509、DigitalOcean AS14061)可能是数万个 IP,涵盖无关站点。BGP 优化适合单租户 AS;多租户 CDN 请保持常规 /24 CIDR 聚合。

步骤 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)

  1. 打开 WireGuard 应用
  2. 选择您的隧道,点击 Edit tunnel
  3. 修改 AllowedIPs
  4. 点击 Save

Android / iOS

  1. 打开 WireGuard 应用,点击编辑您的隧道
  2. 打开 Peer 部分
  3. Allowed IPs 字段中粘贴生成的值
  4. 明确点击 Save — 有时退出时应用会重置字段

步骤 3. 重启隧道

DNS 泄漏 — 必读

WireGuard 通过 AllowedIPsIP 路由流量。它不路由 DNS。浏览器仍然向系统解析器(通常是 ISP 的,通过 DHCP 获得)询问 example.com 的 IP — 只有结果 IP 流量才通过隧道。即使数据加密,ISP 仍能看到你访问哪些站点。

根据你的威胁模型,三种选择:

  1. 对 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。
  2. 降低 ISP 可见性(公共 DoH/DoT)。对所有查询使用公共解析器:
    DNS = 1.1.1.1, 1.0.0.1
    ISP 不再看到域名查询;Cloudflare 会看到。
  3. 接受泄漏。完全省略 DNS 行 — 只加密数据路径,查询仍走默认解析器。仅作内容解锁场景下可以接受。

dnsleaktest.combrowserleaks.com/dns 验证 — 显示的解析器应属于你的 VPN 提供商或所选 DoH,而非 ISP。

浏览器层 IP 泄漏(WebRTC)

即使在 OS 层面正确配置了分流,网页中的 JavaScript 仍可通过 WebRTC(STUN/ICE)发现你的真实本地与公网 IP,绕过 VPN。这是设计使然(P2P 音视频需要直接地址),并非 bug — 但 VPN 无法在网络层阻止这种泄漏。

IPv6 双栈绕过

WireGuard 的 AllowedIPs 条目对地址族敏感。如果你只列出 IPv4 前缀,到同一域名的 IPv6 流量(按 RFC 6724,大多数现代站点都偏好 v6)会绕过隧道,从 ISP 默认 v6 路由出去。

两种解决方案:

故障关闭(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 为目标网站生成的输出。


# 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 选项中取消勾选 「在导出文件中包含注释」,扩展将仅导出路由命令。适用于不支持注释的路由器。

在 GitHub 上查看所有示例 →

官方文档

准备好尝试了吗?

NetRoute Pro — 免费的 Chrome 扩展,可从任何网站生成路由。

安装扩展