一、背景需求

你是否遇到过以下问题?

  • 想在外网安全访问家中 NAS 的 SSH、Web 服务或私有 GitLab?
  • 云服务器有公网 IP,但家庭宽带没有固定公网 IP?
  • 直接暴露 NAS 端口到公网存在安全隐患?

WireGuard 的解决方案
通过轻量级 VPN 打通云服务器与家庭 NAS,所有流量加密传输,仅需开放 1 个 UDP 端口即可实现双向通信。


二、环境说明(其他系统过程相近)

角色配置网络信息
云服务器Fedora 40+,公网 IP 1.2.3.4WireGuard 服务端 IP 10.8.0.1
家庭 NASFedora 40+,内网 IP 192.168.1.100WireGuard 客户端 IP 10.8.0.2

三、完整配置流程

1. 云服务器(服务端)配置

步骤 1:安装 WireGuard

sudo dnf install wireguard-tools

步骤 2:生成密钥对

wg genkey | sudo tee /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
sudo chmod 600 /etc/wireguard/private.key

步骤 3:创建配置文件 /etc/wireguard/wg0.conf

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <云服务器私钥>  # 替换为 private.key 内容

[Peer]
PublicKey = <NAS公钥>       # 后续从 NAS 获取
AllowedIPs = 10.8.0.2/32

步骤 4:启用内核转发与防火墙

# 启用 IP 转发
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl -p

# 开放 WireGuard 端口
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --reload

# 启动服务
sudo systemctl enable --now wg-quick@wg0

2. 家庭 NAS(客户端)配置

步骤 1:安装 WireGuard

sudo dnf install wireguard-tools

步骤 2:生成密钥对

wg genkey | sudo tee /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
sudo chmod 600 /etc/wireguard/private.key

步骤 3:创建配置文件 /etc/wireguard/wg0.conf

[Interface]
Address = 10.8.0.2/24
PrivateKey = <NAS私钥>  # 替换为 private.key 内容

[Peer]
PublicKey = <云服务器公钥>  # 替换为云服务器的 public.key 内容
Endpoint = 1.2.3.4:51820
AllowedIPs = 10.8.0.0/24
PersistentKeepalive = 25

步骤 4:启动服务

sudo systemctl enable --now wg-quick@wg0

3. 验证连接

检查隧道状态

# 在云服务器执行
sudo wg show

# 预期输出应包含:
# peer: <NAS公钥>
# latest handshake: 时间戳
# transfer: 有数据流量

测试连通性

# 从云服务器 ping NAS
ping 10.8.0.2

# 从 NAS ping 云服务器
ping 10.8.0.1

四、通过云服务器访问 NAS 服务

场景 1:SSH 连接

# 在云服务器上直接访问 NAS 的 VPN IP
ssh your_username@10.8.0.2

# 或通过公网端口转发(将云服务器的 2222 端口映射到 NAS 的 22 端口)
sudo firewall-cmd --permanent --add-forward-port=port=2222:proto=tcp:toaddr=10.8.0.2:toport=22
sudo firewall-cmd --reload

# 外部用户访问命令
ssh -p 2222 your_username@1.2.3.4

场景 2:访问 Web 服务

假设 NAS 运行了一个博客在 8080 端口:

# 映射云服务器的 8080 端口到 NAS
sudo firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toaddr=10.8.0.2:toport=8080
sudo firewall-cmd --reload

# 外部用户访问
curl http://1.2.3.4:8080

五、深入解析:WireGuard 配置中的关键差异

在配置 WireGuard 时,细心的读者可能注意到 云服务器(服务端)家庭 NAS(客户端)wg0.conf 文件中 AllowedIPs 参数存在明显差异。这种“不对称”设计是 WireGuard 实现高效路由和安全通信的核心逻辑,本节将详细解读其原理。


1. 配置对比:服务端 vs 客户端

配置项云服务器(服务端)家庭 NAS(客户端)
[Interface]Address = 10.8.0.1/24Address = 10.8.0.2/24
[Peer]每个客户端独立配置仅需配置服务端信息
AllowedIPs10.8.0.2/32(精确 IP)10.8.0.0/24(整个子网)
PersistentKeepalive通常无需配置(服务端被动监听)必须配置(穿透 NAT 保持连接)

2. AllowedIPs 的双重作用

AllowedIPs 参数定义了两种行为:

  1. 流量准入规则
    • 允许哪些来源 IP 的流量进入本机(类似白名单)。
  2. 路由规则
    • 指定哪些目标 IP 的流量要通过 VPN 隧道发送。

3. 服务端的 /32 设计解析

配置示例

# 云服务器的 wg0.conf
[Peer]
PublicKey = <NAS公钥>
AllowedIPs = 10.8.0.2/32

