服务器多网口路由配置的核心在于拆分策略路由表,用ip rule控制流量走向,而不是只改默认网关否则多网口同时在线必然打架。
很多运维第一次接触多网口服务器时,都以为把IP配上、网关填好就完事了,结果发现SSH连不上、内网通外网断、或者两个网口只有一个能干活,问题根源出在Linux默认只有一张main路由表,多网口都往里面写默认路由,内核不知道该把包交给谁,今天这篇文章就把配置文件怎么改、为什么这么改、踩坑点在哪一次说透。
服务器多网口路由配置文件怎么配
路由配置不是改/etc/network/interfaces或者NetworkManager里的IP就完事,核心在策略路由,策略路由让内核根据“来源IP”或“目标端口”等条件,选择不同的路由表,这套机制依赖三个配置文件:
/etc/iproute2/rt_tables:定义路由表编号和名称/etc/network/interfaces(Debian/Ubuntu)或/etc/sysconfig/network-scripts/route-ethX(CentOS/RHEL)接口配置- 启动脚本或
/etc/rc.local,负责把ip rule和ip route命令在开机时执行
以双网口服务器为例,业务网口eth0接公网,eth1接内网,默认路由走eth0,内网段走eth1,理想状态下,从eth1进来的包必须从eth1回去,否则回包走了eth0,内网设备就收不到响应,这叫反向路径过滤问题,也是大多数多网口故障的元凶。
解决思路很简单:给每个网口建一张独立路由表,流量从哪个口进就从哪个口出,先把/etc/iproute2/rt_tables打开,自定义两张表:
100 eth0_table
200 eth1_table
然后给每张表填充路由条目:
ip route add default via 203.0.113.1 dev eth0 table eth0_table
ip route add 192.168.10.0/24 dev eth1 src 192.168.10.10 table eth1_table
ip route add default via 192.168.10.1 dev eth1 table eth1_table
接着添加策略规则:
ip rule add from 203.0.113.10 lookup eth0_table
ip rule add from 192.168.10.10 lookup eth1_table
最后刷新生效:
ip route flush cache
这套配置在命令行能跑通,但重启就丢了,后面细说持久化方案。
多网口服务器路由表配置步骤
搞清楚原理后,实操时按以下步骤走。
第一步:确认网卡命名和当前路由状态
用ip addr和ip route show
查看当前地址和路由表,注意看清网卡名,云服务器上通常是eth0、eth1,物理机可能是enp3s0这种Predictable Network Interface命名,记住网卡名、IP、网关,接下来都用变量代入。
第二步:编辑rt_tables文件规划路由表
/etc/iproute2/rt_tables本身就是路由表的编号映射,系统预置了255(local)、254(main)、253(default),我们自定义从100以后开始加,这个文件全局生效,所有脚本都能引用表格名,比每次写裸编号可读性强很多。
第三步:卸载默认路由,避免路由冲突
这一步最常见的坑是:配好策略路由后发现不生效,原因是main表里的默认路由还在,策略路由的优先级低于main表,要把接口配置里的默认网关删掉,或者在使用NetworkManager时,把“自动连接”和“使用此连接作为默认路由”选项分开设置,在命令行中,先临时删除冲突路由:
ip route del default
然后按上文命令添加自定义路由并绑定规则。
第四步:持久化配置
Debian/Ubuntu系,/etc/network/interfaces里可以直接嵌套命令:
auto eth0
iface eth0 inet static
address 203.0.113.10
netmask 255.255.255.0
gateway 203.0.113.1
up ip route add default via 203.0.113.1 dev eth0 table eth0_table
up ip rule add from 203.0.113.10 lookup eth0_table
如果使用Netplan(Ubuntu 18.04+),在/etc/netplan/xxx.yaml的对应接口下加routes和routing-policy段落:
network:
ethernets:
eth0:
addresses: [203.0.113.10/24]
routes:
- to: default
via: 203.0.113.1
table: 100
routing-policy:
- from: 203.0.113.10
table: 100
RHEL/CentOS系,/etc/sysconfig/network-scripts/route-eth0里写:
default via 203.0.113.1 dev eth0 table eth0_table
还需要在/etc/sysconfig/network-scripts/ifcfg-eth0里加一行DEFROUTE=no,防止NetworkManager自动在main表里写默认路由,然后把ip rule命令放到/etc/rc.d/rc.local并赋予执行权限。
第五步:验证策略是否生效
用ip rule show查看规则,用ip route show table eth1_table,再test一下:
ping -I 192.168.10.10 192.168.10.1
加上-I参数指定源IP,能通就说明策略路由在起作用。
多网口配置常见故障排查
配置完成后,业务侧连不通是常有的事,按以下顺序排查比瞎猜高效。
抓包看流量走向
在服务器上用tcpdump -i eth1 host 192.168.10.5确认请求是否到达eth1,如果arp能通但TCP握手没反应,八成是回包走了eth0,此时检查ip rule里from规则是否漏配了源地址,以及内核参数rp_filter是否开启并拦截了不对称路由。
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.eth0.rp_filter=0
sysctl -w net.ipv4.conf.eth1.rp_filter=0
检查默认路由优先级
多网口配置中最容易出问题的就是把业务网口和存储网口的默认路由混在一起,行业共识认为,存储网口和备份网口绝不应该配置默认网关,只配内网静态路由即可,如果两条默认路由同时存在于不同路由表,策略规则又覆盖不全,流量就会“迷路”。
防火墙与反向路径过滤
firewalld或ufw开启后,会iptables的rpfilter模块也可能拦包,遇到诡异问题可以临时iptables -t mangle -F清掉规则再测,生产环境别这么干,但排查时可以快速定位。
多网口配置与单网口区别
单网口简单是因为所有流量走同一张main表,默认路由只有一条,不存在选择问题,服务器多网卡路由配置的复杂度在于多一张表,多一套规则,多一层过滤,下面用表格说清楚:
| 对比维度 | 单网口 | 多网口 |
|---|---|---|
| 路由表数量 | 只有main表 | 需自定义2张以上表 |
| 默认路由 | 1条,全局唯一 | 每个网口可各1条,互不干扰 |
| 回包路径 | 天然对称 | 必须手动保证对称 |
| 故障域 | 网口挂了全断 | 可做冗余,但配置不当会脑裂 |
| 排查复杂度 | 低,route -n够用 | 高,需结合ip rule和rt_tables |
多网口服务器怎么配置路由,本质上是在回答一个问题:数据包到达后,内核依据什么决定走哪张路由表,单网口不需要回答,多网口必须句句有回音。
服务器静态路由配置最佳实践
核心思路:按流量类型分表,按业务优先级排队,以下几条经验来自真实项目踩坑总结。
- 管理口(带外网口)和业务口必须物理隔离,管理口路由不参与业务流量,用单独一张表如
,只放管理网段路由,避免管理流量跟业务流量抢带宽。mgmt
- 多网口做bond(链路聚合)时,不需要策略路由,bond接口对上层是单一逻辑网口,但如果bond下的物理网口连不同交换机,要确保swtich侧配置了对应聚合模式。
- 如果服务器要同时访问多个内网网段,写明细路由比写default更安全。
ip route add 10.1.0.0/16 via 192.168.10.1 dev eth1 table eth1_tableip route add 10.2.0.0/16 via 192.168.20.1 dev eth2 table eth2_table这样各网段互不干扰,流量完全隔离。
多网口路由性能调优
开启ip_forward并配合策略路由,可以让多网口服务器兼职软路由,但这要求路由表足够精确,否则容易把核心交换机该做的事揽到自己身上,导致CPU软中断飙升,多数情况下,网卡多队列(RSS)和CPU亲和性比路由表本身对转发性能影响更大,配置irqbalance服务,让每个网卡中断绑定不同CPU核心,转发吞吐能上涨相当一部分。
Q&A:服务器多网口路由配置常见问题
问题1:为什么配置了多网口后,内网和外网同时只能通一个?
因为两个网口的默认路由都写入了main表,后写入的会覆盖先前的,解决方案是用策略路由把两个网口拆到不同路由表,并分别添加ip rule指定来源IP的查询表。
问题2:用NetworkManager管理的系统,如何防止默认路由冲突?
在nmcli connection show里查看连接名,对非主用网口执行nmcli connection modify "连接名" ipv4.never-default yes,这个配置让该网口不参与默认路由竞争,只保留显式添加的静态路由。
问题3:重启后ip rule配置丢失如何处理?
检查是否使用了netplan或NetworkManager的脚本钩子,Netplan直接声明routing-policy能在netplan apply时自动生效,传统ifupdown系统则在接口的up指令里写规则,最稳妥的兜底方案是把所有配置命令写入/etc/rc.local,确保在所有网络服务启动后执行,并在文件头部加#!/bin/bash和exit 0。
多网口静态路由配置不像加IP那样简单粗暴,但掌握策略路由后,网口再多也只是规则的叠加,生产环境变更前先在测试机跑一遍命令,路径通了再上生产,是运维最省钱的动作。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/584328.html




