Linux 多网口路由配置实践:解决双网口通讯问题

113 阅读4分钟

前言

我在实际开发中,遇到一个需求:开发板上有多个网络接口,一个用于接入局域网用于常规通信,另一个需要使用一根专用网线与设备建立点对点通信。本文记录了我在实现这种双网口配置时遇到的问题及解决方案。

问题描述

开发板上的 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<link>
     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<global>
     inet6 fe80::c274:2bff:fefc:7fe3  prefixlen 64  scopeid 0x20<link>
     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地址子网掩码网络号广播地址
    enP3p49s0192.168.0.154255.255.255.0192.168.0.0/24192.168.0.255
    enP4p65s010.200.126.177255.255.255.24010.200.126.176/2810.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

关键发现

  1. 默认网关绑定在 enP3p49s0:所有非直连流量(0.0.0.0/0)都通过该接口转发
  2. enP4p65s0 缺少路由配置:系统中没有为 10.200.126.176/28 网段定义任何路由规则
  3. 路由决策缺陷:当系统尝试访问 10.200.126.178 时,由于没有精确匹配的路由条目,数据包会被错误地发送到默认网关接口 enP3p49s0

3. 问题根源

Linux 内核的路由决策遵循以下原则:

  1. 首先查找与目标地址最精确匹配的路由
  2. 若无匹配,则使用默认路由(0.0.0.0/0
  3. 在我们的场景中,由于缺乏 10.200.126.176/28 网段的路由,所有发往该网段的流量都被导向 enP3p49s0
  4. enP3p49s0 位于 192.168.0.0/24 网段,无法直接与 10.200.126.178 通信

4. 解决方案

由于 enP4p65s0 接口缺少目标网络(10.200.126.176/28)的路由配置,系统将发往 10.200.126.178 的流量错误地通过默认网关(enP3p49s0)转发。这导致了子网不匹配的路由冲突。为解决此问题,需为 enP4p65s0 添加对应的直连路由或策略路由。

下面步骤仅提供临时添加路由的方案,关于路由的持久化配置需要根据不同操作系统的不同网络服务来更改指定的网络配置文件:

方案一: 添加整个子网的路由(推荐)

sudo ip route add 10.200.126.176/28 dev enP4p65s0

优点:配置简单,适用于该网段内的所有设备通信

方案二:添加特定目标路由

sudo ip route add 10.200.126.178/32 dev enP4p65s0

优点:路由表更简洁,安全性更高

验证配置

# 查看更新后的路由表
route -n

# 测试连通性
ping -c 3 10.200.126.178

在网络编程和系统配置中,理解底层网络原理(如路由决策机制)对于解决实际问题至关重要。希望本文的经验能帮助遇到类似问题的开发者快速定位和解决问题。