返回

WireGuard组网最佳实践

使用 WireGuard 组件实现跨设备的网络优化服务
2025-01-10
4958 字 · 约 13 分钟阅读

WireGuard 是一种现代的虚拟私人网络(VPN)协议和软件,提供了高效、安全和易于配置的 VPN 解决方案,由 Jason A. Donenfeld 开发,并于 2018 年正式合并到 Linux 内核中

WireGuard 使用现代加密算法来保障通讯的安全和隐私,其代码库简短便于审计和维护,加密方式采用公钥私钥的方式进行端对端加密

支持的平台也非常广泛包括 Linux、MacOS、Windows 以及移动设备平台 IOS 和 Android

在国内适合用于代理到家中的 VPN 服务,但其流量特征明显而且不支持混淆,不适用于跨境访问这种场景

1. 结论

WireGuard 适合需要在外访问家庭网络中的服务场景,例如家庭网络中有 N100 服务器(其 IP 是192.168.100.1)提供多个 web 服务

在外出后,移动设备只需打开 WireGuard 服务后,就可以访问 192.168.100.1 ,而无需像 Frp 类的内网穿透服务去访问中转服务器的端口

WireGuard 相较于 Frp 的优势:

  1. 省去了逐个逐个端口映射的烦恼
  2. 免去了维护两套 IP 的工作(本地 IP 和服务器 IP 之间来回转换)
  3. 流量加密,客户端兼容广泛

自行部署步骤麻烦,也可考虑使用第三方容器镜像如 wg-easy ,自带 web 页面管理:

  • 地址:https://github.com/wg-easy/wg-easy

部署参考 compose.yaml

services:
  wg-easy:
    environment:
      # Change Language:
      # (Supports: en, ua, ru, tr, no, pl, fr, de, ca, es, ko, vi, nl, is, pt, chs, cht, it, th, hi)
      - LANG=cn
      # ⚠️ Required:
      # Change this to your host's public address
      - WG_HOST=example.com

      # Optional:
      # 密码需要加密生成后填入配置文件,不可明文填入
      - PASSWORD_HASH=
      - PORT=11821
      - WG_PORT=11820
      # - WG_CONFIG_PORT=92820
      - WG_DEFAULT_ADDRESS=10.8.0.x
      - WG_DEFAULT_DNS=192.168.1.1
      # - WG_MTU=1420
      # - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
      - WG_PERSISTENT_KEEPALIVE=25
      - WG_POST_UP=iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
      - WG_POST_DOWN=iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
      # - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
      # - WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
      # - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
      # - WG_POST_DOWN=echo "Post Down" > /etc/wireguard/post-down.txt
      # - UI_TRAFFIC_STATS=true
      # - UI_CHART_TYPE=0 # (0 Charts disabled, 1 # Line chart, 2 # Area chart, 3 # Bar chart)

    image: ghcr.io/wg-easy/wg-easy:15.0
    container_name: wg-easy
    volumes:
      - ./data:/etc/wireguard
    ports:
      - "11820:11820/udp"
      - "11821:11821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
      # - NET_RAW # ⚠️ Uncomment if using Podman 
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

密码需要加密生成后填入配置文件,不可明文填入:

docker run ghcr.io/wg-easy/wg-easy wgpw "password_value"

注意,填入时每一个特殊符号 $ 要转义成 $$,例如:

$ docker run ghcr.io/wg-easy/wg-easy wgpw 123456              
PASSWORD_HASH='$2a$12$dBQFsFW9xW8oOHiqa/97t.dpol5yQj2m9NN4qZ/XD14AZS8IQfjI2'

# 那么填入 compose.yaml 时应是 $$2a$$12$$dBQFsFW9xW8oOHiqa/97t.dpol5yQj2m9NN4qZ/XD14AZS8IQfjI2

下面实践手动部署,减少对公网服务器的资源占用

2. 组网

