简单记录一下吧,主要就是我自己的虚拟机通过openwrt路由器,无法访问到我的局域网中的设备。
我通过我的私有域名无法访问到设备,然后发现ping失败,以为是openwrt的防火墙设置中有问题,或者dns解析有问题,排查许久,没有结果。
最后排查了好久,最后发现是easytier这个软件开了一个子网代理,然后结果我的设备就愚蠢的一直通过easytier进行代理,然后不使用我设置的那个网卡的默认网关。
明明网关一下就可以直接连到。
最后还是通过 ip route get 10.10.16.8 命令,查找了一下默认的网关是怎么走的,然后才发现出现了问题。
完全没有想到这个原因,因为在路由器中可以看到icmp包,以为是路由器的问题,结果发现是因为全部走了代理,本来如果代理正常的话,是可以进行访问的,偏偏这个代理就有问题,所以连接失败……
问了AI,排查了路由表才发现问题。
// 之前easytier的返回
[cilisi@kangle02 ~]$ ip route get 10.10.16.8
10.10.16.8 dev tun0 src 172.18.199.130 uid 1000
// 正常的返回
[cilisi@kangle02 ~]$ ip route get 10.10.16.8
10.10.16.8 via 172.16.1.10 dev ens33 src 172.16.1.146 uid 1000
AI的排查方案:
必须执行的排查步骤
为了彻底解决访问
10.10.16.8的问题,请按照以下顺序操作:第一步:确认虚拟机的路由表
在虚拟机(172.16.1.146)中运行:
bash
ip route get 10.10.16.8
- 正确结果应显示:
10.10.16.8 via 172.16.1.10 dev ens33 src 172.16.1.146- 如果报错或指向其他网关:说明虚拟机不知道如何去往 10.10.16.x,需要检查虚拟机的默认网关是否设为
172.16.1.10。第二步:在 OpenWrt 上抓包验证转发
既然
br-lan上有流量,我们需要确认 OpenWrt 是否把包转发到了 WAN 口。请在 OpenWrt SSH 中执行:bash
tcpdump -i br-wan icmp and host 10.10.16.8(注:如果您的 WAN 口不是 br-wan,请替换为实际接口名,如 eth1)
然后再次从虚拟机 ping
10.10.16.8。
- 情况 A:WAN 口没有任何抓包
- 原因:OpenWrt 的防火墙阻止了转发,或者没有开启 NAT。
- 解决:进入 OpenWrt 后台 -> 网络 -> 防火墙 -> 找到 wan 区域 -> 勾选 IP 动态伪装 (Masquerading) -> 保存并应用。这是最常见的原因。
- 情况 B:WAN 口有 Request,但没有 Reply
- 原因:主路由(10.10.16.1)收到包后,不知道怎么回包给 172.16.1.x。
- 解决:这证实了必须开启 NAT(见情况 A 的解决方法)。开启 NAT 后,OpenWrt 会把源 IP 改成自己的 WAN IP (10.10.17.150),主路由就能正常回包了。
第三步:检查 OpenWrt 的 IPv4 转发设置
确保 OpenWrt 内核允许转发。在 SSH 中运行:
bash
sysctl net.ipv4.ip_forward
- 如果输出
net.ipv4.ip_forward = 0,则转发被禁用。- 解决:编辑
/etc/sysctl.conf,将net.ipv4.ip_forward=1取消注释,然后运行sysctl -p。
不得不说,AI真的还很有用。
虽然中间耽误了好久一直找不到原因,但是结果总归是好的。比起我自己搜索来说还是要好的多,让我自己无论如何都想不到是这个原因。
