Linux19--网络管理之:网卡名字、ifconfig与ethtool命令、网卡丢包、路由route

1 网卡名称

# 1 传统命名
CentOS6之前采用的都是传统的命名方式,如以太网:eth1,eth0...

# 2 可预知的命名方案
Centos7提供了不同的命名规则,默认是基于固件 拓扑 位置信息来分配。
优点是命名是全自动的 可预知的
缺点是比eth0更难读。eg: ens33


# 3 修改网卡名称: 回归传统命名
# 1.修改 网卡配置文件 名称
cd /etc/sysconfig/network-scripts/

mv ifcfg-ens33 ifcfg-eth0

# 2.修改 网卡配置文件 设备名称
sed -i "s#ens33#eth0#g" ifcfg-eth0

# 3.GRUB添加kernel参数     ***
vim /etc/sysconfig/grub

GRUB_CMDLINE_LINUX="rhgb quiet 'net.ifnames=0 biosdevname=0'"

# 4.加载到引导分区          ***
grub2-mkconfig -o /boot/grub2/grub.cfg

# 5.重启系统生效
reboot

2 网卡管理

# 0 运维拓展:linux真机需要网卡绑定 ---> lacp协议  
Link Aggregation Control Protocol,链路聚合控制协议


# 1 查看当前系统所连接的所有网卡   在Windows上就是网络适配器中的网卡
lspci 

lspci |grep -i eth   # 查看以太网网卡


# 2 ethtool 查看网卡的网络接口信息   可以判断网卡是否连上网线
ethtool eth0

  Settings for eth0:
      Link detected: yes
      # 链接检测  yes 表示网卡能被识别,且接了有效的网线

2.1 ifconfig命令

# 0 需要安装 net-tools
yum install net-tools -y


# 1 查看所有网卡信息    包括未激活的网卡
ifconfig -a 

ifconfig    # 查看激活的网卡


# 2 查看单个网卡信息
ifconfig eth0


# 3 临时设定IP和掩码    重启服务或者系统都失效
ifconfig eth0 192.168.1.122 netmask 255.255.255.0

ifconfig eth0 192.168.1.122/24 


# 4 临时配置子接口  也叫虚拟网卡,指的是将eth0网卡 再配置一个网段 
    # 了解 通常不用 因为一个网卡两个网段,若网卡坏了,两个网段都走不通了
ifconfig eth0:1 192.168.0.2 netmask 255.255.255.0


# 5 删除网卡
ifconfig eth0:1 del 192.168.0.2  # 删除,不必加掩码


# 6 开启或关闭网卡
ifconfig eth0 down|up    # 不加载网卡配置文件

ifdown eth0 | ifup eth0  # 加载网卡配置文件


# 7 临时设置网卡的最大传输单元    mtu 代表网卡的最大传输单元,千兆/万兆网卡  可修改
ifconfig eth0 mtu 1500    # mtu常用设置:千兆网卡 1500   万兆网卡 9000
   # 永久设置:
     1.可将该命令,放在开机自启动脚本文件中  /etc/rc.local
       注:添加可执行权限 chmod +x /etc/rc.d/rc.local 

     2.修改网卡配置文件
     # vim /etc/sysconfig/network-scripts/ifcfg-eth0
     # 增加如下内容
     MTU="9000"
     # 启用IPv6地址的,修改IPv6 mtu的参数为
     IPV6_MTU="1280"

     # 保存后,重启网卡生效
     systemctl restart network


# 8 开启关闭模式  (了解)
ifconfig eth0 promisc      # 开启繁杂模式   局域网中的数据包,不管目的主机是否为自身,都会收到显示出来
ifconfig eth0 -promisc     # 关闭繁杂模式

ifconfig ens33 multicast   # 开启多播
ifconfig ens33 -multicast  # 关闭多播

ifconfig eth0 allmulti     # 开启
ifconfig eth0 -allmulti    # 关闭

# 9 添加或删除ipv6地址  (了解)
ifconfig eth0 add 3ffe:3240:800:1005::2/64