设计逻辑

  • 10.8.0.2/32 的含义
    • /32 表示一个精确的单个 IP(仅匹配 10.8.0.2)。
    • 服务端声明:“我只接受来自 10.8.0.2 的流量,且所有发送到 10.8.0.2 的流量都通过此隧道”。
  • 扩展性优势
    • 当新增其他客户端(如手机 10.8.0.3)时,只需为每个设备添加独立的 [Peer] 段,每个 AllowedIPs 对应一个 /32 地址,避免路由冲突。

4. 客户端的 /24 设计解析

配置示例

# 家庭 NAS 的 wg0.conf
[Peer]
AllowedIPs = 10.8.0.0/24

设计逻辑

  • 10.8.0.0/24 的含义
    • /24 表示一个子网范围10.8.0.1 ~ 10.8.0.254)。
    • 客户端声明:“所有目标在 10.8.0.0/24 网段的流量(如服务端或其他客户端),都通过此隧道发送”。
  • 通信灵活性
    • 即使当前只有服务端(10.8.0.1),这种设计也允许未来直接与其他客户端(如 10.8.0.3)通信,无需修改配置。

5. 错误配置的后果

错误 1:服务端误用 /24

# 错误的服务端配置
[Peer]
AllowedIPs = 10.8.0.0/24  # 错误!
  • 后果
    服务端会将所有目标为 10.8.0.0/24 的流量转发给该客户端(NAS),导致其他客户端无法正确路由。

错误 2:客户端误用 /32

# 错误的客户端配置
[Peer]
AllowedIPs = 10.8.0.1/32  # 错误!
  • 后果
    客户端只能访问服务端 10.8.0.1,无法与其他 VPN 设备(如未来新增的 10.8.0.3)通信。

6. 进阶场景:多客户端扩展

假设未来添加一个手机客户端(10.8.0.3):

服务端配置更新

# 新增手机客户端配置
[Peer]
PublicKey = <手机公钥>
AllowedIPs = 10.8.0.3/32

手机客户端配置

[Peer]
AllowedIPs = 10.8.0.0/24  # 仍需要整个子网

通信验证

  • 手机 → NAS
    10.8.0.3 访问 10.8.0.2,因手机的 AllowedIPs=10.8.0.0/24 包含该目标,流量经服务端转发。
  • 服务端 → 手机
    服务端明确知道 10.8.0.3/32 对应手机的隧道。

7. 总结:WireGuard 的设计哲学

  • 最小化路由规则:通过精确的 AllowedIPs 定义,避免不必要的流量转发。
  • 高扩展性:服务端通过 /32 隔离客户端,客户端通过 /24 感知整个网络。
  • 安全性:默认拒绝所有流量,仅允许显式声明的 IP 通信。

通过这种“服务端精确控制 + 客户端全局感知”的设计,WireGuard 在保障安全性的同时,实现了高效灵活的内网互通。理解这一原理后,您可以根据实际需求自由扩展 VPN 网络!


六、安全加固建议

  1. 限制 SSH 访问源

    # 在 NAS 上仅允许来自 VPN IP 的 SSH 连接
    sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.8.0.1 port port=22 protocol=tcp accept'
    sudo firewall-cmd --reload
    
  2. 密钥安全管理

    • private.key 设为 600 权限
    • 禁止将私钥上传到版本控制工具
  3. 定期更新 WireGuard

    sudo dnf update wireguard-tools
    

七、常见问题排查

问题 1:WireGuard 服务未启动

sudo systemctl status wg-quick@wg0
sudo journalctl -u wg-quick@wg0 --since "10 minutes ago"

问题 2:防火墙阻挡流量

# 检查防火墙规则
sudo firewall-cmd --list-all

# 临时关闭防火墙测试(测试后务必重新启用)
sudo systemctl stop firewalld

问题 3:NAT 配置错误

# 检查云服务器的 NAT 规则
sudo iptables -t nat -L POSTROUTING

八、总结

通过本文的配置,您实现了:

  1. 加密隧道通信:所有流量通过 WireGuard 的 UDP 加密隧道传输
  2. 灵活服务暴露:通过端口转发安全访问内网服务
  3. 低延迟高性能:WireGuard 内核级实现,资源占用极低

扩展可能性

  • 添加更多客户端(如手机、笔记本)到 10.8.0.0/24 网络
  • 结合 Nginx 反向代理实现域名访问
  • 部署私有 GitLab/Jenkins 等工具并远程管理

注意事项

  • 家庭宽带上行带宽可能成为速度瓶颈(国内通常为 10-30 Mbps)
  • 建议为云服务器配置 SSH 密钥登录 + Fail2ban 防护

相关资源