一、背景需求
你是否遇到过以下问题?
- 想在外网安全访问家中 NAS 的 SSH、Web 服务或私有 GitLab?
- 云服务器有公网 IP,但家庭宽带没有固定公网 IP?
- 直接暴露 NAS 端口到公网存在安全隐患?
WireGuard 的解决方案:
通过轻量级 VPN 打通云服务器与家庭 NAS,所有流量加密传输,仅需开放 1 个 UDP 端口即可实现双向通信。
二、环境说明(其他系统过程相近)
角色 | 配置 | 网络信息 |
---|---|---|
云服务器 | Fedora 40+,公网 IP 1.2.3.4 | WireGuard 服务端 IP 10.8.0.1 |
家庭 NAS | Fedora 40+,内网 IP 192.168.1.100 | WireGuard 客户端 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/24 | Address = 10.8.0.2/24 |
[Peer] 段 | 每个客户端独立配置 | 仅需配置服务端信息 |
AllowedIPs | 10.8.0.2/32 (精确 IP) | 10.8.0.0/24 (整个子网) |
PersistentKeepalive | 通常无需配置(服务端被动监听) | 必须配置(穿透 NAT 保持连接) |
2. AllowedIPs 的双重作用
AllowedIPs
参数定义了两种行为:
- 流量准入规则
- 允许哪些来源 IP 的流量进入本机(类似白名单)。
- 路由规则
- 指定哪些目标 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 网络!
六、安全加固建议
-
限制 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
-
密钥安全管理
- 将
private.key
设为600
权限 - 禁止将私钥上传到版本控制工具
- 将
-
定期更新 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
八、总结
通过本文的配置,您实现了:
- 加密隧道通信:所有流量通过 WireGuard 的 UDP 加密隧道传输
- 灵活服务暴露:通过端口转发安全访问内网服务
- 低延迟高性能:WireGuard 内核级实现,资源占用极低
扩展可能性:
- 添加更多客户端(如手机、笔记本)到
10.8.0.0/24
网络 - 结合 Nginx 反向代理实现域名访问
- 部署私有 GitLab/Jenkins 等工具并远程管理
注意事项:
- 家庭宽带上行带宽可能成为速度瓶颈(国内通常为 10-30 Mbps)
- 建议为云服务器配置 SSH 密钥登录 + Fail2ban 防护
相关资源:
评论