在无网关的隔离网络中实现静态路由通信,本质是通过on-link直连路由绕过子网校验,使不同网段主机在二层直连前提下直接ARP通信:需在双方分别执行ip route add <对方网段> dev <接口> src <本机IP> on-link,并确保物理/交换层面二层可达。

在没有网关的隔离网络中实现静态路由通信,本质是绕过“必须经由网关转发”的惯性思维——这类网络通常由多台 Linux 主机直连(如用交叉线、交换机或虚拟网络),各主机处于同一二层广播域但配置了不同网段的 IP 地址,彼此无法直接通信,因为默认情况下系统会判断目标不在本地子网,又无可用网关,于是丢弃数据包。
要让它们通起来,关键不是加网关,而是告诉内核:“这个目标网段,就从我这张网卡直接发出去,不用找下一跳”。
静态路由指向直连子网(无 via,用 dev + on-link)
这是最核心的操作:添加一条直连路由(connected route),明确指定目标网段与本机某接口属于同一链路,无需网关参与。
例如:
- 主机 A 配置:
eth0上 IP 为192.168.10.10/24 - 主机 B 配置:
eth0上 IP 为192.168.20.20/24 - 两台主机通过交换机物理直连,但网段不重叠 → 默认不通
此时,在主机 A 上执行:
sudo ip route add 192.168.20.0/24 dev eth0 src 192.168.10.10 on-link
-
dev eth0:指定出口网卡 -
src 192.168.10.10:强制使用该地址作为源 IP(避免回包因地址不匹配被拒) -
on-link:告知内核该网段是直连的,ARP 可直接请求目标 MAC,不检查网关是否存在
同样,在主机 B 上执行:
sudo ip route add 192.168.10.0/24 dev eth0 src 192.168.20.20 on-link
✅ 执行后,ping 192.168.20.20(从 A 到 B)和 ping 192.168.10.10(从 B 到 A)即可通。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
⚠️ 注意:若省略
on-link,内核仍会尝试查网关;若没配via又没on-link,命令可能报错或静默失败。
确保二层可达性(ARP 和交换机)
静态路由生效的前提是底层能解析到对方 MAC 地址:
- 确认两主机
eth0处于同一物理/虚拟交换网络(无 VLAN 隔离、无端口安全限制) - 手动触发 ARP 学习(可选):
arp -s 192.168.20.20 00:11:22:33:44:55 # 绑定 B 的 IP 和 MAC(需已知)
- 或直接 ping 触发自动 ARP 请求;若
arp -n看不到对方条目,说明链路层不通,需先排查物理连接或交换机配置。
永久化配置(按发行版)
临时路由重启即失,需写入配置:
-
CentOS/RHEL/Fedora(network-scripts)
编辑/etc/sysconfig/network-scripts/route-eth0,写入:192.168.20.0/24 dev eth0 src 192.168.10.10 on-link
-
Ubuntu/Debian(Netplan)
在/etc/netplan/*.yaml对应接口下添加:routes: - to: 192.168.20.0/24 via: 0.0.0.0 on-link: true from: 192.168.10.10 metric: 100注:Netplan 不支持
dev字段,但on-link: true+via: 0.0.0.0等效于直连路由;from字段指定源地址。 通用兼容方案(rc.local 或 systemd service)
若配置工具不支持on-link,可在开机脚本中执行完整ip route add ... on-link命令。
补充:为什么不能只靠 ip route add ... dev eth0?
单纯写 ip route add 192.168.20.0/24 dev eth0 会被内核识别为“直连”,但前提是目标网段必须与接口主 IP 在同一子网。而此处两个网段互不重叠,内核默认拒绝这种“跨子网直连”行为,除非显式声明 on-link —— 它覆盖了子网校验逻辑,是解决该场景的必要开关。
不复杂但容易忽略。


















