通过VPS部署的WireGuard VPN实现家庭局域网远程访问的配置求助
我的问题背景
我现在用VPS搭了WireGuard VPN,已经添加了两个Peer:我的个人笔记本,还有家里一直保持VPN连接的树莓派。目前的情况是:笔记本连VPN后能SSH到树莓派,在树莓派上能访问家里所有设备,但我想直接在笔记本上输入家庭路由器的地址(比如192.168.1.1)就能打开配置页——也就是把家庭局域网的流量通过VPN路由到树莓派,再由树莓派转发到家里的网络。现在树莓派只是普通Peer,是不是得把它配置成路由器?求各位大佬给点建议!
我的当前配置文件
Windows PC客户端配置
[Interface] PrivateKey = XXXXXXXXXX Address = 10.66.66.2/32, fd42:42:42::2/128 DNS = 9.9.9.9, 1.1.1.1 PostUp = "C:\Program Files\WireGuard\Data\Configurations\vpn-up.bat" PostDown = "C:\Program Files\WireGuard\Data\Configurations\vpn-down.bat" [Peer] PublicKey = XXXXXXXXXX PresharedKey = XXXXXXXXXX AllowedIPs = 0.0.0.0/0, ::/0 Endpoint = XXXXXXXXXX
Windows客户端的PostUp/PostDown脚本
vpn-up.bat
@echo off route -p ADD 192.168.0.0 MASK 255.255.0.0 10.66.66.3 METRIC 10
vpn-down.bat
@echo off route DELETE 192.168.0.0
已勾选「Block all untunneled traffic」选项
树莓派客户端配置
[Interface] PrivateKey = XXXXXXXXXX Address = 10.66.66.3/32,fd42:42:42::3/128 DNS = 9.9.9.9,1.1.1.1 [Peer] PublicKey = XXXXXXXXXX PresharedKey = XXXXXXXXXX Endpoint = XXXXXXXXXX AllowedIPs = 0.0.0.0/0,::/0 PersistentKeepalive = 25
已在sysctl.conf中开启IPv4转发:net.ipv4.ip_forward=1
树莓派路由表(netstat -rn)
Destination Gateway Genmask Flags MSS Window irtt Iface 0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 eth0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 192.168.1.1 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
WireGuard VPS服务器配置
[Interface] Address = 10.66.66.1/24,fd42:42:42::1/64 ListenPort = 53032 PrivateKey = SPnAugHnka45RWLzrDWBeAt8GA2e92yLVf6jeHXy0kw= PostUp = iptables -I INPUT -p udp --dport 53032 -j ACCEPT PostUp = iptables -I FORWARD -i enp1s0 -o wg0 -j ACCEPT PostUp = iptables -I FORWARD -i wg0 -j ACCEPT PostUp = iptables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE PostUp = ip6tables -I FORWARD -i wg0 -j ACCEPT PostUp = ip6tables -t nat -A POSTROUTING -o enp1s0 -j MASQUERADE PostDown = iptables -D INPUT -p udp --dport 53032 -j ACCEPT PostDown = iptables -D FORWARD -i enp1s0 -o wg0 -j ACCEPT PostDown = iptables -D FORWARD -i wg0 -j ACCEPT PostDown = iptables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE PostDown = ip6tables -D FORWARD -i wg0 -j ACCEPT PostDown = ip6tables -t nat -D POSTROUTING -o enp1s0 -j MASQUERADE ### Client Windows Laptop [Peer] PublicKey = XXXXXXXXXX= PresharedKey = XXXXXXXXXX= AllowedIPs = 10.66.66.2/32,fd42:42:42::2/128 ### Client RPi server [Peer] PublicKey = XXXXXXXXXX PresharedKey = XXXXXXXXXX AllowedIPs = 10.66.66.3/32,fd42:42:42::3/128,192.168.1.0/24
VPS路由表(netstat -rn)
0.0.0.0 192.XXX.XXX.1 0.0.0.0 UG 0 0 0 enp1s0 10.66.66.0 0.0.0.0 255.255.255.0 U 0 0 0 wg0 169.YYY.YYY.254 192.XXX.XXX.1 255.255.255.255 UGH 0 0 0 enp1s0 192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 wg0 192.XXX.XXX.0 0.0.0.0 255.255.254.0 U 0 0 0 enp1s0
已在sysctl.conf中开启IPv4转发:net.ipv4.ip_forward=1
问题分析与解决方案建议
兄弟,你的思路完全正确,树莓派确实需要承担路由转发的角色,现在的配置差了几个关键步骤,我帮你梳理下:
1. 树莓派侧补充转发与SNAT规则
你已经开了net.ipv4.ip_forward=1,这是基础,但还需要配置iptables让树莓派能把WireGuard的流量转发到家庭局域网,同时做SNAT转换(不然家里的设备不知道怎么把数据包发回给你的笔记本)。
在树莓派上执行以下命令(可以用iptables-persistent保存规则,或者加到开机自启脚本里):
# 允许WireGuard流量转发到家庭局域网 iptables -A FORWARD -i wg0 -o eth0 -j ACCEPT # 允许家庭局域网的响应流量转发回WireGuard iptables -A FORWARD -i eth0 -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT # SNAT转换:把WireGuard过来的数据包源地址换成树莓派的家庭局域网IP iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
2. 优化Windows客户端的路由配置
你现在Windows的AllowedIPs是0.0.0.0/0(全流量走VPN),虽然加了静态路由脚本,但可以更精准:把家庭局域网段(192.168.1.0/24)加到AllowedIPs里,WireGuard会自动处理路由,不用依赖bat脚本。
修改Windows客户端的[Peer]段:
[Peer] PublicKey = XXXXXXXXXX PresharedKey = XXXXXXXXXX # 保留全流量VPN的同时,明确指定家庭网段路由 AllowedIPs = 10.66.66.0/24, 192.168.1.0/24, 0.0.0.0/0 Endpoint = XXXXXXXXXX
如果还是想用bat脚本,注意你的家庭网段是192.168.1.0/24,脚本里的192.168.0.0/16虽然能覆盖,但更精准的话改成:route -p ADD 192.168.1.0 MASK 255.255.255.0 10.66.66.3 METRIC 10
3. 检查VPS的转发规则
你的VPS配置里已经加了iptables -I FORWARD -i wg0 -j ACCEPT,这个没问题,但要确保VPS的系统防火墙(比如ufw、firewalld)没有阻止转发流量。另外VPS上的树莓派Peer段已经把192.168.1.0/24加到AllowedIPs,这一步很关键,VPS才知道把家庭网段的流量转发给树莓派,这个配置是对的。
4. 家庭路由器添加静态路由(可选但推荐)
如果家里设备无法响应笔记本的请求,可能是因为它们的默认网关是家庭路由器,不知道怎么把数据包发回WireGuard网络。这时候可以在路由器上添加一条静态路由:
- 目标网络:10.66.66.0/24(WireGuard网段)
- 下一跳:树莓派的家庭局域网IP(比如192.168.1.X)
这样路由器就知道把发往WireGuard网段的数据包交给树莓派处理。
测试步骤
- 重启树莓派的WireGuard服务:
sudo wg-quick down wg0 && sudo wg-quick up wg0 - 重启Windows的WireGuard连接
- 在Windows上ping 192.168.1.1,验证连通性
- 若ping通,浏览器访问192.168.1.1即可打开路由器配置页
备注:内容来源于stack exchange,提问作者vviston




