如何为多网卡Linux服务器配置策略路由

问题描述


当一台云服务器ECS实例(Linux系统)有多张网卡,并且每张网卡都绑定了弹性公网IP时,只有主网卡绑定的弹性公网IP可以正常访问,辅助网卡的弹性公网IP无法访问。

说明
此现象在配置有多网卡的物理服务器上同样存在

解决方法


说明
通过配置策略路由让访问主网卡的流量从主网卡发出,访问辅助网卡的流量从辅助网卡发出。

  1. 编辑/etc/iproute2/rt_tables,添加一个路由表(例如nic_eth1),保存退出
1
2
3
4
5
6
255     local
254 main
253 default
0 unspec
# table_number table_name
252 nic_eth1

说明
Linux系统中,可以自定义从1-252个路由表。其中,Linux系统维护了4个路由表:
0 unspec:系统保留表;
253 defulte table:没特别指定的默认路由都放在该表;
254 main table:没指明路由表的所有路由放在该表;
255 local table:保存本地接口地址、广播地址、NAT地址,由系统维护,用户不得更改;

  1. 执行以下命令,在nic_eth1表中添加默认路由
1
2
ip route add default via <辅助网卡网关> dev <辅助网卡名称> table <路由表名>
# 示例:ip route add default via 172.16.17.1 dev eth1 table nic_eth1
  1. 执行以下命令,添加策略路由
1
2
ip rule add from <辅助网卡IP地址> lookup <路由表名> prio <1~32765,优先级高于main表>
# 示例:ip rule add from 172.16.17.84 lookup nic_eth1 prio 32765

至此,云服务器所有的弹性公网IP就都可以访问了。如果要持久化这个规则,可以将上述命令添加到开机脚本/etc/rc.d/rc.local

1
2
3
4
5
cat >> /etc/rc.d/rc.local << EOF
ip route add default via 172.16.17.1 dev eth1 table nic_eth1
ip rule add from 172.16.17.84 lookup nic_eth1 prio 32765
EOF
chmod +x /etc/rc.d/rc.local

参考文档