Linux 计算机网络 route 路由表、多网段与 bond 的故事
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
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 为 default0.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
网络部分可能不再赘述适用于大数据的部分也到这里如果涉及到其他以后再讨论。