Article

使用 WireGuard 远程访问家庭内网

WireGuard 软件图标

前言

WireGuard 是一种实现加密虚拟专用网络(VPN)的通信协议与免费开源软件,设计目标是简单易用、高性能和低攻击面,相比 IPsec 和 OpenVPN 等传统隧道协议更加轻量高效。

重要

问题背景 家中服务器已经获取公网 IPv6 地址,并配置了 DDNS 动态域名解析。但受限于纯 IPv4 环境下无法直接访问 IPv6,部分服务在外网难以便捷连接;同时,将家庭内网服务直接暴露在公网上也存在安全隐患。

提示

解决方案 通过已配置 DDNS 的域名连接家庭服务器上的 WireGuard 服务,建立 VPN 隧道,再在隧道内通过 IPv4 访问各项内网服务。这样既兼顾了网络兼容性,也避免了将家庭设备直接暴露到公网。

服务器配置

安装 WireGuard

主流 Linux 发行版均可通过包管理器直接安装 WireGuard。

说明

提示 WireGuard 内核模块已并入 Linux 主线内核(Linux 5.6+),因此大多数现代发行版只需安装用户态工具 wireguard-tools 即可。

Fedora / RHEL

bash
sudo dnf install wireguard-tools

Debian / Ubuntu

bash
sudo apt install wireguard

其他发行版可以参考官方安装指南。

编写配置文件

开始配置前,需要先生成公私钥并规划 VPN 内部网段。

生成公私钥

bash
wg genkey | tee privatekey | wg pubkey > publickey

该命令会在当前目录下生成 privatekey(私钥)和 publickey(公钥)两个文件,可通过 cat 查看:

bash
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:

bash
sudo vim /etc/wireguard/wg0.conf

写入以下基础配置:

ini
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = XXX(填入服务器私钥)

参数说明:

  • [Interface]:本机 WireGuard 虚拟网卡配置
    • Address:服务器在 VPN 内的 IP 地址与前缀长度
    • ListenPort:WireGuard 监听的 UDP 端口
    • PrivateKey:服务器自身的私钥(填入前面生成的 privatekey 内容)

启动与验证

使用 wg-quick 启动 WireGuard 并设置开机自启:

bash
sudo systemctl enable --now wg-quick@wg0

查看接口状态,确认服务是否正常运行:

bash
sudo wg

配置防火墙

在服务器防火墙中放行 WireGuard 的 UDP 监听端口:

bash
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 内核转发:

bash
sudo sysctl -w net.ipv4.ip_forward=1

临时修改在重启后会失效。Linux 会按文件名顺序读取 /etc/sysctl.d/ 目录下的配置文件,我们可以新建一份配置来实现持久化:

bash
sudo vim /etc/sysctl.d/99-wireguard.conf

说明

关于文件名加载顺序 sysctl 会按文件名前缀的数字从小到大依次加载。后加载的配置会覆盖先加载的同名参数,因此数字越大优先级越高(通常最高设为 99)。

在 99-wireguard.conf 中写入:

ini
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,可以通过以下命令临时开启:

bash
sudo iptables -t nat -A POSTROUTING -j MASQUERADE

更推荐使用 firewalld 开启地址伪装并持久化:

bash
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload

客户端配置

下载客户端

日常使用建议安装图形界面(GUI)客户端:

  • Windows:可从官方下载页获取。
  • macOS:可在非国区 App Store 搜索 WireGuard 下载。

说明

提示 Windows 的 .exe 安装器会在线拉取最新版本;如果网络环境不佳,建议直接下载离线的 .msi 安装包。

添加客户端隧道配置

打开 WireGuard 客户端,点击左下角/右下角的「新建空隧道」,客户端会自动生成一对公私钥,并展示初始配置:

ini
[Interface]
PrivateKey = xxxxx

根据前文的网段规划,将配置补全如下:

ini
[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] 信息:

ini
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = XXX

# 添加客户端节点信息
[Peer]
PublicKey = XXX # 填入客户端界面显示的公钥
AllowedIPs = 10.10.0.2/32 # 填入分配给该客户端的 VPN 地址

保存后重启服务器的 WireGuard 接口使配置生效:

bash
sudo wg-quick down wg0
sudo wg-quick up wg0

到此配置全部完成,在客户端中点击「连接」即可接入家庭内网。

参考资料

使用 WireGuard 远程访问家庭内网

https://www.renpengyu.com/articles/wireguard-homelab/
作者
Penry
发布于
2026.05.24
许可协议
CC BY-NC-SA 4.0
站内搜索

找到你感兴趣的内容

文章分类
选择文章分类,匹配任意一个所选分类

多选时显示属于任一所选分类的文章。

文章标签
选择文章标签,多个标签需同时包含

多选时只显示同时包含所选标签的文章。

输入关键词开始搜索