前言
我在实际嵌入式开发中,遇到一个需求:开发板上有多个网络接口,一个用于接入局域网用于常规通信,另一个需要使用一根专用网线与设备建立点对点通信。本文记录了我在实现这种双网口配置时遇到的问题及解决方案。
问题描述
开发板上的 enP4p65s0 网口通过专用网线连接到目标设备(IP: 10.200.126.178)。虽然网络连接正常,但发送的数据包始终收不到响应。经过排查,发现问题的根源在于系统的路由配置。
1. 网络接口状态检查
输入下面指令便可以查看所有网卡的基本配置:
ifconfig
enP3p49s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.154 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::c274:2bff:fefc:7fe2 prefixlen 64 scopeid 0x20 ether c0:74:2b:fc:7f:e2 txqueuelen 1000 (Ethernet) RX packets 21682 bytes 6907131 (6.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3885 bytes 322145 (314.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enP4p65s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.200.126.177 netmask 255.255.255.240 broadcast 10.200.126.255 inet6 2408:823c:2014:16bc:c274:2bff:fefc:7fe3 prefixlen 64 scopeid 0x0 inet6 fe80::c274:2bff:fefc:7fe3 prefixlen 64 scopeid 0x20 ether c0:74:2b:fc:7f:e3 txqueuelen 1000 (Ethernet) RX packets 250982 bytes 115601842 (110.2 MiB) RX errors 0 dropped 51888 overruns 0 frame 0 TX packets 38982 bytes 19950842 (19.0 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
网络配置解析
| 接口 | IP地址 | 子网掩码 | 网络号 | 广播地址 |
|---|---|---|---|---|
| enP3p49s0 | 192.168.0.154 | 255.255.255.0 | 192.168.0.0/24 | 192.168.0.255 |
| enP4p65s0 | 10.200.126.177 | 255.255.255.240 | 10.200.126.176/28 | 10.200.126.255 |
2. 路由表分析
单看接口配置还无法确定路由行为,需要检查系统的路由表:
route -n
路由表如下:
Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 enP3p49s0 169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enP3p49s0 172.10.10.230 0.0.0.0 255.255.255.255 UH 10 0 0 enP3p49s0 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 enP3p49s0
关键发现
- 默认网关绑定在
enP3p49s0:所有非直连流量(0.0.0.0/0)都通过该接口转发 enP4p65s0缺少路由配置 :系统中没有为10.200.126.176/28网段定义任何路由规则- 路由决策缺陷 :当系统尝试访问
10.200.126.178时,由于没有精确匹配的路由条目,数据包会被错误地发送到默认网关接口enP3p49s0
3. 问题根源
Linux 内核的路由决策遵循以下原则:
- 首先查找与目标地址最精确匹配的路由
- 若无匹配,则使用默认路由(
0.0.0.0/0) - 在我们的场景中,由于缺乏
10.200.126.176/28网段的路由,所有发往该网段的流量都被导向enP3p49s0 enP3p49s0位于192.168.0.0/24网段,无法直接与10.200.126.178通信
4. 解决方案
由于 enP4p65s0 接口缺少目标网络(10.200.126.176/28)的路由配置,系统将发往 10.200.126.178 的流量错误地通过默认网关(enP3p49s0)转发。这导致了子网不匹配的路由冲突。为解决此问题,需为 enP4p65s0 添加对应的直连路由或策略路由。
方案一: 添加整个子网的路由(推荐)
csharp
sudo ip route add 10.200.126.176/28 dev enP4p65s0
优点:配置简单,适用于该网段内的所有设备通信
方案二:添加特定目标路由
csharp
sudo ip route add 10.200.126.178/32 dev enP4p65s0
优点:路由表更简洁,安全性更高
验证配置
r
# 查看更新后的路由表
route -n
# 测试连通性
ping -c 3 10.200.126.178