原标题:Linux下配置多网卡多网关

大家好,今天给大家介绍一下Linux下配置多网卡多网关的方法。@Hi-Linux

场景一 多运营商线路

比较典型的一种场景:一台 Linux 服务器上有三个网口并接入三个不同运营商的网络,以实现不同运营商用户访问其对应的网络线路,来减少网络延时。

服务器及对应网络信息如下:

一台 Ubuntu 16.04 server,这里一共使用三块网卡。假定网络信息如下:

网卡名称

IP

网关

备注

enp0s5

192.168.100.212

192.168.100.1

电信线路

enp0s6

192.168.110.213

192.168.110.1

联通线路

enp0s7

192.168.120.214

192.168.120.1

教育网线路

这里 IP 只是为了区分各运营商线路做的示例,实际情况请以运营商给出的网络信息调整。

下面我们来看如何实现这样的需求:

在 Linux 下一台多网卡服务器不能同时配置两个及以上的默认网关,因为默认网关(Default Gateway)只能配置一个,通过 gateway 参数配置的网关在这里实际为默认路由。

这里通过配置 Linux 下策略路由来实现,通过原线路返回的策略路由可以实现多线多 IP 同时在线。让从同一运营商过来的请求由原运营商线路返回,比如:电信IP过来的请求按照电信路由返回,从网通IP过来的求从网通路由返回。

配置网络

首先配置三块网卡的基本网络信息。$ vim /etc/network/interfacesauto enp0s5iface enp0s5 inet staticaddress 192.168.100.212netmask 255.255.255.0auto enp0s6iface enp0s6 inet staticaddress 192.168.110.213netmask 255.255.255.0auto enp0s7iface enp0s7 inet staticaddress 192.168.120.214netmask 255.255.255.0

重启网络$ /etc/init.d/networking restart

查看配置好的网络情况$ ip a|grep enp0s2: enp0s5: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 192.168.100.212/24 brd 192.168.100.255 scope global enp0s53: enp0s6: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 192.168.110.213/24 brd 192.168.110.255 scope global enp0s64: enp0s7: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000inet 192.168.120.214/24 brd 192.168.120.255 scope global enp0s7

查看各网卡当前路由$ ip route show192.168.100.0/24 dev enp0s5 proto kernel scope link src 192.168.100.212192.168.110.0/24 dev enp0s6 proto kernel scope link src 192.168.110.213192.168.120.0/24 dev enp0s7 proto kernel scope link src 192.168.120.214 增加路由表

Linux 中的路由由路由规则和路由表组成。路由规则指定当数据包满足规则时,应转交到哪个路由表;路由表根据数据包的信息,选择下一跳。

可通过 ip rule 看当前的路由策略,如:

$ ip rule0: from all lookup local32766: from all lookup main32767: from all lookup default

从这里也可以看出在内核中最多支持 32768 条路由规则。这里的 main 表是系统主要的路由表,所有的路由规则都写在这个表中。

查看 main 表$ ip route list table main192.168.100.0/24 dev enp0s5 proto kernel scope link src 192.168.100.212192.168.110.0/24 dev enp0s6 proto kernel scope link src 192.168.110.213192.168.120.0/24 dev enp0s7 proto kernel scope link src 192.168.120.214

Linux 中支持 256 张路由表,编号为 0 到 255,可直接使用编号操作,也可使用编号的别名操作,编号和其别名的对应关系在 /etc/iproute2/rt_tables 文件中。

默认有 local,main,default 三个路由表,这三个路由表的名称命名就来自 /etc/iproute2/rt_tables。

$ cat /etc/iproute2/rt_tables## reserved values#255 local254 main253 default0 unspec## local##1 inr.ruhep

注:数字范围为0-255,但0、255、254、253是保留的,不能使用。

增加三个路由表

在 /etc/iproute2/rt_tables 配置文件里面添加三个不同的路由表别名。增加三个路由表分别是: enp0s5:ChinaTel、enp0s5:ChinaCnc、enp0s5:ChinaEdu。

$ echo "101 ChinaTel" >> /etc/iproute2/rt_tables$ echo "102 ChinaCnc" >> /etc/iproute2/rt_tables$ echo "103 ChinaEdu" >> /etc/iproute2/rt_tables

因为这三个路由表的只是用来响应来自不同接口的,所以只需要每个路由表里面建立默认网关即可。

$ ip route add default via 192.168.100.1 dev enp0s5 table ChinaTel$ ip route add default via 192.168.110.1 dev enp0s6 table ChinaCnc$ ip route add default via 192.168.120.1 dev enp0s7 table ChinaEdu

如果要指定某一源 IP,可以加上 src 参数。

$ ip route add default via 192.168.100.1 dev eth0 src 192.168.100.212 table ChinaTel

