Linux 计算机网络 route 路由表多网段与 bond 的故事

Posted 青冬

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 计算机网络 route 路由表多网段与 bond 的故事相关的知识,希望对你有一定的参考价值。

Linux 计算机网络 route 路由表、多网段与 bond 的故事

在之前的章节中,介绍了计算机网络的发展以及各种解析,在之中我们提到了每个主机设备都会维护一张自己的路由表,通过路由表来确定在不同网络之间,怎么将数据规划传输到各自的目的路线中。所以如果主机不含路由表,那么所有数据都无法发送出去。

路由表

当设备处于一个网络或多个网络的时候,通过网关获取 ip 后,开始建立的表格。通过路由表,当前设备才知道如何将数据发送出去。路由表包含网络周边的拓扑信息,是为了实现路由协议和静态路由的选择。

所以路由工作在 TCP/IP 模型的底层网络层,可以通过转发分组来实现两个或多个子网相连。

桥接和路由的区别是:

  • 桥接在链路层,路由是网络层。

  • 桥接是通过 MAC 进行识别,路由是通过 ip 进行识别。

  • 可以查看: Linux 计算机网络 从零到一 中桥接部分。

比如当我们需要将数据发送到 123.123.123.123 这个 ip 的时候,我们首先要判断当前是否能与这个 ip 直接访问。如果不能需要使用哪一个网卡,将数据转发到哪一个 Gateway。所以路由表,决定了我们该数据下一跳 Next Hop 的目的地。

是否能够直接访问就会使用目标地址 Desctination 与子网掩码 Genmask 计算得出。

route

查看路由

Linuex 中可以使用 route 来查看当前服务器的路由表:

route -n # 命令等价于 netstat -rn

Centos7 下,每一条信息都包含:

options描述
Destination需要发送到的目标网络或目标主机。Destination 为 default(0.0.0.0)时,表示这个是默认值,无匹配时走这里
Gateway网关地址,0.0.0.0 表示当前记录对应的 Destination 跟本机在同一个网段,通信时不需要经过网关;如果为其他值(如192.168.111.2,则表示为这一行的网关)
GenmaskDestination 字段的网络掩码,Destination 是主机时需要设置为 255.255.255.255,是默认路由时会设置为 0.0.0.0
Flags标记,含义参考表格后面的解释
Metric路由距离,到达指定网络所需的中转数,是大型局域网和广域网设置所必需的。(不在Linux内核中使用。)
Ref路由项引用次数。 (不在Linux内核中使用。)
Use此路由项被路由软件查找的次数
Iface此路由使用的网卡名称(device)

其中 Flags 涉及到对应映射表达:

标志释义
U路由是活动的
H目标是一个主机
G路由指向网关
R回复动态路由产生的表项
D由路由的后台程序动态生成
M有路由的后台程序修改
!拒绝路由

路由操作

通过 route 命名进行增加或删除:

比如我们现在新接入了一个网段 192.168.1.0/24 网段,当前网段的 Gateway192.168.1.1。那么我们可以这样添加一个路由,使 192.168.1.0 相关的数据包通过 ens33 网卡发送到对应网关去。

该方法是临时生效,并非永久生效,在重启网卡或服务器后会失效。

# 新增一个路由
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1 dev ens33
# 删除刚刚添加的路由
route del -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1 dev ens33

通过配置文件永久增加路由:

/etc/rc.local 也就是 /etc/rc.d/rc.local 文件。前者是后者的软连接。

该文件是一个开机自启的文件,但默认没有运行权限:

ls -ltr /etc/rc.d

所以我们只需要将权限赋予为可执行,并且加入我们希望的路由添加命令即可:

chmod 755 /etc/rc.d/rc.local
vim /etc/rc.d/rc.local
# 在底部新增一行,并添加如下命令
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.1.1 dev ens33

多路由配置

上面讲的都是很基础的单网段的配置说明,现在我们有一个服务器想在多个网段上都能访问,那应该怎么做?以下是给出的建议解决方案:

  • 查看网卡个数,并设置网卡相关参数。
  • 如果有条件,线上请配置 bond
  • 如果 bond 吃紧,配置虚拟 bond
  • 在配置完 bond 后,进行路由设置。
  • 重启网络服务,并检查是否路由正确。

bond 模式

如果是大数据环境,对于网卡来说我们也会采用 bond 模式。网卡 bond 类似于我们磁盘 raid 一样,是为了整合多个硬件,打造符合当前业务场景的最佳模式。

bond 一共有 6 种模式:

mod释义
mod=0Round-robin 轮循策略。第一个包走第一个网卡,第二包走接下来一个,走完后继续轮循。但弊端为发包可能走的是不同链路,那么在客户端如果接收到无序包的情况下,可能要求重发,导致网络的下降。
mod=1Active-backup 主备策略。多个网卡组成一个网卡,使用同一个MAC地址,当当前网卡宕掉时,马上可以有下一个网卡接替。但在有N个网络接口情况下,只使用了1/N。
mod=2XOR 平衡策略。使用地址HASH来计算由哪个网卡发送。
mod=3broadcast 广播策略。在每个网卡上都传输,一般线上不适用。
mod=4Dynamic link aggregation 动态链接聚合。
mod=5Adaptive transmit load balancing 适配器传输负载均衡。通过计算发送的流量速率来分配流量。
mod=6Adaptive load balancing 适配器适应性负载均衡。他对外有多个MAC地址,争取负载均衡的接收数据。但实际生产中使用较少,问题挺多。

再生产环境下,使用最多的为两张网卡搭建的 mod=1 主备策略。特别是在大数据环境下,服务器众多,如果由于网卡问题导致数据无法发送,机器报修,那么会失联一整台服务器,不可接受。

bond 设置

我们用 mod=1 主备策略进行演示。

首先查看我们所有网卡,是否有两张以上,可以通过 ipconfig 或者看 /etc/sysconfig/network-scripts/ 下,当然最好还是看物理设备:

cat /proc/net/dev

可以看到有 ens33ens36 两块物理网卡。那么我们使用这两张网卡组成 bond

创建一个 bond 名为 bond0

vim /etc/sysconfig/network-scripts/ifcfg-bond0
# 添加信息:
# 其中 IPADDR 和  GATEWAY 请根据实际进行配置
DEVICE=bond0
BOOTPROTO=static
IPADDR=192.168.111.218
GATEWAY=192.168.111.2
ONBOOT=yes
TYPE=Bonding
NM_CONTROLLED=no
USERCTL=no
BONDING_OPTS='mode=1 miimon=100'

然后将 ens33ens36 添加到 bond0 中:

vim /etc/sysconfig/network-scripts/ifcfg-ens36
# 其中 DEVICE 请根据物理网卡名指定,以免混乱
DEVICE=ens36
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes
vim /etc/sysconfig/network-scripts/ifcfg-ens33
# 其中 DEVICE 请根据物理网卡名指定,以免混乱
DEVICE=ens33
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
NM_CONTROLLED=no
MASTER=bond0
SLAVE=yes

在配置完毕后,重启网络服务并查看是否生效:

systemctl restart network
ifconfig -a

可以看到 bond0 正确生效,并且使用的 MAC 地址为 ens36 的,通过该 bond0 可以对外传输和接收数据:

ping -I bond0 www.baidu.com

多网段配置

配置到这里,其实还并没有配置到多网段信息,由于演示是在虚拟机上,无法真实还原生产中的配置,这里简单进行一下讲解。

同样,优先考虑我们当前的物理网卡是否充足,如果还能继续配置一个 bond1 当然是再好不过,这样重复刚刚步骤,配置好 bond0bond1,它们 ip、网段、Gateway 各不相同,在设置 route 的时候只需要指定到对应 dev=bond 即可。

那么当我们物理网卡不充足的情况下怎么办呢?使用 vlan,配置一个 bond0:1 也是可以的。最简单的为配置如下:

vim /etc/sysconfig/network-scripts/ifcfg-bond0:1
# 注意 DEVICE 可以为 bond0 或 bond0:1,为 bond0 简化操作,但为了区分应使用 bond0:1
# 此条在演示中使用的为 bond0,请再次注意
# 其中 IPADDR 和  GATEWAY 请根据实际进行配置
DEVICE=bond0
BOOTPROTO=static
IPADDR=192.1.222.218
GATEWAY=192.1.222.2
ONBOOT=yes
TYPE=Bonding
NM_CONTROLLED=no
USERCTL=no
BONDING_OPTS='mode=1 miimon=100'

再次重启网络服务 systemctl restart network 后查看网路网络情况:

systemctl restart network
ip addr show # 使用其他命令不一定能查看得到

可以看到这里 inet 对应有两条,分别是两个网段的 ip 地址信息和 Gateway 信息,当然,如果在配置时使用的是 bond0:1,那么会有单独的 bond0:1 出现。如果 device 都叫 bond0,那么 route 可以直接都指向 bond0,反之亦然。

对于非 bond 模式的网卡来说,也可以这样玩,来解决物理网卡不足的情况

总结

一个 物理网卡 可以虚拟为多个 虚拟网卡,这样可以对应多个 ip 地址,但每个 ifcfg-* 文件对应一个 ip,一个 ip 地址都只能在一个 子网络 中运行。每个 ip 地址也可以有多个 Gateway,只要是同网段,可以访问的即可。

至此关于 Linux 网络部分,可能不再赘述,适用于大数据的部分也到这里,如果涉及到其他,以后再讨论。

以上是关于Linux 计算机网络 route 路由表多网段与 bond 的故事的主要内容,如果未能解决你的问题,请参考以下文章

添加设置路由route

Linux_ 网络配置及操作

linux添加静态路由

linux 网络

linux网络基础知识

linux route命令详解