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,则表示为这一行的网关) |
Genmask | Destination 字段的网络掩码,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
网段,当前网段的 Gateway
为 192.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=0 | Round-robin 轮循策略。第一个包走第一个网卡,第二包走接下来一个,走完后继续轮循。但弊端为发包可能走的是不同链路,那么在客户端如果接收到无序包的情况下,可能要求重发,导致网络的下降。 |
mod=1 | Active-backup 主备策略。多个网卡组成一个网卡,使用同一个MAC地址,当当前网卡宕掉时,马上可以有下一个网卡接替。但在有N个网络接口情况下,只使用了1/N。 |
mod=2 | XOR 平衡策略。使用地址HASH来计算由哪个网卡发送。 |
mod=3 | broadcast 广播策略。在每个网卡上都传输,一般线上不适用。 |
mod=4 | Dynamic link aggregation 动态链接聚合。 |
mod=5 | Adaptive transmit load balancing 适配器传输负载均衡。通过计算发送的流量速率来分配流量。 |
mod=6 | Adaptive load balancing 适配器适应性负载均衡。他对外有多个MAC地址,争取负载均衡的接收数据。但实际生产中使用较少,问题挺多。 |
再生产环境下,使用最多的为两张网卡搭建的 mod=1
主备策略。特别是在大数据环境下,服务器众多,如果由于网卡问题导致数据无法发送,机器报修,那么会失联一整台服务器,不可接受。
bond 设置
我们用 mod=1
主备策略进行演示。
首先查看我们所有网卡,是否有两张以上,可以通过 ipconfig
或者看 /etc/sysconfig/network-scripts/
下,当然最好还是看物理设备:
cat /proc/net/dev
可以看到有 ens33
和 ens36
两块物理网卡。那么我们使用这两张网卡组成 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'
然后将 ens33
与 ens36
添加到 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
当然是再好不过,这样重复刚刚步骤,配置好 bond0
与 bond1
,它们 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 的故事的主要内容,如果未能解决你的问题,请参考以下文章