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.1
- eth1: 内网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 - 直接连接在eth1
- 192.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