虚拟机通过openwrt路由器,无法访问到我的局域网中的设备

作者:

简单记录一下吧,主要就是我自己的虚拟机通过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真的还很有用。

虽然中间耽误了好久一直找不到原因,但是结果总归是好的。比起我自己搜索来说还是要好的多,让我自己无论如何都想不到是这个原因。