查看新增路由表中内容$ ip route show table ChinaTeldefault via 192.168.100.1 dev enp0s5$ ip route show table ChinaCncdefault via 192.168.110.1 dev enp0s6$ ip route show table ChinaEdudefault via 192.168.120.1 dev enp0s7

增加路由原路返回规则,使来自不同的口的走不同的路由表。$ ip rule add from 192.168.100.212 table ChinaTel$ ip rule add from 192.168.110.212 table ChinaCnc$ ip rule add from 192.168.120.212 table ChinaEdu

注意:此处原路是广义上的说法,并不是请求的路径与响应的路径完全相同。

如果要指定规则优先级,可以加上 pref 参数。pref 即路由表内序号,如果不加 pref,则将在已有的规则最小序号前插入。

$ ip rule add from 192.168.100.212/32 table ChinaTel pref 100

查看新增的路由规则$ ip rule0: from all lookup local32763: from 192.168.120.212 lookup ChinaEdu32764: from 192.168.110.212 lookup ChinaCnc32765: from 192.168.100.212 lookup ChinaTel32766: from all lookup main32767: from all lookup default

如果需要修改某一条路由规则,可根据优先级删除指定路由规则后重新增加:

$ ip rule del prio 32767

至此访问三个网段中的任意一个地址都能够连通了。即便是服务器上本身的默认路由都没有设置,也能够让外面的用户正常访问。如果你要在默认路由表增加一个默认路由,可以使用如下命令:

$ ip route add default via 192.168.100.1 dev enp0s5$ ip route show table maindefault via 192.168.100.1 dev enp0s5192.168.100.0/24 dev enp0s5 proto kernel scope link src 192.168.100.212192.168.110.0/24 dev enp0s6 proto kernel scope link src 192.168.110.213192.168.120.0/24 dev enp0s7 proto kernel scope link src 192.168.120.214

main 表是系统主要的路由表,所有的默认路由规则都写在这个表中。命令汇总 # 清空路由表ChinaTel$ ip route flush table ChinaTel# 为路由表 ChinaTel 添加默认路由 192.168.100.1$ ip route add default via 192.168.100.1 dev enp0s5 table ChinaTel# 根据源 IP 决定路由表$ ip rule add from 192.168.100.212 table ChinaTel# 清空路由表ChinaCnc$ ip route flush table ChinaCnc# 为路由表 ChinaCnc 添加默认路由 192.168.110.1$ ip route add default via 192.168.110.1 dev enp0s6 table ChinaCnc# 根据源 IP 决定路由表$ ip rule add from 192.168.110.212 table ChinaCnc# 清空路由表ChinaEdu$ ip route flush table ChinaEdu# 为路由表 ChinaEdu 添加默认路由 192.168.120.1$ ip route add default via 192.168.120.1 dev enp0s7 table ChinaEdu# 根据源 IP 决定路由表$ ip rule add from 192.168.120.212 table ChinaEdu 测试

验证从 192.168.100.212 的包的路由选择$ ip route get 8.8.8.8 from 192.168.100.212# 结果为8.8.8.8 from 192.168.100.212 via 192.168.100.1 dev enp0s5cache

验证从 192.168.110.213 的包的路由选择$ ip route get 8.8.8.8 from 192.168.110.213# 结果为8.8.8.8 from 192.168.110.213 via 192.168.110.1 dev enp0s6cache

验证从 192.168.120.214 的包的路由选择$ ip route get 8.8.8.8 from 192.168.120.214# 结果为8.8.8.8 from 192.168.120.214 via 192.168.120.1 dev enp0s7cache

外部测试$ ping 192.168.100.212$ ping 192.168.110.213$ ping 192.168.120.214

以上几个 IP 均能 Ping 通。

保存路由设置

以上的路由设置会在系统或网络重启后被清理。因此需要将它保存下来,以防止系统或网络重启后失效。

方法一(推荐)

ip route save 可保存表的信息,如果表的项非常多,这个操作起来非常简单;ip rule 没有专门的保存命令,这里通过脚本实现。

先保存指定路由表的信息,这里以 ChinaTel 为例:

$ ip route save table ChinaTel > /root/route-ChinaTel.rules

恢复时可使用

$ ip route flush table ChinaTel && ip route restore table ChinaTel < /root/route-ChinaTel.rules

对规则的保存可使用以下的小脚本

$ vim ip-rule-dump.sh#!/bin/sh# ip-rule-dump.sh# 参数: table 编号或别名,无参数时 dump 除 local 之外的全部规则# 获取 table 别名if [ -n "$1" ]; thenname=$(grep -v '^[[:blank:]]*#' /etc/iproute2/rt_tables |grep "[[:blank:]]*$1[[:blank:]]" | head -n 1 | awk '{print $2}')[ -z "$name" ] && name="$1"fi[ -z "$name" ] && name=".*"# 获取并使用别名过滤规则ip rule show | grep -v "^0:" | grep -oP "from.*[[:blank:]]$name[[:blank:]]$" |sed -e 's/lookup/table/g'

