1 前言

声明:此方案仅用于异地组网方案,不得将其用于非法活动

2 环境配置

2.1 设备准备

此处仅以一台 Windows 电脑和一台 Android 手机进行异地组网进行演示。

需要设备:

  • Windows 电脑一台

  • Android 手机一台

  • VPS 一台(为了访问速率/合规性考虑,此处将其置于中国境内)

2.2 环境配置

2.2.1 VPS

安装 WireGuard:

sudo apt update && sudo apt install wireguard -y

生成密钥对:

# 生成服务端密钥
wg genkey | tee server_privatekey | wg pubkey > server_publickey
# 生成电脑密钥
wg genkey | tee desktop_privatekey | wg pubkey > desktop_publickey
# 生成手机密钥
wg genkey | tee mobile_privatekey | wg pubkey > mobile_publickey
# 查看密钥
cat server_privatekey
# cat ... 后略

配置 wg0.conf:

sudo nano /etc/wireguard/wg0.conf

内容如下:

[Interface]
PrivateKey = <server_privatekey>
Address = 172.27.88.1/24 # 此处可以选择任何你喜欢的网段(私有地址),后续异地组网的网段就用的这个地址
ListenPort = 51820 # 任何一个你喜欢的端口
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

# 电脑
[Peer]
PublicKey = <desktop_publickey>
AllowedIPs = 172.27.88.2/32

# 手机
[Peer]
PublicKey = <mobile_publickey>
AllowedIPs = 172.27.88.3/32

启动并开启内核转发:

sudo sysctl -w net.ipv4.ip_forward=1
sudo wg-quick up wg0

2.2.2 Windows/Android

为了和Clash 配合,此处用的是 Clash 的脚本功能。

  • 对于 Clash Verge,点击【订阅】->【全局扩展脚本】

在里面填写如下内容(下面是一个案例,需要根据自己的需求修改):

function main(config, profileName) {
  // 1. 定义你的 WireGuard 节点
  const myWireGuard = {
    name: "DesktopWireGuard",
    type: "wireguard",
    server: "XXX", // VPS IP
    port: 51820, // 确保此处与 VPS 的 wg0.conf 端口一致
    ip: "172.27.88.2/32", // 电脑/Android 的 IP
    "private-key": "XXX", // 电脑的私钥
    "public-key": "XXX",  // VPS 的公钥
    udp: true,
    mtu: 1420,
    "remote-dns-resolve": false,
    "udp-over-tcp": false
  };

  // 2. 将节点插入到配置的 proxies 数组最前面
  if (!config.proxies) {
    config.proxies = [];
  }
  config.proxies.unshift(myWireGuard);

  // 3. 将分流规则插入到 rules 数组最前面
  // unshift 会确保它是第一条规则
  if (!config.rules) {
    config.rules = [];
  }
  config.rules.unshift("IP-CIDR,172.27.88.0/24,DesktopWireGuard,no-resolve");

  // 4. 解决 404 问题的关键:DNS 过滤
  // 很多时候访问报错是因为被 Clash 的 Fake-IP 劫持了
  if (config.dns) {
    config.dns["fake-ip-filter"] = config.dns["fake-ip-filter"] || [];
    config.dns["fake-ip-filter"].push("172.27.88.*");
    // 强制让组网网段不经过 Fake-IP,直接走真实 IP 路由
  }
  return config;
}

3 局限性

上述方案有一些局限性,在此还是需要和诸位读者说明:

  • 连接不稳定,有时候连接过一会儿就会断掉(我实在是不知道这是什么原因造成的,debug 了很久)。

  • 之所以不用 WireGuard 官方客户端,是因为在 Android 上,他和 Clash 不能共存(众所周知,Android 只有一个 VPN 槽位)

由于这个方案实在不稳定,我现在实际上已经弃用了,不过还是把总结的经验和踩过的坑写出来,希望对大家有帮助。