如何实现本地网络设备访问WireGuard VPN子网内的设备?
如何实现本地网络设备访问WireGuard VPN子网内的设备?
看起来你已经理清了整体思路,核心就是让本地局域网和WireGuard的虚拟子网打通双向访问,我给你拆解成几个实操步骤,都是自己折腾过的靠谱方案,应该能解决你的问题:
第一步:搞定WireGuard服务器(NAS上的Docker容器)的基础配置
首先得确保NAS宿主机开启IP转发,这是跨子网通信的前提:
- 登录NAS终端,执行
sudo sysctl -w net.ipv4.ip_forward=1临时生效;然后编辑/etc/sysctl.conf,把net.ipv4.ip_forward=1的注释去掉,重启NAS后永久生效,避免重启后规则丢失。
接着修改Docker里WireGuard的配置文件(一般是wg0.conf):
在[Interface]段添加流量转发和地址伪装规则,让WG子网的流量能被本地局域网识别:
[Interface] PrivateKey = 你的服务器私钥 Address = 10.8.0.1/24 # 这里是WG子网的网关IP,可根据自己需求修改 ListenPort = 51820 # 下面的eth0要换成NAS实际连接本地局域网的网卡名(用ip addr命令查看,比如enp0s3、br0) PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
如果你的WireGuard Docker用的是默认桥接模式,建议改成host模式,这样容器能直接复用NAS的网络栈,减少不必要的端口转发和网络隔离问题。
第二步:给树莓派(WG客户端)推送本地局域网路由
在服务器端对应树莓派的[Peer]配置段里,修改AllowedIPs,把本地局域网网段加进去,让树莓派知道要把本地局域网的流量走WG隧道传输:
[Peer] PublicKey = 树莓派的公钥 AllowedIPs = 10.8.0.2/32, 192.168.1.0/24 # 前面是树莓派的WG IP,后面替换成你家本地局域网的实际网段
改完后重启WireGuard服务器容器,让配置生效。
第三步:给本地局域网添加静态路由,指向WG子网
这一步是让本地所有设备知道:访问WG子网的设备(比如树莓派的10.8.0.2),需要把流量发给NAS。
最省心的方式是在家庭主路由器上配置:
- 登录路由器管理后台(一般是192.168.1.1或192.168.0.1)
- 找到「静态路由」或「路由表」设置项
- 添加一条路由规则:
- 目标网络:WG子网网段,比如
10.8.0.0/24 - 子网掩码:
255.255.255.0 - 下一跳(网关):NAS的本地IP,比如
192.168.1.100
- 目标网络:WG子网网段,比如
- 保存配置,部分路由器需要重启后生效。
如果没法在路由器上配置,也可以在单台本地设备上手动加路由:Windows用route add 10.8.0.0 mask 255.255.255.0 192.168.1.100,Linux用sudo ip route add 10.8.0.0/24 via 192.168.1.100,不过路由器配置是一劳永逸的方案。
第四步:验证连通性和测试服务
- 先确认树莓派已成功连入WG,在树莓派上执行
ping 192.168.1.100(NAS本地IP),能通就说明树莓派能访问本地局域网了。 - 在本地电脑上执行
ping 10.8.0.2(树莓派WG IP),能通就说明本地设备能访问WG子网了。 - 测试树莓派web界面:直接在本地浏览器输入
http://10.8.0.2:端口号,正常打开就没问题。 - 测试NAS备份到CIFS:在NAS上添加共享文件夹,地址填
//10.8.0.2/共享名,配置好权限就能自动备份了。
额外注意事项
- 防火墙:NAS的防火墙要允许UDP 51820端口(WG默认端口),还要允许本地局域网和WG子网的转发流量;树莓派的防火墙要放开CIFS(445端口)和web界面的端口,避免被拦截。
- 如果用的是linuxserver/wireguard这类现成Docker镜像,有些会自动处理IP转发和iptables规则,可以先看镜像文档,可能不需要手动加PostUp/PostDown,但核心逻辑是一致的。
备注:内容来源于stack exchange,提问作者Elio