给脚本赋予权限并保存指定的路由规则

$ chmod +x ip-rule-dump.sh$ ./ip-rule-dump.sh ChinaTel > /root/rule-ChinaTel.rules

对规则的恢复可使用以下的小脚本

$ vim ip-rule-restore.sh#!/bin/sh# ip-rule-restore.sh# 参数: dump 文件路径if [ -n "$1" ] && [ -f "$1" ]; thencat $1 | while read line; dosudo ip rule add $linedonefi

给脚本赋予权限并恢复指定的路由规则

$ chmod +x ip-rule-restore.sh$ ip rule del table ChinaTel >/dev/null 2>&1 || :$ ./ip-rule-restore.sh /root/rule-ChinaTel.rules

开机加载

如果需要在网卡准备完成就加载,就需要在 /etc/network/interfaces 的对应网卡上,加上 post-up 的操作了,这里以加载电信路由信息为例:

$ iface enp0s5 inet static...post-up ( ip rule del table ChinaTel >/dev/null 2>&1 || : ) && bash /root/ip-rule-restore.sh /root/rule-ChinaTel.rules && ip route flush table ChinaTel && ip route restore table ChinaTel < /root/route-ChinaTel.rules

方法二

直接把命令加入启动脚本中,以防止网络重启或系统重启后配置失效。

配置 networking 启动脚本文件 在结尾 exit 0 之前增加如下内容:

如果是 ubuntu/debian,网络启动脚本是 /etc/init.d/networking

如果是 RedHat/centos,网络启动脚本是 /etc/rc.d/init.d/network这里以 ubuntu 为例:

$ vi /etc/init.d/networkingip route flush table ChinaTelip route add default via 192.168.100.1 dev enp0s5 table ChinaTelip rule add from 192.168.100.212 table ChinaTelip route flush table ChinaCncip route add default via 192.168.110.1 dev enp0s6 table ChinaCncip rule add from 192.168.110.212 table ChinaCncip route flush table ChinaEduip route add default via 192.168.120.1 dev enp0s7 table ChinaEduip rule add from 192.168.120.212 table ChinaEduexit 0

退出并重启网络测试是否生效

$ /etc/init.d/networking restart 场景二 给指定网段分别设置网关

这种方法使用的是默认路由表,增加到指定网段的路由。

使用 route 指令$ route add -net 192.168.100.0/24 gw 192.168.100.1 dev enp0s5$ route add -net 192.168.110.0/24 gw 192.168.110.1 dev enp0s6$ route add -net 192.168.120.0/24 gw 192.168.120.1 dev enp0s7

参数说明

-net 设置到某个网段的路由

-host 设置到某台主机的路由

gw 出口网关 IP地址

dev 出口网关 物理设备名

使用 ip 指令# 推荐使用 replace 指令$ ip route replace 192.168.100.0/24 via 192.168.100.1 dev enp0s5 onlink$ ip route replace 192.168.110.0/24 via 192.168.110.1 dev enp0s6 onlink$ ip route replace 192.168.120.0/24 via 192.168.120.1 dev enp0s7 onlink# 直接使用 add 指令,会报 RTNETLINK answers: File exists 错。如果要使用 add 指令,可先删除原默认的路由规则后再增加。$ ip route del 192.168.100.0/24$ ip route add 192.168.100.0/24 via 192.168.100.1 dev enp0s5 onlink

注意:一块网卡只能设置一个网关,多个网关会发生冲突而无法成功配置。

如需增加默认路由,可使用以下指令:

使用 route 指令$ route add default gw 192.168.100.1 dev enp0s5

使用 ip 指令$ ip route add default via 192.168.100.1 dev enp0s5

如有多余的配置,可使用下面的命令进行删除路由。

使用 route 指令$ route del -net 192.168.100.0/24 gw 192.168.100.1或者$ route del -net 192.168.100.0/24 dev enp0s5

使用 ip 指令$ ip route del 192.168.100.0/24 参考文档

http://www.google.com

http://www.cnblogs.com/fengyc/p/6533112.html

https://github.com/ttop5/ttop5.github.io/issues/11

http://longwind.blog.51cto.com/419072/806302

http://blog.csdn.net/moreorless/article/details/5397427

http://memoryboxes.github.io/blog/2014/12/30/linuxshuang-wang-qia-shuang-lu-you-she-zhi/

如果你觉得内容很赞,还等什么?快快长按打赏吧,iOS的土豪们也是可以的哟!