ifconfig eth0 del 3ffe:3240:800:1005::2/64
# ifconfig命令 查询结果解释
ifconfig eth0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
      # 从flags可知该接口已启用,支持广播、组播    MTU:1500(最大传输单元):1500字节
      # 其他了解知识:
        UP        :表示“接口已启用”。
        BROADCAST :表示“主机支持广播”
        RUNNING   :表示“接口在工作中”
        MULTICAST :表示“主机支持多播(组播)”
        # 可以了解一下繁杂模式:https://www.cnblogs.com/linhaifeng/articles/13949611.html
    
        inet 192.168.12.42  netmask 255.255.255.0  broadcast 192.168.12.255
        # IPv4地址           子网掩码                广播地址
        
        inet6 fe80::499e:c2c1:f5ed:3900  prefixlen 64  scopeid 0x20<link>
        # IPv6地址                        掩码长度       作用域  link表示仅该接口有效
        
        ether 00:0c:29:86:f8:59  txqueuelen 1000  (Ethernet)
        # 网卡接口的MAC地址         传输队列长度       接口类型为Ethernet
        
        RX packets 5708  bytes 1061424 (1.0 MiB)
        # 表示开机后此接口累积 接收的报文个数,总字节数
        
        RX errors 0  dropped 833  overruns 0  frame 0
        # 表示开机后此接口累积 接收报文错误数、丢弃数、溢出数(由于速度过快而丢失的数据包数)、冲突的帧数
           重点是overruns 溢出数  指的是网卡数据包的丢包现象,是数据接受不全 !!!
        
        TX packets 102  bytes 16768 (16.3 KiB)
        # 表示开机后此接口累积 发送的报文个数,总字节数
        
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        # 表示开机后此接口累积 发送报文错误数、丢弃数、溢出数(由于速度过快而丢失的数据包数)
        # carrier 载荷数(发生carrier错误而丢失的数据包数)
        # collisions 冲突数

2.2 网卡丢包问题

### 1 网卡的储备知识

# 1 全双工与半双工       目前交换机、网卡都采用全双工模式
# 全双工传输英文写法是:Full-Duplex Transmissions
是指交换机在发送数据,同时也能够接收数据,两者同步进行
类似打电话一样,说话的同时,也能够听到对方的声音

全双工的好处: 迟延小、冲突少、速度快

# 半双工:就是指一个时间段内,只有一个动作发生 只接受数据或发送数据
早期的对讲机、以及早期集线器等设备都是实行半双工的产品。
  # 详细全双工与半双工:https://www.cnblogs.com/linhaifeng/articles/13949762.html
    
    
# 2 自动协商
自动协商是一种机制,允许网卡设备 自动选择最佳网速和工作模式(全双工或半双工模式)
    
    
# 3 CRC (Cyclic Redundancy Check)  循环冗余检查 校验码
是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定
是一种数据传输检错功能,对数据进行多项式计算
并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性
  # 详细:https://www.cnblogs.com/linhaifeng/articles/13949806.html
    
    
    
# 4 网卡工作原理
# 网卡发包
    1.ip数据包+14个字节的mac头,变成数据帧frame
    2.frame拷贝到网卡芯片内部的缓冲区,由网卡处理
    3.网卡芯片为frame添加头部同步信息和CRC校验   # 此时才是真正可以发送的packet
    4.然后发送该packet
    
# 网卡收包
    1.网络包packet到达网卡,网卡先检查包packet的CRC校验(保证其完整性和正确性),然后去掉它的头得到frame
    2.网卡将frame拷贝到网卡内部的FIFO缓冲区  # FIFO 先进先出
    3.网卡驱动程序产生硬件中断,把frame从网卡拷贝到内存中
    4.接下来就交给cpu内核处理
    
# 网卡丢包 !!!
    内核通常需要快速地拷贝网络数据包到系统内存!!!
    
    因为网卡上接收网络数据包的缓存区大小固定,而且相比系统内存也要小得多
    所以上述拷贝动作一旦被延迟,必然造成网卡FIFO缓存溢出
    已进入的数据包占满了网卡的缓存,后续的包只能被丢弃   # ifconfig中 RX overrun的来源
    # 详细: https://www.cnblogs.com/linhaifeng/articles/13949943.html
   
    
    
### 2 丢包问题的解决

# 查看网卡是否发生丢包    若网卡的overruns溢出数一直增大,说明发生丢包
for i in `seq 1 100`; do ifconfig eth0 | grep RX | grep overruns; sleep 1; done


# 0 丢包排查思路
网卡工作在数据链路层,数据链路层会做一些校验,封装成帧
  1.先查看CRC校验是否出错,确定传输物理层面是否存在问题
  2.再从软件层面,是否因为网卡缓冲区太小而导致丢包


