跳转到主要内容

Linux 单路由双网关双外网双网卡的配置

另请参阅:当 RHEL 配置了多个 IP 时,只能从远程网络访问一个。或者当出站流量的路由与传入流量的路由不同时,为什么 RHEL 会忽略数据包?

目前我们使用的是 dell 服务器,网卡的名字叫做 em1 em2 em3 em4,不同于普通的系统叫做 eth0 什么的的。

我这里子网掩码都是 24255.255.255.0)根据您的环境进行调整。

我的系统为 Centos 7.6。


假定
  • 网卡 1 的内网 IP 地址是 10.1.1.241,网关 1 的内网 IP 地址是 10.1.1.2
  • 网卡 2 的内网 IP 地址是 10.1.2.241 ,网关2 的内网 IP 地址是 10.1.2.2


1.增加网关地址 
route add -net 10.1.1.0 netmask 255.255.255.0 gw 10.1.1.2
route add -net 10.1.2.0 netmask 255.255.255.0 gw 10.1.2.2
  • route add 添加静态路由;
  • route add -net 10.1.1.0 netmask 255.255.255.0 gw 10.1.1.2  
    把所有 10.1.1.0 网段的数据包的网关指定为 10.1.1.2 子网掩码设置为 255.255.255.0


根据你的实际情况填写
如果你的路由支持绑定,好像不添加也行?

因为我发现我们系统的路由表是:(使用route -n查看路由表)

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface                                               
0.0.0.0         10.1.1.2        0.0.0.0         UG    100    0        0 em1                                                 
0.0.0.0         10.1.2.2        0.0.0.0         UG    101    0        0 em2                                                 
10.1.1.0        0.0.0.0         255.255.255.0   U     100    0        0 em1                                                 
10.1.2.0        0.0.0.0         255.255.255.0   U     101    0        0 em2 

我有设置过吗?
实测在路由器配置过后不用进行此步骤。

增加网关地址后:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.1.1.2        0.0.0.0         UG    100    0        0 em1
0.0.0.0         10.1.2.2        0.0.0.0         UG    101    0        0 em2
10.1.1.0        10.1.1.2        255.255.255.0   UG    0      0        0 em1
10.1.1.0        0.0.0.0         255.255.255.0   U     100    0        0 em1
10.1.2.0        10.1.2.2        255.255.255.0   UG    0      0        0 em2
10.1.2.0        0.0.0.0         255.255.255.0   U     101    0        0 em2

#Destination 目标网络或目标主机。Destination 默认是0.0.0.0,表示这个是默认网关,所有地址的数据都发到这个网关。
#Gateway 网关地址。0.0.0.0 表示当前记录对应的 Destination 跟本机在同一个网段,通信时不需要经过网关。
#Genmask Destination的网络掩码,也就是你常听到的子网掩码。Destination 是主机时需要设置为 255.255.255.255,是默认路由时会设置为 0.0.0.0
#Flags 标记,含义见下表
#Metric 路由距离,到达指定网络所需的中转数,是大型局域网和广域网设置所必需的。Linux 内核路由表此项无效
#Use 此路由项被路由软件查找的次数,没啥用?
#Iface 网卡名字,em 是 dell 服务器专用的名字,其他的一般是 eth0 之类的

 Flags 标记含义表
U 路由是活动/激活的
H 目标是个主机
G 需要经过网关
R 恢复动态路由产生的表项
D 由路由的后台程序动态安装
M 由路由的后台程序修改
! 拒绝路由

2.添加策略路由表

似乎是没有命令能添加路由表的,只能手动添加,不是很懂这个设计。

vim /etc/iproute2/rt_tables

#修改/etc/iproute2/rt_table,添加策略路由表

根据里面的顺序添加2行(添加2个路由表)

默认:

255     local
254     main
253     default
0       unspec

添加后:

255     local
254     main
253     default
252     net_nem2
251     net_nem1
0       unspec
  • 前面的数字 其实是优先级来着,一般都当做序号用了。数值越小优先级别越高。
  • net_nem1 net_nem2 是策略名字,可以自己选择
  • 255 local 本地路由表(Local table) 本地接口地址,广播地址,以及NAT地址都放在这个表。该路由表由系统自动维护,管理员不能直接修改。
  • 254 main 主路由表(Main table) 如果没有指明路由所属的表,所有的路由都默认都放在这个表里,一般来说,旧的路由工具(如 route)所添加的路由都会加到这个表。一般是普通的路由。
  • 253 default 默认路由表 (Default table) 一般来说默认的路由都放在这张表,但是如果特别指明放的也可以是所有的网关路由。
  • 0 unspec 保留路由表,一般没用。


3.添加原路返回策略路由

让指定网关发来的数据回到指定的网关。

vim /etc/rc.local

#修改/etc/rc.local,让它每次开机都执行

ip route flush table net_nem1
ip rule flush table net_nem1
ip route add default via 10.1.1.2 dev em1 src 10.1.1.241 table net_nem1
ip rule add from 10.1.1.241 table net_nem1

ip route flush table net_nem2
ip rule flush table net_nem2
ip route add default via 10.1.2.2 dev em2 src 10.1.2.241 table net_nem2
ip rule add from 10.1.2.241 table net_nem2
  • ip    iproute工具,一个网络管理工具包合集;
  • router    路由管理;
  • rule    路由策略;
  • ip route flush table net_nem1   刷新/清空路由表 net_nem1 的路由;
  • ip rule flush table net_nem1     刷新/清空路由表 net_nem1 的规则;
  • ip route add default via 10.1.1.2 dev em1 src 10.1.1.241 table net_nem1      
    添加一条路由规则到 net_nem1 路由表,et_nem1 这个路由表中数据包默认使用源 IP 10.1.1.241 通过网口设备 em1 走网关 10.1.1.2
  • ip rule add from 10.1.1.241 table net_nem1     把来自 10.1.1.241 的数据包都交给路由表 net_nem1 处理;

这里面的内容要根据你实际内容填写,比如 IP 地址和策略路由表名称啥的。
然后运行一遍这些命令,不要断开 ssh,以防不测。

systemctl restart network
  • systemctl restart network 重启网络接口;


然后 ping 服务器并马上再开几个 ssh 连接上去试试,服务器有几个 IP 都试试,如果能上说明网络没有问题。
不能上说明你哪里搞错了,赶快用还连着的 ssh 补救。

最后,你可以使用 ip route get <IP地址> 来查看该地址会从哪个接口出去,比如 ip route get 192.1.1.10