WireGuard树莓派客户端无法访问家庭服务器网络的问题排查求助及解决方案
WireGuard树莓派客户端无法访问家庭服务器网络的问题排查求助及解决方案
大家好,我现在遇到了WireGuard客户端连接的棘手问题,实在摸不着头绪,来求助各位大佬!情况是这样的:我在家庭的树莓派#1上用Docker部署了WireGuard服务器,配置了两个Peer节点——一个是我的手机,另一个是放在异地网络里的树莓派#2。手机端的VPN用起来完全正常,但树莓派#2就是没法访问我家里的局域网,想请大家帮忙找找问题出在哪。
各设备配置信息
WireGuard服务器(树莓派#1)配置
[Interface] Address = 10.13.13.1 ListenPort = 51820 PrivateKey = server_private_key PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth+ -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth+ -j MASQUERADE [Peer] (myphone) PublicKey = myPhone_public_key PresharedKey = myphone_preshared_key AllowedIPs = 10.13.13.2/32 [Peer] (raspberry#2) PublicKey = raspberry#2_public_key PresharedKey = raspberry#2_preshared_key AllowedIPs = 10.13.13.3/32
手机端配置
[Interface] Address = 10.13.13.2 PrivateKey = myPhone_private_key ListenPort = 51820 DNS = 1.1.1.1 [Peer] PublicKey = server_public_key PresharedKey = myphone_preshared_key Endpoint = [public_IP]:51820 AllowedIPs = [public_IP], 192.168.1.0/24
树莓派#2初始配置
[Interface] Address = 10.13.13.3 PrivateKey = raspberry#2_private_key ListenPort = 51820 DNS = 1.1.1.1 [Peer] PublicKey = server_public_key PresharedKey = raspberry#2_preshared_key Endpoint = [public_IP]:51820 AllowedIPs = [public_IP], 192.168.1.0/24, 10.13.13.0/24
树莓派#2的路由表信息
执行ip route得到的输出:
default via 192.168.0.254 dev wlan0 proto dhcp src 192.168.0.140 metric 600 10.13.13.0/24 dev wg0 scope link [public_IP] dev wg0 scope link 192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.140 metric 600 192.168.1.0/24 dev wg0 scope link
说明:wg0是WireGuard接口(已正常启动),wlan0是树莓派#2的上网接口(正常运行),192.168.1.0/24是我想通过VPN访问的家庭局域网段
已尝试的排查步骤
- 从树莓派#2 ping/traceroute家庭网络里的设备(192.168.1.0/24段),完全没有响应
- ping/traceroute WireGuard服务器的VPN地址10.13.13.1也没反应
- ping 8.8.8.8正常,应该是分流模式起作用了
- 两边都执行
wg-quick down wg0关闭VPN后,用netcat在51820端口通信,树莓派#2发的消息能被服务器正常接收,说明ISP防火墙没拦截这个端口 - 在树莓派#2的AllowedIPs里添加了10.13.13.0/24,还是没用
- 想开启WireGuard日志,执行了下面的命令,但目录不存在,应该是内核不支持:
modprobe wireguard echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control
因为手机端完全正常,我倾向于问题出在树莓派#2这边,而且netcat能通,应该不是ISP防火墙的问题?现在实在没思路了,求大佬帮忙!
抓包排查更新(感谢@Cpt.Whale的提示)
服务器端tcpdump结果
- 用手机连接VPN时,能看到UDP包正常打到51820端口;
- 用树莓派#2尝试curl家里设备的IP和端口时,完全看不到任何相关的VPN包。
树莓派#2客户端tcpdump结果
- 能看到频繁出现的请求:
10.13.13.3.51820 > fvbn-ghf1-1-284-225.w85-125.abo.wanadoo.fr.51820: [bad udp cksum 0x8057 -> 0x1324!] UDP, length 148
(注:这个域名是我替换后的隐私版,实际解析到我的公网IP)
- 当尝试curl家庭设备时,能看到:
10.13.13.3.41874 > [home_asset_IP].[port]: Flags [S], cksum 0xd8f9 (incorrect -> 0xbdc6), seq 2392338409, win 64860, options [mss 1380,sackOK,TS val 811208298 ecr 0,nop,wscale 7], length 0
看起来是能正确指向VPN服务器的,但这个UDP校验错误是什么情况呢?
问题解决!
最后找到了可行的树莓派#2配置,只需要调整AllowedIPs字段,去掉对[public_IP]的单独指定,修改后的配置如下:
[Interface] Address = 10.13.13.3 PrivateKey = raspberry#2_private_key ListenPort = 51820 DNS = 1.1.1.1 [Peer] PublicKey = server_public_key PresharedKey = raspberry#2_preshared_key Endpoint = [public_IP]:51820 AllowedIPs = 192.168.1.0/24, 10.13.13.0/24
特别感谢@Cpt.Whale的时间和@Justin Ludwig给出的解决方案!
备注:内容来源于stack exchange,提问作者rasphomie
相关产品推荐
相关产品推荐

