从服务器本地网络访问VPN子网内的设备
我完全懂你的需求——就是想让家里192.168.1.x网段的所有设备,不用自己连WireGuard,就能直接SSH、远程桌面或者Ping到那些已经连到你Pi上的VPN客户端(10.0.0.x网段)对吧?这个需求太实用了,不用每台设备都折腾VPN连接确实省心很多。
咱们一步步来解决这个问题,先理清楚核心的几个关键点:IP转发、双向防火墙规则、客户端路由配置,还有本地网络的路由指向。
1. 先确保Pi的IP转发功能开启
这是所有转发的基础,必须先搞定:
- 临时生效(重启后失效):执行
echo 1 > /proc/sys/net/ipv4/ip_forward - 永久生效:编辑
/etc/sysctl.conf,找到net.ipv4.ip_forward=1这一行,把前面的注释符号#去掉,然后执行sysctl -p让配置立刻生效。
2. 修改Pi上的WireGuard配置(wg0.conf)
你原来的PostUp/PostDown只处理了wg0到eth0的单向转发,现在要改成双向转发,同时兼顾eth0和wlan0(不管Pi用有线还是无线连家里网都能生效):
[Interface] # 保留你原来的PrivateKey、ListenPort等配置 PostUp = iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT; iptables -A FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; iptables -A FORWARD -i wg0 -o wlan0 -j ACCEPT; iptables -A FORWARD -i wlan0 -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT; iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; iptables -D FORWARD -i wg0 -o wlan0 -j ACCEPT; iptables -D FORWARD -i wlan0 -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE
这个配置的作用是:
- 允许wg0和eth0/wlan0之间的双向流量转发
- 对从wg0出去到eth0/wlan0的流量做NAT,让VPN客户端能正确回包到本地网络
3. 配置VPN客户端的WireGuard规则
每个连到Pi的VPN客户端,必须在它们的配置文件里添加你的本地网段,这样客户端才知道要把发往192.168.1.x的流量通过VPN发给Pi:
比如客户端的[Peer]部分应该是这样:
[Peer] PublicKey = 你的Pi的公钥 Endpoint = 你的Pi的公网IP:51820(或者内网IP,如果是远程连的话用公网) AllowedIPs = 10.0.0.0/24, 192.168.1.0/24 # 如果客户端需要通过VPN访问互联网,就把AllowedIPs改成0.0.0.0/0, ::/0,但如果只需要访问本地网和VPN子网,上面两个网段就够了
⚠️ 注意:你之前在Pi的[Peer]里加AllowedIPs = 10.0.0.8/32, 192.168.1.0是错误的,这也是wg0重启失败的原因!Pi的Peer配置里的AllowedIPs是用来识别来自该客户端的流量,你把本地网段加进去,等于告诉Pi“所有来自192.168.1.x的流量都属于这个客户端”,但Pi本身就在192.168.1.x网段,这就冲突了,所以WireGuard启动会崩溃。Pi这边的Peer只需要写客户端的VPN IP就行,比如AllowedIPs = 10.0.0.8/32。
4. 给本地网络添加静态路由
这一步是让家里的设备知道“要访问10.0.0.x网段,就把流量发给Pi”:
- 最优方案:在你的家用路由器上配置静态路由,目标网段填
10.0.0.0/24,下一跳填Pi的本地IP(比如192.168.1.xx)。这样所有本地设备都会自动走这条路由,不用单独配置。 - 如果路由器没法配置,就在每台本地设备上手动加:
- Windows:打开命令提示符(管理员),执行
route add 10.0.0.0 mask 255.255.255.0 192.168.1.xx - Linux/macOS:执行
ip route add 10.0.0.0/24 via 192.168.1.xx dev eth0(把eth0换成你的网卡名)
- Windows:打开命令提示符(管理员),执行
测试验证
做完以上配置后:
- 重启Pi上的WireGuard:
wg-quick down wg0 && wg-quick up wg0 - 让远程客户端连到VPN
- 用家里的任意设备(比如192.168.1.laptop)直接Ping客户端的VPN IP(比如10.0.0.8),或者尝试SSH、远程桌面,应该就能直接通了!
备注:内容来源于stack exchange,提问作者atclaus

