通过 WireGuard 实现云服务器与家庭 NAS 的安全互联:完整教程 ...

打印 上一主题 下一主题

主题 1844|帖子 1844|积分 5532

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、背景需求

你是否遇到过以下问题?


  • 想在外网安全访问家中 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

  1. sudo dnf install wireguard-tools
复制代码
步骤 2:天生密钥对

  1. wg genkey | sudo tee /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
  2. sudo chmod 600 /etc/wireguard/private.key
复制代码
步骤 3:创建配置文件 /etc/wireguard/wg0.conf

  1. [Interface]
  2. Address = 10.8.0.1/24
  3. ListenPort = 51820
  4. PrivateKey = <云服务器私钥>  # 替换为 private.key 内容
  5. [Peer]
  6. PublicKey = <NAS公钥>       # 后续从 NAS 获取
  7. AllowedIPs = 10.8.0.2/32
复制代码
步骤 4:启用内核转发与防火墙

  1. # 启用 IP 转发
  2. echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wireguard.conf
  3. sudo sysctl -p
  4. # 开放 WireGuard 端口
  5. sudo firewall-cmd --permanent --add-port=51820/udp
  6. sudo firewall-cmd --reload
  7. # 启动服务
  8. sudo systemctl enable --now wg-quick@wg0
复制代码

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

步骤 1:安装 WireGuard

  1. sudo dnf install wireguard-tools
复制代码
步骤 2:天生密钥对

  1. wg genkey | sudo tee /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
  2. sudo chmod 600 /etc/wireguard/private.key
复制代码
步骤 3:创建配置文件 /etc/wireguard/wg0.conf

  1. [Interface]
  2. Address = 10.8.0.2/24
  3. PrivateKey = <NAS私钥>  # 替换为 private.key 内容
  4. [Peer]
  5. PublicKey = <云服务器公钥>  # 替换为云服务器的 public.key 内容
  6. Endpoint = 1.2.3.4:51820
  7. AllowedIPs = 10.8.0.0/24
  8. PersistentKeepalive = 25
复制代码
步骤 4:启动服务

  1. sudo systemctl enable --now wg-quick@wg0
复制代码

3. 验证毗连

查抄隧道状态

  1. # 在云服务器执行
  2. sudo wg show
  3. # 预期输出应包含:
  4. # peer: <NAS公钥>
  5. # latest handshake: 时间戳
  6. # transfer: 有数据流量
复制代码
测试连通性

  1. # 从云服务器 ping NAS
  2. ping 10.8.0.2
  3. # 从 NAS ping 云服务器
  4. ping 10.8.0.1
复制代码

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

场景 1:SSH 毗连

  1. # 在云服务器上直接访问 NAS 的 VPN IP
  2. ssh your_username@10.8.0.2
  3. # 或通过公网端口转发(将云服务器的 2222 端口映射到 NAS 的 22 端口)
  4. sudo firewall-cmd --permanent --add-forward-port=port=2222:proto=tcp:toaddr=10.8.0.2:toport=22
  5. sudo firewall-cmd --reload
  6. # 外部用户访问命令
  7. ssh -p 2222 your_username@1.2.3.4
复制代码
场景 2:访问 Web 服务

假设 NAS 运行了一个博客在 8080 端口:
  1. # 映射云服务器的 8080 端口到 NAS
  2. sudo firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toaddr=10.8.0.2:toport=8080
  3. sudo firewall-cmd --reload
  4. # 外部用户访问
  5. 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 参数界说了两种行为:

  • 流量准入规则

    • 答应哪些来源 IP 的流量进入本机(类似白名单)。

  • 路由规则

    • 指定哪些目标 IP 的流量要通过 VPN 隧道发送。


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

配置示例

  1. # 云服务器的 wg0.conf
  2. [Peer]
  3. PublicKey = <NAS公钥>
  4. 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 设计解析

配置示例

  1. # 家庭 NAS 的 wg0.conf
  2. [Peer]
  3. 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

  1. # 错误的服务端配置
  2. [Peer]
  3. AllowedIPs = 10.8.0.0/24  # 错误!
复制代码


  • 后果
    服务端会将所有目标为 10.8.0.0/24 的流量转发给该客户端(NAS),导致其他客户端无法正确路由。
错误 2:客户端误用 /32

  1. # 错误的客户端配置
  2. [Peer]
  3. AllowedIPs = 10.8.0.1/32  # 错误!
复制代码


  • 后果
    客户端只能访问服务端 10.8.0.1,无法与其他 VPN 设备(如未来新增的 10.8.0.3)通信。

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

假设未来添加一个手机客户端(10.8.0.3):
服务端配置更新

  1. # 新增手机客户端配置
  2. [Peer]
  3. PublicKey = <手机公钥>
  4. AllowedIPs = 10.8.0.3/32
复制代码
手机客户端配置

  1. [Peer]
  2. 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 访问源
    1. # 在 NAS 上仅允许来自 VPN IP 的 SSH 连接
    2. sudo firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.8.0.1 port port=22 protocol=tcp accept'
    3. sudo firewall-cmd --reload
    复制代码
  • 密钥安全管理

    • 将 private.key 设为 600 权限
    • 禁止将私钥上传到版本控制工具

  • 定期更新 WireGuard
    1. sudo dnf update wireguard-tools
    复制代码

七、常见问题排查

问题 1:WireGuard 服务未启动

  1. sudo systemctl status wg-quick@wg0
  2. sudo journalctl -u wg-quick@wg0 --since "10 minutes ago"
复制代码
问题 2:防火墙拦截流量

  1. # 检查防火墙规则
  2. sudo firewall-cmd --list-all
  3. # 临时关闭防火墙测试(测试后务必重新启用)
  4. sudo systemctl stop firewalld
复制代码
问题 3:NAT 配置错误

  1. # 检查云服务器的 NAT 规则
  2. sudo iptables -t nat -L POSTROUTING
复制代码

八、总结

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

  • 加密隧道通信:所有流量通过 WireGuard 的 UDP 加密隧道传输
  • 机动服务暴露:通过端口转发安全访问内网服务
  • 低延迟高性能:WireGuard 内核级实现,资源占用极低
扩展大概性


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

注意事项


  • 家庭宽带上行带宽大概成为速率瓶颈(国内通常为 10-30 Mbps)
  • 发起为云服务器配置 SSH 密钥登录 + Fail2ban 防护
相干资源


  • WireGuard 官方文档
  • Fedora FirewallD 指南
原文链接:通过 WireGuard 实现云服务器与家庭 NAS 的安全互联:完整教程 - Lixx Blog - 李晓旭的博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表