VPN连接(VPN服务器+树莓派+子网)中NAS无法访问RPi以太网子网摄像头的问题排查
看起来你遇到的是典型的跨VPN子网路由双向可达性问题,咱们一步步来拆解排查和解决:
核心问题分析
目前你的网络链路是:NAS(OpenVPN服务器,192.168.1.142)→ VPN隧道(tun0,10.8.0.0/24)→ RPi(10.8.0.10)→ 摄像头子网(10.42.0.0/24)。现在RPi能访问摄像头,但NAS不行,本质是路由缺失+IP转发未开启导致的双向流量不通。
第一步:给NAS添加静态路由,指向RPi的VPN节点
NAS当前的路由表中没有10.42.0.0/24子网的条目,所以它根本不知道该把访问摄像头的数据包发往哪里。你需要告诉NAS:要访问10.42.0.0/24这个子网,所有数据包都通过VPN隧道(tun0)发往RPi的VPN内网IP(10.8.0.10)。
在NAS上执行临时生效的路由添加命令:
ip route add 10.42.0.0/24 via 10.8.0.10 dev tun0
验证路由是否生效:
ip route | grep 10.42.0.0
如果要让这个路由永久生效(NAS重启后不消失),需要根据你的NAS系统操作:比如Synology NAS可以在「控制面板 > 网络 > 静态路由」里手动添加;如果是Linux-based的NAS,把这条命令加到开机启动脚本里。
第二步:确保RPi开启了IP转发功能
RPi作为连接VPN和摄像头子网的中间节点,必须允许IP数据包在不同网络接口之间转发(从tun0到eth0,反之亦然),而Linux系统默认是关闭这个功能的。
- 临时开启(重启RPi后失效):
sudo sysctl -w net.ipv4.ip_forward=1
- 永久开启(编辑系统配置文件):
打开sysctl配置文件:
sudo nano /etc/sysctl.conf
找到net.ipv4.ip_forward=1这一行,去掉前面的注释符号#,保存退出后执行:
sudo sysctl -p
让配置立即生效。
第三步:检查RPi的防火墙(iptables)转发限制
如果你的RPi开启了防火墙,默认的iptables规则可能会阻止跨接口的转发流量,需要手动允许tun0和eth0之间的双向转发:
sudo iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT sudo iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT
如果要让这些iptables规则永久保存(RPi重启后不丢失),可以安装iptables-persistent包:
sudo apt update && sudo apt install iptables-persistent
安装过程中会提示你保存当前的iptables规则,选择「Yes」即可。
第四步:优化回程路由(摄像头到NAS的流量)
摄像头的默认网关是RPi的eth0 IP(10.42.0.1),理论上摄像头发往NAS的数据包会通过RPi的VPN路由转发回NAS,但如果还是出现丢包,你可以在RPi上配置SNAT(源地址转换),让摄像头的数据包看起来是从RPi的VPN IP发出的,这样NAS的回复包能准确回到RPi:
sudo iptables -t nat -A POSTROUTING -s 10.42.0.0/24 -o tun0 -j MASQUERADE
最后:测试连通性
完成上面所有步骤后,回到NAS上执行ping命令测试:
ping 10.42.0.231
如果还是不通,可以在RPi上抓包排查:
- 查看VPN接口是否收到NAS的ping包:
sudo tcpdump -i tun0 icmp - 查看以太网接口是否把包转发到摄像头:
sudo tcpdump -i eth0 icmp
通过抓包可以快速定位是哪一段链路的流量出了问题。
备注:内容来源于stack exchange,提问作者pepco2