这里我有 3 个设备,分别是:

  • N100服务器 192.168.100.1
  • 公网服务器 8.8.8.8
  • 移动设备 iPhone12

以下实践将实现在 5G 网络下直通访问家庭中 192.168.100.1 所有服务

2.1. 公网服务器

安装 WireGuard 服务

sudo apt update
sudo apt install wireguard

切换到 /etc/wireguard/ 目录下,生成服务端密钥对

wg genkey | tee server_privatekey | wg pubkey > server_publickey

生成 N100 内网服务器的密钥对,将在稍后的 N100 服务器配置时使用

wg genkey | tee n100_privatekey | wg pubkey > n100_publickey

生成 iPhone 密钥对,将在稍后的 iPhone 客户端配置时使用

wg genkey | tee iPhone12_privatekey | wg pubkey > iPhone12_publickey

此时 /etc/wireguard 下应该具备这些文件:

/etc/wireguard
├── iPhone12_privatekey
├── iPhone12_publickey
├── n100_privatekey
├── n100_publickey
├── server_privatekey
└── server_publickey

编辑 /etc/wireguard/wg0.conf 如下:

[Interface]
PrivateKey = <server_privatekey>
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE


[Peer]
# N100
PublicKey = <n100_publickey>
AllowedIPs = 192.168.100.1/32, 10.0.0.2/32

[Peer]
# iPhone12
PublicKey = <iPhone12_publickey>
AllowedIPs = 10.0.0.3/32

请自行更换上述的所有 publickey 值为刚才生成文件内容值

完成后,启动服务:

sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

记得防火墙要开放 51820 端口的 udp 权限

对于服务器配置文件,只需理解 AllowedIPs 这个参数,这代表了路由器的路由,指定了什么网段的流量发往哪台客户端

2.2. N100 服务器

N100 服务器安装的是 Debian12 的服务器,Debian12 已经添加 WireGuard 到仓库中了,安装如下:

sudo apt install wireguard

编辑 /etc/wireguard/wg0.conf 文件如下:

[Interface]
PrivateKey = <n100_privatekey>
Address = 10.0.0.2/24

[Peer]
PublicKey = <server_publickey>
Endpoint = 8.8.8.8:51820
AllowedIPs = 10.0.0.2/24
PersistentKeepalive = 25

请自行更换上述的 publickeyprivatekey 的值

完成后,启动服务:

sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0

此时可以 ping 10.0.0.1 来确认通信是否顺利,也可以从公网服务器上尝试 ping 192.168.100.1 来确认服务是否已连接

对于客户端配置文件,只需理解 AllowedIPs 这个参数,这代表了客户端的路由,指定了什么网段的流量发往 wireguard 隧道

2.3. iPhone12

由于移动设备编辑配置文件相对不易,可以采用二维码的形式导入,在公网服务器上编辑一份适用于 iPhone12 的配置文件

先安装配置文件转二维码的工具:

apt install qrencode

编辑 /etc/wireguard/iPhone12.conf,内容如下:

[Interface]
PrivateKey = <iPhone12_privatekey>
Address = 10.0.0.3/24

[Peer]
PublicKey = <server_publickey>
Endpoint = 8.8.8.8:51820
# 这里表示将允许 iPhone12 访问 192.168.100.1
AllowedIPs = 192.168.100.0/24
PersistentKeepalive = 25

将这份配置文件转换为二维码显示:

qrencode /etc/wireguard/iPhone12.conf

在 App Store 中安装 WireGuard,并新建配置,选择二维码形式导入

扫码导入即可,在导入成功后,切换到 5G 网络下并开启服务,然后试试访问 N100 服务器(192.168.100.1)的服务

3. 其他

通过上述的配置,即可实现异地组网,实现在任意网络都可以像访问局域网一样访问到家庭中的网络

但由于 WireGuard 只是加密流量且加密后的流量特征非常明显,用于跨境组网是很容易被阻断的,所以 WireGuard 只适用于国内中转服务器进行组网

留言

发表留言