Linux 单路由双网关双外网双网卡的配置
另请参阅:当 RHEL 配置了多个 IP 时,只能从远程网络访问一个。或者当出站流量的路由与传入流量的路由不同时,为什么 RHEL 会忽略数据包?
目前我们使用的是 dell 服务器,网卡的名字叫做 em1 em2 em3 em4,不同于普通的系统叫做 eth0 什么的的。
我这里子网掩码都是 24 (255.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.添加策略路由表
似乎是没有命令能添加路由表的,只能手动添加,不是很懂这个设计(iproute2 的命令不是持久化,可能是这个原因)。
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,让它每次开机都执行,因为 iproute2 的命令不会持久化,每次重启后会丢失。
ip route 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 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
ipiproute工具,一个网络管理工具包合集;router路由管理;rule路由策略;ip route 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 这个路由表中数据包默认使用源 IP10.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。
警告:不要运行 ip rule flush 否则所有网络连接都会端开,直到你重启设备。
无评论