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

前言

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

问题描述

开发板上的 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

关键发现

  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 添加对应的直连路由或策略路由。

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

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
相关推荐
天骄t11 小时前
OSI与TCP/IP:网络协议栈深度解析
linux
无事好时节11 小时前
Linux 进程通信:信号与共享内存详解
linux·网络·网络协议
春日见11 小时前
如何提升手眼标定精度?
linux·运维·开发语言·数码相机·matlab
weixin_4624462311 小时前
使用 Ubuntu 构建 code-server Docker 镜像的完整指南
linux·ubuntu·docker
Tipriest_11 小时前
Python 常用特殊变量与关键字详解
linux·python·关键字·特殊变量
一周困⁸天.11 小时前
GitOps 详解与工具链全解析
linux·运维·devops
坐吃山猪11 小时前
Python命令行工具Fire
linux·开发语言·python
叫致寒吧11 小时前
Docker资源限制 与数据卷
linux·运维·docker
福尔摩斯张11 小时前
深入理解C/C++套接字编程:从基础到实践(超详细)
linux·c语言·开发语言·c++·tcp/ip·udp
旖旎夜光11 小时前
Linux(4)(上)
linux