责任编辑:

linux两个网段默认网关_Linux下配置多网卡多网关相关推荐

  1. linux两个网段默认网关_关于linux的默认网关

    默认网关是一个用于 TCP/IP 协议的配置项,是一个可直接到达的 IP 路由器的 IP 地址.配置默认网关可以在 IP 路由表中创建一个默认路径. 一台主机可以有多个网关.默认网关的意思是一台主机如 ...

  2. linux怎么看java环境变量_linux下配置jdk环境变量以及查看java版本

    一:查看jdk安装情况 windows: set java_home:查看JDK安装路径 java -version:查看JDK版本 linux: whereis java which java (j ...

  3. Windows和Linux双启动,并用在Windows下配置CoLinux启动

    http://www.cppblog.com/newclear/archive/2009/09/27/97327.html Windows和Linux双启动,并用在Windows下配置CoLinux启 ...

  4. ipmitool 设置网关_Linux下使用命令行配置IPMI

    ipmitool是什么: 百度百科给的解释已经够用了,简单说就是"IPMI(Intelligent Platform Management Interface)即智能平台管理接口是使硬件管理 ...

  5. linux nas解决方案_Linux下配置NAS的一些总结经验

    前言 经历了上一次的Windows Server的痛苦配置以后,我决定换成Linux来配置NAS.相对于Windows平台,Linux平台会更加自由和简洁.而且清晰的权限和后台也要比Win更加干净,唯 ...

  6. linux php mysql安装完整版本_Linux下安装PHP+MySQL+Apache完整版

    首先下载httpd-2.2.9.tar.gz.MySQL-5.0.41.tar.gz.php-5.2.6.tar.gz.autoconf-2.61.tar.gz.freetype-2.3.5.tar. ...

  7. linux php和java环境变量配置_Linux下配置Java环境变量

    一般来说,我们都会把Java安装到 /usr/local 目录 或者 /opt 目录下.这里假设java安装包已解压在了 /opt下,具体目录为:/opt/java8/java1.8.0_45目录(注 ...

  8. linux电子词典项目流程,毕业设计_linux下电子词典的设计与实现.doc

    毕业设计_linux下电子词典的设计与实现 毕业设计(论文) 题目:Linux下电子词典的设计与实现 学 生 姓 名 学 号 201022080223 班 级 通信102202H班 所属院(系) 电子 ...

  9. linux java环境变量不生效_Linux下java环境变量配置问题,解决 重新打开bash后JDK环境变量无效问题...

    Linux下配置JDK实际上是很简单的,我按照网上的教程进行如下配置,在 /etc/profile 文件中最后添加: export JAVA_HOME=/home/son/jdk1.8.0_144 e ...

最新文章

  1. 一个例子说明如何在DataSnap中使用FireDAC
  2. Linux脚本点空格,linux – 在bash脚本中使用引号和空格的awk
  3. 如何发布php网站_php网站如何发布【货币问答】- 联合货币
  4. 嵌入式linux, CAN 驱动有关问题
  5. CNN训练模型 花卉
  6. Kubernetes持久化存储Cephfs
  7. L1-026 I Love GPLT
  8. numpy——numpy.corrcoef
  9. [2018.07.26 T1] 航线规划
  10. Turbo码 - 接近完美的编码
  11. Adobe Zii Patcher 4.2.1 Adobe 2019 Mac 版通用一键自动化完美补丁(TNT)出品
  12. 关于快递鸟的顺丰电子面单打印
  13. winform打开PDF,显示在窗口
  14. C++学习笔记——C++中四个点代表什么意思?
  15. Mysql 5.1 第12章:函数
  16. C# Math函数汇总
  17. 【云隐】windows下编译及使用libevent
  18. 谷歌浏览器无法下载东西未响应的问题
  19. b站黑马Vue2后台管理项目笔记——(3)用户列表
  20. WHM(Web Hosting Manager)/CPANEL 设置及linux 文件权限 经验

热门文章

  1. 成功解决Ignoring invalid distribution -yqt5
  2. 成功解决sub_div.insert(points)cv2.error: OpenCV(3.4.1) C:\projects\opencv-python\opencv\modules\imgproc
  3. 成功解决AttributeError: module ‘tensorflow‘ has no attribute ‘contrib‘
  4. 1.1 Tensorflow笔记(基础篇): 图与会话,变量
  5. BeautifulSoup 一行代码获取今日日期,与smtplib结合
  6. OpenGL ES 如何能看到一个物体内部和象3dmax中能只显示网格线
  7. android monkey压力测试(二)
  8. 程序员,选择和努力哪个重要?
  9. 基于 HTML5 Canvas 的交互式地铁线路图
  10. 【转载】OI生涯结束……在逸夫楼那些的日子里