解决Ubuntu双网卡路由冲突:手把手教你用`ip route`命令精准控制流量走向 Ubuntu双网卡路由冲突排查与流量控制实战指南当你在Ubuntu服务器上配置了双网卡后是否遇到过这样的困扰内网请求莫名其妙走了外网网关或者某些网段完全无法访问这种看似简单的网络配置背后其实隐藏着Linux路由表的精妙逻辑。本文将带你深入理解路由优先级机制并手把手教你用ip route命令精准控制流量走向。1. 双网卡路由冲突的核心问题想象一下这样的场景你的服务器同时连接着公司内网eth1和互联网eth0突然发现访问某些内部系统时速度异常缓慢甚至完全无法连接。这种问题的根源往往在于路由表的混乱配置。Linux系统处理网络请求时会按照路由表的优先级决定数据包的出口。当存在多个可能的路由路径时系统会根据以下规则进行选择最长前缀匹配更具体的子网掩码如/24比/16更具体优先级更高路由metric值数值越小优先级越高默认路由当没有其他匹配时使用常见的双网卡配置错误包括内网网段被错误地指向了外网网关默认路由设置不当导致所有流量都走单一网卡路由规则缺少持久化重启后失效提示使用ip route show或route -n可以查看当前路由表注意观察每条路由的metric值和网卡绑定情况2. 诊断路由问题的实用工具包在开始修改路由配置前我们需要一套完整的诊断工具来确认问题所在。以下是我在实际运维中总结的排查流程2.1 基础状态检查首先确认网卡和IP配置是否正确ip addr show # 查看所有网卡IP配置 ip link show # 查看网卡链路状态然后检查当前路由表ip route show table main # 查看主路由表2.2 路由追踪技巧当发现某个IP访问异常时使用以下命令追踪实际路径traceroute -n 192.168.3.123 # 追踪到目标IP的路由路径 mtr -n 192.168.3.123 # 实时路由追踪与质量监测2.3 路由优先级分析对于复杂场景需要分析路由匹配顺序ip route get 192.168.3.123 # 显示系统将如何处理到该IP的流量输出示例192.168.3.123 dev eth1 src 192.168.1.102 uid 0 cache这个结果告诉我们到192.168.3.123的流量将通过eth1网卡直接发出而不经过任何网关。3. 精细控制路由的四大实战场景掌握了诊断方法后我们来看几个典型的路由控制场景。以下操作都需要root权限建议使用sudo -i切换到root用户操作。3.1 场景一隔离内外网流量假设我们有以下网络环境eth0: 公网IP 203.0.113.10/24网关203.0.113.1eth1: 内网IP 192.168.1.100/24我们希望所有192.168.1.0/24的流量走eth1其他流量走eth0# 删除可能存在的冲突路由 ip route del 192.168.1.0/24 dev eth0 2/dev/null || true # 添加精确的内网路由 ip route add 192.168.1.0/24 dev eth1 proto static metric 100 # 设置默认路由通过外网 ip route add default via 203.0.113.1 dev eth0 metric 2003.2 场景二多网段路由配置当内网包含多个子网时需要为每个网段单独配置路由。例如192.168.1.0/24 - 直接连接在eth1192.168.2.0/24 - 需要通过网关192.168.1.254访问配置命令# 直连网段 ip route add 192.168.1.0/24 dev eth1 proto static # 需要通过网关访问的网段 ip route add 192.168.2.0/24 via 192.168.1.254 dev eth13.3 场景三路由持久化配置通过命令行添加的路由在重启后会丢失。要使配置永久生效需要修改网络配置文件Ubuntu 18.04及以上版本vim /etc/netplan/50-cloud-init.yaml添加如下内容network: version: 2 ethernets: eth0: routes: - to: 0.0.0.0/0 via: 203.0.113.1 metric: 200 eth1: routes: - to: 192.168.1.0/24 via: 0.0.0.0 metric: 100应用配置netplan apply3.4 场景四基于策略的路由对于更复杂的场景可能需要基于源IP决定路由路径。这需要配置多路由表和策略路由首先创建自定义路由表echo 100 internal /etc/iproute2/rt_tables添加路由规则# 为内网IP使用自定义路由表 ip rule add from 192.168.1.100/32 table internal # 在自定义路由表中配置路由 ip route add 192.168.1.0/24 dev eth1 table internal ip route add default via 192.168.1.254 dev eth1 table internal4. 高级路由调优技巧4.1 路由Metric优化当存在多条等价路由时metric值决定了优先级。调整metric可以控制主备路由# 设置主路由metric较低 ip route add default via 203.0.113.1 dev eth0 metric 100 # 设置备用路由metric较高 ip route add default via 192.168.1.254 dev eth1 metric 2004.2 连接追踪与状态检测对于关键业务可以启用路由状态检测# 安装监控工具 apt install -y iproute2 iputils-arping # 设置路由健康检查 ip route add default via 203.0.113.1 dev eth0 \ proto static metric 100 \ onlink \ advmss 1400 \ mtu 15004.3 路由缓存管理Linux会缓存常用路由以提升性能但有时需要手动清除# 清除整个路由缓存 ip route flush cache # 清除特定目标的路由缓存 ip route flush 192.168.1.0/245. 常见问题与解决方案在实际部署中经常会遇到一些典型问题。以下是几个我遇到过的案例问题一添加路由后立即失效原因NetworkManager等网络管理服务覆盖了手动配置解决方案禁用自动管理或配置更高优先级的路由问题二VPN连接后路由混乱原因VPN客户端修改了默认路由解决方案为VPN配置特定的路由表不影响原有路由问题三多网卡绑定时的路由异常原因bonding驱动未正确配置解决方案确保bonding模式与路由策略匹配路由配置看似简单但在实际生产环境中一个小小的metric值差异就可能导致完全不同的网络行为。建议每次修改后都进行完整测试# 测试各网段连通性 ping -c 4 192.168.1.1 ping -c 4 192.168.2.1 ping -c 4 8.8.8.8 # 测试路由路径 traceroute -n 192.168.2.1 mtr -n 8.8.8.8