# 1 先查看硬件情况
若一台机器经常收到丢包的报警(),先看看最底层的有没有问题

# 1.1 查看网卡工作模式是否正常     
ethtool eth0 | egrep 'Speed|Duplex'
    Speed: 1000Mb/s  # 网卡传输速度
    Duplex: Full     # 双全工模式
    
# 1.2 查看CRC校验是否正常     ethtool -S  查看网络使用情况统计
ethtool -S eth0 | grep crc  # crc错误值大,通常是因为服务器外部的网络环境有问题导致的
    rx_crc_errors: 0
    
----Speed、Duplex、CRC之类的都没问题,基本可以排除物理层面的干扰---- 


# 2 软件层面--调整网卡缓存大小、集群化水平拓展部署

# 2.1 先查看网卡的环形参数 Ring parameters
ethtool -g eth0
  Ring parameters for eth0:
  Pre-set maximums:  # 网卡Buffer size的最大值
  RX:     4096
  RX Mini:    0
  RX Jumbo:   0
  TX:     4096
  Current hardware settings:  # 网卡当前 Buffer size的大小
  RX:     256
  RX Mini:    0
  RX Jumbo:   0
  TX:     256
  
# 2.2 再调整网卡的接受/发送 环形参数
ethtool -G ens33 rx 2048  # 接受调大
ethtool -G ens33 tx 2048  # 发送调大

2.3 ethtool命令

# 1 ethtool命令
用于查看和修改网络设备(尤其是有线以太网设备)的驱动参数和硬件设置


# 2 常见选项
ethtool eth0     # 查看网卡信息

ethtool -S eth0  # 查看网卡 网络使用情况统计信息

ethtool -s eth0 选项参数  # 更改网卡的通用设置
  # 选项参数
  speed   1000         # 设置网卡的传输速度   默认是以最大传输  单位是Mb/s
  duplex  half | full  # 工作模式: 半全工或双全工
  autoneg on | off     # 自动协商: 开启或关闭
  
  # eg:
  ethtool –s eth0 speed 1000 duplex full autoneg off


ethtool -g eth0  # 查看网卡 接受/发送的环形参数
ethtool -G eth0 [rx|tx] 参数值  # 设置网卡 接受/发送的环形参数


# 3 永久设置
方式一: 命令添加到 开机自启动脚本/etc/rc.local

方式二: 修改网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-eth0

  ETHTOOL_OPTS="speed 1000 duplex full autoneg off"

3 路由route

3.1 交换与路由介绍

### 1 交换    不考虑三层交换
指同网络访问          # 指的是二层交换机  处于第二层 数据链路层 
两台机器连在同一个交换机上,配置同网段的不同ip就可以直接通迅  


### 2 路由
指跨网络访问的路径选择  # 指的是路由器  处于第三层  网络层

          路由器    # 路由器至少有两个网段,一个是局域网内的网关,另一个是外网的地址
  LAN交换机       LAN交换机 
设备1   设备2    设备1    设备2

3.2 Linux处理数据包的过程

### 0 处理数据包的过程
当外界主机发送数据时,在它从网卡流入后到本机内核空间,本机会对它做路由决策
根据其目标决定是流入本机的用户空间,还是在内核空间就直接转发给其他主机

# 1.若是流入本机用户空间的数据
则数据会从内核空间进入用户空间,被应用程序接收并处理
若本机用户空间的应用程序,不产生新的数据包对外发送,那不再涉及到从某个网卡流出数据

若本机应用程序产生新的数据包对外发送,会在流出之前
进入内核空间做路由决策,根据目标决定从哪个网卡流出


# 2.若是由本机把数据包转发给其他主机
数据包则必须从流入网卡,完整地转发给流出网卡,要求Linux主机能够完成这样的转发
但Linux主机默认未开启ip_forward功能,会使得数据包无法转发而被丢弃


### 1 Linux主机和路由器的不同
路由器本身就是为了转发数据包,所以路由器内部默认就能在不同网卡间转发数据包
而Linux主机默认,则不能转发。若要,则需开启linux主机的转发功能

3.3 linux开启路由转发功能

### 0 查看路由转发是否开启
sysctl net.ipv4.ip_forward

cat /proc/sys/net/ipv4/ip_forward

