Ubuntu 同网段ip区分网卡路由设置

前段时间工作中遇到个不是很常见的网络需求,具体事件描述:公司在一个客户那里有一台服务器(4块网卡),还有一台工控机,需求是服务器的网卡1配置DHCP连接公网,网卡2与工控机通过一台交换机连接进行通讯,两个网卡在同一网段内(192.168.1.0/24),这就造成了网卡2配置了192.168.1.*/24的IP后 与 工控机都插在交换机上但是无法正常通信,即ping不通对方的情况,后来在网上找了一些帖子,一般都写的配置和解决办法非常模糊,而且一度造成很大的误导,通过实际的环境测试很简单就解决这种场景需求的问题。

对服务器的网络进行配置,我这里的服务器操作系统是Ubuntu22.0.4

#vim /etc/netplan/00-installer-config.yaml

network:
  ethernets:
    eth0:
      dhcp4: true
    eth1:
      dhcp4: false
      addresses:
      - 192.168.1.10/32
      routes:
      - to: 192.168.1.20/32
        metric: 200
  version: 2

* 这里192.168.1.10是服务器网卡2的配置,192.168.1.20是工控机的IP地址,必须要加routes:配置否则到工控机的IP不通

看一下网卡情况

#ifconfig

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:22:27:98:5d  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 
<think>首先,用户的问题是基于引用内容,我需要解决Ubuntu系统中一个网卡无法ping通网段IP的问题。用户提供了引用[1]到[4],这些引用讨论了在Ubuntu系统中配置多个网卡网段时的问题和解决方法。 关键点: - 引用[1]:当多个网卡配置在一个子网时,只有第一个网卡能正常工作,因为路由问题。 - 引用[2]:描述了类似问题,服务器有多个网卡网段,导致无法通信。 - 引用[3]:提供了解决方案,使用ip route和ip rule命令来设置路由表,确保流量从正确的网卡出去。 - 引用[4]:提到了配置双网卡时,设置静态IP。 用户的具体问题是:Ubuntu配置双网卡,其中一个网卡无法ping通网段IP。 我的回答需要: - 结构清晰,逐步解决问题。 - 使用中文。 - 遵循LaTeX格式:行内数学表达式用$...$,独立公式用$$...$$。 - 生成相关问题。 - 在引用的段落末尾添加引用标识,如[^1]。 回答结构: 1. **问题分析**:解释为什么会出现这个问题。基于引用[1],当多个网卡网段时,系统默认路由会将所有流量路由到第一个网卡。 2. **解决方案**:提供步骤来解决问题。引用[3]给出了详细方法,使用ip route和ip rule命令创建自定义路由表。 3. **步骤说明**:逐步指导如何配置。 4. **验证方法**:如何检查问题是否解决。 5. **相关问题**:生成相关问题。 解决方案的核心: - 使用ip route flush table来清除路由。 - 使用ip route add default via ... dev ... table ...来设置默认路由。 - 使用ip rule add from ... table ...来添加规则,基于源IP选择路由表。 - 确保配置在重启后持久化,如写入/etc/network/interfaces或脚本中。 基于引用[3],脚本示例已给出,我可以简化并提供清晰步骤。 最终回答: - 开头:简要介绍问题。 - 步骤:分步指导。 - 结尾:总结和生成相关问题。</think>### Ubuntu 配置双网卡时一个网卡无法ping通网段IP的解决方法 在Ubuntu系统中,当多个网卡配置在一个子网(例如192.168.1.0/24)时,系统默认路由会将所有流量导向第一个激活的网卡,导致其他网卡无法正常通信[^1]。这是因为Linux内核的路由表基于子网掩码优先匹配原则,而不是基于网卡接口。例如,如果eth0配置为192.168.1.2/24,eth1配置为192.168.1.3/24,系统会将所有192.168.1.0/24的流量都路由到eth0,使eth1无法ping通网段设备[^2]。下面我将逐步解释问题原因并提供解决方案。 #### 问题原因分析 - **路由冲突**:当多个网卡一子网时,系统只使用一个默认路由表(main表),所有流量被强制路由到第一个网卡。数学上,这可以用路由选择算法描述:系统优先选择最长前缀匹配的子网,但一子网的多个接口会冲突。公式表示为: $$ \text{路由决策} = \arg\min_{\text{网卡}} \left( \text{子网掩码长度} \right) \quad \text{但当掩码长度相时,系统默认选择第一个接口}。 $$ - **典型症状**:一个网卡能ping通网段IP,另一个网卡则超时或失败,即使物理连接正常[^2]。 #### 解决方法:使用自定义路由表 要解决此问题,需要为每个网卡创建独立的路由表,并基于源IP地址选择路由。这通过`ip route`和`ip rule`命令实现。以下是详细步骤(以双网卡eth0和eth1为例,假设eth0 IP为192.168.1.2/24,eth1 IP为192.168.1.3/24,网关分别为192.168.1.1和192.168.1.254)。 1. **添加自定义路由表**: - 编辑`/etc/iproute2/rt_tables`文件,添加两个新表(例如tel和cnc): ```bash sudo nano /etc/iproute2/rt_tables ``` 在文件末尾添加: ``` 200 tel # 为eth0创建的表 201 cnc # 为eth1创建的表 ``` 保存并退出。 2. **配置路由规则**: - 为每个网卡设置默认路由和规则。运行以下命令(替换IP和网关为实际值): ```bash # 清除旧路由 sudo ip route flush table tel sudo ip route flush table cnc # 为eth0添加路由(tel表) sudo ip route add default via 192.168.1.1 dev eth0 table tel sudo ip rule add from 192.168.1.2 table tel # 为eth1添加路由(cnc表) sudo ip route add default via 192.168.1.254 dev eth1 table cnc sudo ip rule add from 192.168.1.3 table cnc ``` - **解释**:`ip route add`设置默认网关,`ip rule add`绑定源IP路由表。例如,源IP为192.168.1.3的流量使用cnc表,通过eth1路由[^3]。 3. **使配置持久化**: - 创建启动脚本,确保重启后规则生效。编辑`/etc/network/interfaces`或添加脚本: ```bash sudo nano /etc/rc.local ``` 在`exit 0`前添加命令: ```bash ip route flush table tel ip route add default via 192.168.1.1 dev eth0 table tel ip rule add from 192.168.1.2 table tel ip route flush table cnc ip route add default via 192.168.1.254 dev eth1 table cnc ip rule add from 192.168.1.3 table cnc exit 0 ``` 保存后,赋予执行权限: ```bash sudo chmod +x /etc/rc.local ``` 4. **验证配置**: - 重启网络服务:`sudo systemctl restart networking`。 - 检查路由规则:`ip rule list`,应看到类似输出: ``` 0: from all lookup local 32765: from 192.168.1.2 lookup tel 32766: from 192.168.1.3 lookup cnc ``` - 测试ping:从eth1 ping网段设备(如192.168.1.100),应成功响应: ```bash ping -I eth1 192.168.1.100 ``` #### 注意事项 - 此方法已在Ubuntu系统测试有效,其他Linux发行版可能需调整[^1]。 - 如果网卡配置为DHCP,需在`/etc/network/interfaces`中设置静态IP,避免IP变化导致规则失效[^4]。 - 问题本质是路由策略,而非硬件故障。确保网卡物理连接正常,并使用`ip addr show`检查IP配置。 通过以上步骤,您可以为每个网卡创建独立的路由路径,解决ping不通的问题。如果仍遇到问题,检查防火墙设置(如`ufw`)或使用`tcpdump`抓包诊断[^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值