前言
WireGuard 是一种实现加密虚拟专用网络(VPN)的通信协议与免费开源软件,设计目标是简单易用、高性能和低攻击面,相比 IPsec 和 OpenVPN 等传统隧道协议更加轻量高效。
重要
问题背景 家中服务器已经获取公网 IPv6 地址,并配置了 DDNS 动态域名解析。但受限于纯 IPv4 环境下无法直接访问 IPv6,部分服务在外网难以便捷连接;同时,将家庭内网服务直接暴露在公网上也存在安全隐患。
提示
解决方案 通过已配置 DDNS 的域名连接家庭服务器上的 WireGuard 服务,建立 VPN 隧道,再在隧道内通过 IPv4 访问各项内网服务。这样既兼顾了网络兼容性,也避免了将家庭设备直接暴露到公网。
服务器配置
安装 WireGuard
主流 Linux 发行版均可通过包管理器直接安装 WireGuard。
说明
提示 WireGuard 内核模块已并入 Linux 主线内核(Linux 5.6+),因此大多数现代发行版只需安装用户态工具
wireguard-tools即可。
Fedora / RHEL
sudo dnf install wireguard-toolsDebian / Ubuntu
sudo apt install wireguard其他发行版可以参考官方安装指南。
编写配置文件
开始配置前,需要先生成公私钥并规划 VPN 内部网段。
生成公私钥
wg genkey | tee privatekey | wg pubkey > publickey该命令会在当前目录下生成 privatekey(私钥)和 publickey(公钥)两个文件,可通过 cat 查看:
cat privatekey && cat publickey规划网段
为了保证兼容性并避免地址冲突,VPN 内部使用独立的 IPv4 私网网段:
- 避开家庭局域网常用的
192.168.0.0/16,选用10.10.0.0/24。 - 家庭服务器的 VPN 地址设为
10.10.0.1/24,笔记本客户端设为10.10.0.2/32。
创建服务器配置
创建并编辑 /etc/wireguard/wg0.conf:
sudo vim /etc/wireguard/wg0.conf写入以下基础配置:
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = XXX(填入服务器私钥)参数说明:
[Interface]:本机 WireGuard 虚拟网卡配置Address:服务器在 VPN 内的 IP 地址与前缀长度ListenPort:WireGuard 监听的 UDP 端口PrivateKey:服务器自身的私钥(填入前面生成的privatekey内容)
启动与验证
使用 wg-quick 启动 WireGuard 并设置开机自启:
sudo systemctl enable --now wg-quick@wg0查看接口状态,确认服务是否正常运行:
sudo wg配置防火墙
在服务器防火墙中放行 WireGuard 的 UDP 监听端口:
sudo firewall-cmd --permanent --add-port=51820/udp --zone=public
sudo firewall-cmd --reload提示
拓展 如果希望在 VPN 内不受防火墙限制地访问服务器上的所有端口,可以将
wg0接口加入trusted区域:sudo firewall-cmd --permanent --zone=trusted --add-interface=wg0 && sudo firewall-cmd --reload
说明
提示 到这里 WireGuard 服务端已经可以工作。如果只需访问家庭服务器本机,可以直接跳到客户端配置。
配置远程访问局域网设备
仅完成上面的配置时,客户端只能访问已接入 VPN 的节点。如果还想直接访问家庭局域网(如 192.168.1.0/24)中的 NAS 或其他设备,就需要让家庭服务器充当跳板,帮我们转发发往局域网的数据包。
开启内核转发并持久化
首先临时开启 IPv4 内核转发:
sudo sysctl -w net.ipv4.ip_forward=1临时修改在重启后会失效。Linux 会按文件名顺序读取 /etc/sysctl.d/ 目录下的配置文件,我们可以新建一份配置来实现持久化:
sudo vim /etc/sysctl.d/99-wireguard.conf说明
关于文件名加载顺序
sysctl会按文件名前缀的数字从小到大依次加载。后加载的配置会覆盖先加载的同名参数,因此数字越大优先级越高(通常最高设为99)。
在 99-wireguard.conf 中写入:
net.ipv4.ip_forward=1开启地址伪装(NAT)
开启内核转发后,发往 192.168.1.0/24 的数据包已经可以由家庭服务器转发到局域网。但数据包从 VPN 发出时,源 IP 仍是客户端的 VPN 地址(10.10.0.2)。局域网内的其他设备并不知道如何路由回 10.10.0.0/24 网段,导致回包丢失、无法建立连接。
sequenceDiagram
participant Client as VPN客户端<br/>10.10.0.2
participant Gateway as 家庭服务器<br/>10.10.0.1
participant NAS as 内网设备<br/>192.168.1.100
Client->>Gateway: 访问内网设备
Note over Client,Gateway: 源IP: 10.10.0.2
Gateway->>NAS: 转发请求
Note over Gateway,NAS: 源IP仍然是 10.10.0.2
NAS--xClient: 尝试直接回复 10.10.0.2
Note over NAS: 不在同一网段,无法回复。
解决办法是开启地址伪装(Masquerade / SNAT):让家庭服务器在转发数据包时,将源 IP 替换为自己的局域网 IP,收到内网设备回复后再转发回 VPN 客户端。
sequenceDiagram
participant Client as VPN客户端<br/>10.10.0.2
participant Gateway as 家庭服务器<br/>10.10.0.1<br/>192.168.1.10
participant NAS as 内网设备<br/>192.168.1.100
Client->>Gateway: 访问 NAS
Note over Client,Gateway: 源IP: 10.10.0.2
Gateway->>NAS: SNAT / Masquerade
Note over Gateway,NAS: 源IP伪装为 192.168.1.10
NAS->>Gateway: 回复 192.168.1.10
Gateway->>Client: 反向转换后返回
Note over Gateway,Client: 目标恢复为 10.10.0.2
如果使用 iptables,可以通过以下命令临时开启:
sudo iptables -t nat -A POSTROUTING -j MASQUERADE更推荐使用 firewalld 开启地址伪装并持久化:
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload客户端配置
下载客户端
日常使用建议安装图形界面(GUI)客户端:
- Windows:可从官方下载页获取。
- macOS:可在非国区 App Store 搜索 WireGuard 下载。
说明
提示 Windows 的
.exe安装器会在线拉取最新版本;如果网络环境不佳,建议直接下载离线的.msi安装包。
添加客户端隧道配置
打开 WireGuard 客户端,点击左下角/右下角的「新建空隧道」,客户端会自动生成一对公私钥,并展示初始配置:
[Interface]
PrivateKey = xxxxx根据前文的网段规划,将配置补全如下:
[Interface]
PrivateKey = xxxxx
Address = 10.10.0.2/32
MTU = 1420
[Peer]
PublicKey = xxx
AllowedIPs = 10.10.0.0/24, 192.168.1.0/24
Endpoint = 服务器域名或IP:51820
PersistentKeepalive = 25参数说明:
[Interface]:客户端本机网卡配置PrivateKey:客户端私钥(保留自动生成的值即可,无需改动)Address:客户端在 VPN 内的 IP 地址MTU:最大传输单元,隧道环境下设为1420可减少分片问题
[Peer]:对端(家庭服务器)节点配置PublicKey:服务器公钥(填入服务器生成的publickey内容)AllowedIPs:需要通过 VPN 路由的目标网段(访问这些网段时流量会自动走 WireGuard 隧道)Endpoint:服务器公网接入地址与监听端口PersistentKeepalive:定时发送心跳包的间隔(秒),用于在 NAT 环境下保持连接不断开
将客户端信息写入服务器配置
最后回到服务器,在 /etc/wireguard/wg0.conf 末尾追加客户端的 [Peer] 信息:
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = XXX
# 添加客户端节点信息
[Peer]
PublicKey = XXX # 填入客户端界面显示的公钥
AllowedIPs = 10.10.0.2/32 # 填入分配给该客户端的 VPN 地址保存后重启服务器的 WireGuard 接口使配置生效:
sudo wg-quick down wg0
sudo wg-quick up wg0到此配置全部完成,在客户端中点击「连接」即可接入家庭内网。