sysctl -a | grep ip_forward


### 1 临时开启路由转发      重启网络服务则失效
# 方式1:
echo 1 > /proc/sys/net/ipv4/ip_forward

# 方式2:
sysctl -w net.ipv4.ip_forward=1


### 2 永久开启路由转发
# 在CentOS 6中:
将/etc/sysctl.conf文件中的"net.ipv4.ip_forward"值改为1即可

# 在CentOS 7中:
systemd管理了太多的功能,sysctl的配置文件也分化为多个,包括
/etc/sysctl.conf、/etc/sysctl.d/*.conf、/usr/lib/sysctl.d/*.conf
建议写在/etc/sysctl.d/*.conf中,这是systemd提供自定义内核修改项的目录

echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf



### 3 一台Linux主机能被当成路由器使用的前提
    主机1(网段1) <---> 转发主机 <---> 主机2(网段2) 
1.转发主机 至少有两块网卡 分别连接不同网段的主机
2.转发主机 开启路由转发功能
3.转发主机 添加上正确的路由规则/策略
4.转发主机 被主机1/2 写成网关路由   # 主机1/2的这条路由的gateway必须是转发主机ip


### 4 注意
1.若Linux主机有多块网卡,如果不开启数据包转发功能,则这些网卡之间是无法互通的
 eg: 主机1       --->       eth0 -- 主机2 -- etht1       --->     主机3
 172.16.10.11/24   172.16.10.12/24   192.168.100.12/24   192.168.100.11/24
 主机1到达该Linux主机2的数据包,无法从eth0交给eth1或者从eth1交给eth0,从而无法转发到主机3


2.IP地址是属于系统内核的   # 整个tcp/ip协议栈都属于内核,包括端口号
  只要能和其中一个网卡地址通信,就能和另一个网卡地址通信,而不需要开启数据包转发功能
  eg: 主机1       --->       eth0 -- 主机2 -- etht1
  172.16.10.11/24   172.16.10.12/24   192.168.100.12/24
  
  若主机1执行ping 192.168.100.12,结果将是通的
  因为地址属于内核,从主机1的ens33进来的数据包,被内核分析时
  主机2发现目标地址为本机地址,直接就回应172.16.10.11,回应数据包继续从eth0出去

3.4 网关/路由

3.4.1 路由种类与优先级

### 1 路由的种类
主机路由:掩码位32位,Destination精确到某一台主机(指向单个IP地址或主机名)  # Destination  n. 目的地
所以主机路由是直接指明到某台具体的主机怎么走,也就是所谓的静态路由

网络路由:掩码小于32位,Destination精确到某一个网段的主机
所以网络路由指明到某类网络怎么走

默认路由:掩码通常为0,Destination为default或0,表示除主机路由和网络路由外 的所有网络,全部都走默认路由
操作系统上设置的默认路由,一般也称为网关


### 2 路由的优先级
若Linux上到某主机有多条路由可以选择,这时候会挑选优先级高的路由

# 2.1 优先级大前提
主机范围越小、越精确、优先级越高
而缩小主机范围的恰恰就是子网掩码
故掩码越长,优先级越高

# 2.2 优先级区分
1.在Linux中,路由条目的优先级确定方式是先匹配掩码位长度,掩码越长的优先级高
所以主机路由的优先级最高,然后是直连网络的路由(即同网段网络路由)次之,最后是 默认路由即网关

2.若路由条目的掩码长度相同,则比较节点之间的管理距离(比如metric),管理距离短的 生效


### 3 优先级案例
[root@egon ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.100.2   0.0.0.0         UG    100    0        0 eth0
172.16.10.0     0.0.0.0         255.255.255.0   U     100    0        0 eth1
192.168.0.0     192.168.100.70  255.255.0.0     UG    0      0        0 eth0
192.168.100.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.100.78  0.0.0.0         255.255.255.255 UH    0      0        0 eth0

# ping 192.168.5.20
会先检索掩码长的路由条件,即按照如下顺序
255.255.255.255 > 255.255.255.0 > 255.255.0.0 > 0.0.0.0 

于是依次比对192.168.100.78、192.168.100.0、172.16.10.0发现也无法匹配
接着再匹配192.168.0.0这条网络路由条目,发现能匹配,所以选择该路由条目,从eth0发出数据包


[root@egon ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.100.2   0.0.0.0         UG    100    0        0 eth0
192.168.100.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.100.0   0.0.0.0         255.255.255.0   U     101    0        0 eth1

# ping 192.168.100.20
由于两块网卡eth0和eth1都是192.168.100.0/24网段地址,
所以它们的路由条目在掩码长度的匹配上是相同的,选择Metric更小的,即eth0网卡

3.4.2 路由命令route

  • 1 显示路由信息
# 0 route命令
用于显示和管理Linux内核的路由表。使用add或del选项时,route命令将设置路由条目

注:本机收到数据,会根据该路由表的路由策略,来判断数据通过哪个网卡及网关流出


# 1 显示路由表信息  
route -n   # 其中-n选项表示不解析主机名 

[root@egon ~]# route -n
Kernel IP routing table    内核IP路由表
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.100.2   0.0.0.0         UG    100    0        0 eth0
172.16.10.0     0.0.0.0         255.255.255.0   U     100    0        0 eth1
192.168.0.0     192.168.100.70  255.255.0.0     UG    0      0        0 eth0
192.168.100.0   0.0.0.0         255.255.255.0   U     100    0        0 eth0
192.168.100.78  0.0.0.0         255.255.255.255 UH    0      0        0 eth0

# 路由表信息条目 默认有:
保留网关         169.254.0.0/24  eth0/eth1  # 根据网卡个数
网卡同段网络路由  172.16.10.0/24  192.168.100.0/24  
  # 解释:网卡IP为 172.16.10.1/24,默认就会产生一条网络路由条目 172.16.10.0/24这个网段


# 显示解析:
Destination  # 目标网络或目标主机
  值为default(0.0.0.0)时,表示是默认网关,不走主机或网络路由的数据,会发送到该网关

Gateway     # 网关地址,即该条路由 下一步给哪个地址再转发
  值为0.0.0.0时,表示当前记录对应的Destination 跟本机在同一个网段,通信时不需要经过网关再转发

Genmask     # 网络掩码
  值为32位时,是主机路由;值为0位时,是默认路由(即网关)

Flags       # 标记位
  U : route is up  路由是激活的
  H : target is a host  目标是个主机
  G : use gateway,需要经过网关  # 即设置了下一跳的路由条目
  ! : 拒绝路由

Metric      # 路由距离,到达指定网络所需的中转数   这三项不在Linux内核中使用
Ref         # 路由项引用次数 
Use         # 此路由项被路由软件查找的次数

Iface       # 网卡名字,即该路由是通过哪个网卡流出
  • 2 添加、删除路由
route [add|del] [-host|-net|default] [目标IP/mask] [gw] [网关IP] [dev] [网卡名字]

route [add|del] [-host|-net|default] [目标IP] [netmask] [网络掩码] [gw] [网关IP] [dev] [网卡名字]


# 选项说明:
add|del  : 增加或删除 路由记录条目

-net     : 增加或删除的是一条 网络路由
-host    : 增加或删除的是一条 主机路由
default  : 增加或删除的是一条 默认路由

netmask  : 明确使用netmask关键字 指定掩码
           # 也可以不使用该选项,直接在地址上使用cidr格式的掩码,即目标IP/MASK
           
gw       : 设置 网关  gateway
dev      : 设置网络接口(即网卡设备)   # 一般内核会自动判断路由条目应该关联到哪个网络接口


# 1 添加|删除 主机路由
route add -host 172.16.10.55/32 gw 192.168.45.20 dev eth0
route add -host 172.16.10.55 gw 192.168.45.20  # 主机路由是32位,可直接省略掩码

route del -host 172.16.10.55


# 2 添加|删除 网络路由
route add -net 172.16.10.0/24 gw 192.168.45.70
route add -net 172.16.10.0 netmask 255.255.255.0 gw 192.168.45.70

# 添加同一个局域网的主机
route add -net 172.16.10.0/24 dev eth0   # 则不需要指定下一跳网关,网卡可指向本机接口

route del -net 172.16.10.0/24  # 删除时,偷懒 指定ip/mask即可


# 3 添加|删除 默认路由
route add default gw 192.168.45.10
# 等于 route add -net 0.0.0.0/0 gw 192.168.45.10

route del default
route del default gw 192.168.45.10   # 若有多条默认路由,则再加上gw即可唯一删除指定条目
  • 3 永久配置路由信息
# 1 根据出去的网卡接口,就创建哪个网卡对应配置文件
/etc/syconfig/network-scripts/route-ethX


# 2 配置格式
DEST         via       nexthop        # 每一行,一个路由条目
要到达的目标  via关键字  下一跳地址(网关)
# 要求下一跳必须能到达,且一般都和 ethX 同网段

eg: eth0网卡的IP地址是192.168.10.123,要通过网卡eth0出去到达10.0.0.10
10.0.0.0/24  via  192.168.10.222   # 那么网关要和eth0的地址在同网段


# 3 配置案例   其中dev 网卡可以省略的,因为配置在哪个eth文件中就会从哪个接口出去
# 默认路由
default     via 192.168.45.1
1.1.
0.0.0.0/0   via 192.168.45.1

# 网段路由
192.168.10.0/24   via 0.0.0.0

# 主机路由
192.168.45.52/32  via 192.168.45.33 dev eth1


# 配置完后,重启network服务即可立即生效
systemctl restart network


# 4 注意事项
1.route-ethX 对应的 网卡配置文件ifcfg-ethX必须存在,否则路由无效
  注意:对于虚拟机,通常新添加的网卡都没有对应的ifcfg-ethX文件,但ifconfig却能找到该网卡

2.若在文件中配置永久默认路由,且该网卡使用了DHCP服务分配地址
则必须保证网卡配置文件ifcfg-ethX中的 DEFROUTE指令设置为"no",表示DHCP不设置默认路由

3.若在文件中配置永久路由,且该网卡使用了DHCP服务分配地址
则必须保证网卡配置文件ifcfg-ethX中的 PEERROUTES指令设置为"no",表示DHCP设置的路由允许被覆盖

3.5 路由实验

实验网络拓扑图

3.5.1 实验准备:虚拟机及交换机

### 实验准备
1.4台虚拟机,分别有1台-1网卡  3台-2网卡  内存256m

2.4台交换机  
依次创建仅主机模式的四个"交换机":vmnet1、vmnet2、vmnet3、vmnet4
下图1

# 解释
  为防止Vm网络模式的干扰,都设置为仅主机模式,虚拟机默认都只能与宿主机通信
  vm虚拟机,是通过虚拟网卡vmnet来通信  # 实验这里作为交换机来使用 
  
3.注意虚拟机2/3/4的 两个网卡,需要分别连不同的交换机(vmnet)
  下图2

3.5.2 实验准备:虚拟机网卡设置

### 1 命令初始化
iptables -F   # 清空防火墙规则
setenforce 0  # 关闭selinux
systemctl stop NetworkManager  # 禁用NetworkManager


### 2 分别配置静态IP   注意子网掩码一定要与vmnet的配置保持一致
[root@egon ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
IPADDR=1.1.1.8
NETMASK=255.255.255.0
NAME=eth0
DEVICE=eth0
ONBOOT=yes
NM_CONTROLLED=no


# 注:不确定哪个网卡连接的 交换机X
  先配置为dhcp动态获取看看IP地址,再进行静态配置
TYPE=Ethernet
BOOTPROTO=dhcp
NAME=eth0
DEVICE=eth0
ONBOOT=yes
NM_CONTROLLED=no

3.5.3 实验问题

  • 问题1:虚拟机1上ping 1.1.1.2 是否能通?
# 分析
可通

因为本机1.1.1.8与目标主机1.1.1.2 两台机器处于一个LAN中
并且两台机器上的路由表里具有Destination指向对方的网段路由条目


# ping 1.1.1.2的过程
虚拟机1:1.1.1.8 <---> Vmnet1 <---> 虚拟机2:1.1.1.2

[root@linux01 ~]# route -n
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
1.1.1.0         0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0

1. 虚拟机1,根据虚拟机1的路由表策略第一条,从网卡eth0出去
2. 网卡eth0连接到交换机1,交换机1会把该数据包在该网段内进行广播  # 广播内机器都会收到,拆包后发现不是自己的,都会丢掉
3. 虚拟机2,收到数据包后进行拆包,内核发现目标ip是自己,就不会丢弃包
4. 且gateway没有指向下一跳,虚拟机2 就不会进行 再一次的转发数据包

# ping 回包过程也是如此,根据虚拟机2的路由表
  • 问题2:虚拟机1上ping 2.2.2.2 是否能通?
# 分析
不通

因为本机1.1.1.8与目标主机1.1.1.2 两台机器处于一个LAN中
但虚拟机1的路由表里没有Destination指向2.2.2.0/24网段的路由条目


# 解决:
虚拟机1上 添加到达2.2.2.0/24的网段路由  # 主机、默认路由也都可
route add -net 2.2.2.0/24 dev eth0


# ping 2.2.2.2的过程
  虚拟机1:1.1.1.8 <---> Vmnet1 <---> 虚拟机2:1.1.1.2
  整体过程 同 问题1 一样
虽然此时,虚拟机2用来收包的网卡是1.1.1.0段的网卡
但虚拟机2在做内核分析时,会发现目标ip:2.2.2.2就是自己机器上的
压根不会搭理是哪个网卡的,所以会正常接收和处理该包

# ping 回包过程也是如此,根据虚拟机2的路由表  默认有1.1.1.0的网段路由,不需要额外添加
  • 问题3:虚拟机1上ping 2.2.2.3 是否能通?
# 分析
不通,虚拟机1的数据包,需要经过虚拟机2来转发

虽然在问题2,为虚拟机1添加了到达2.2.2.0/24段的路由
数据包沿着虚拟机1的eth0网卡,发送到虚拟机2同网段的网卡
但虚拟机2发现不是自己,会直接丢掉,压根都不会帮你转发
因为虚拟机1根本没有将网关指向虚拟机2,且虚拟机2需要开启路由转发


# 解决:
1.虚拟机1上 添加到达2.2.2.0/24的网段路由,且将网关写成虚拟机2的网卡1地址 # 网关的地址,必须是跟本机是同段的地址
route add -net 2.2.2.0/24 gw 1.1.1.2 dev eth0

2.虚拟机2上 开启路由转发
echo 1 > /proc/sys/net/ipv4/ip_forward
  # 也需要正确来往的路由策略,默认有,无需额外处理

3.虚拟机3上 添加到达1.1.1.0/24的网段路由  # 回包需要
route add -net 1.1.1.0/24 gw 2.2.2.2 dev eth0


# ping 2.2.2.3的过程
虚拟机1:1.1.1.8 <---> Vmnet1 <---> 1.1.1.2:虚拟机2:2.2.2.2 <---> Vmnet2 <---> 虚拟机3:2.2.2.3
  • 问题4:虚拟机1上ping 3.3.3.3 是否能通?
# 分析
不通,虚拟机1的数据包,需要经过虚拟机2来转发  # 理由基本同问题3一致


# 解决
1.虚拟机1上 并不能直接到达3.3.3.0/24段的网络,需要虚拟机2转发,所以要添加虚拟机2的网关
route add -net 3.3.3.0/24 gw 1.1.1.2 dev eth0

2.虚拟机2上  开启路由转发  # 问题3中 已开启

3.虚拟机2上  需要添加到达3.3.3.0/24段的网络,但不需要再转发,故可不用添加网关
route add -net 3.3.3.0/24  dev eth1  # 需要从交换机2出去,需要选择eth1网卡

4.虚拟机3上  回包需要添加到达1.1.1.0/24段的网络,需要虚拟机2转发,故要添加虚拟机2的网关  # 问题3 已添加
  • 问题4/5:后面继续ping 3.3.3.4 和4.4.4.4
# 原则
1.一层一层的往下,route -n 看是否有能到达的路由

2.看是否需要转发,需要转发的就需要 添加转发机的网关 和 开启路由转发

3.5.4 路由优化

# 以虚拟机1为例,除了第一个路由条目外,其他的路由条目(包括第三条在内),其实都是要送给1.1.1.2的

[root@egon ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
1.1.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
2.2.2.0 1.1.1.2 255.255.255.0 UG 0 0 0 eth0
2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
3.3.3.0 1.1.1.2 255.255.255.0 UG 0 0 0 eth0
4.4.4.0 1.1.1.2 255.255.255.0 UG 0 0 0 eth0

# 故可以统一用一条即可,这就是默认路由的来历

route del -net 2.2.2.0/24 
route del -net 2.2.2.0/24 # 两条,要再删一次
route del -net 3.3.3.0/24
route del -net 4.4.4.0/24

route add default gw 1.1.1.2

# 其他虚拟机类似
posted @ 2023-08-13 22:28  Edmond辉仔  阅读(2026)  评论(0)    收藏  举报