网络管理
一 网卡名字
网卡名称规则
#1、传统命名 CentOS6之前采用的都是传统的命名方式,如以太网:eth1,eth0.... #2、可预知的命名方案 Centos7提供了不同的命名规则,默认是基于固件、拓扑、位置信息来分配。这样做的优点是命名是全自动的、可预知的,缺点是比eth0更难读。比如ens33 可预知的命名方案例如: ①如果Fireware或BIOS为主板上集成的设备提供索引信息可用,则根据此索引进行命名,如:eno1, eno2, ... ②如果Fireware或BIOS为PCI-E扩展槽所提供的索引信息可用,且可预测,则根据此索引进行命名,如ens1, ens2, ... ③如果硬件接口的物理位置信息可用,则根据此信息命名,如enp2s0, ... ④如果用户显示定义,也可根据MAC地址命名,例如:enx122161ab212 #上述均不可用时,则仍使用传统方式命名; 可预知的命名方案,如本机网卡名为ens33,命名格式的组成如下: en:ethernet wl:wlan #无线局域网 ww:wwan #无线广域网 名称类型: o<index> #集成设备的设备索引号; s<slot> #扩展槽对的索引号; x<MAC> #基于MAC地址的命名; p<bus>s<slot> #基于总线及槽的拓扑结构进行命名;
网卡命名的策略(了解知识)
规则1:如果Firmware或者BIOS提供的设备索引信息可用就用此命名。比如eno1。否则使用规则2 规则2:如果Firmware或Bios的PCI-E扩展插槽可用就用此命名。比如ens1,否则使用规则3 规则3:如果硬件接口的位置信息可用就用此命名。比如enp2s0 规则4:根据MAC地址命名,比如enx7d3e9f。默认不开启。 规则5:上述均不可用时回归传统命名方式 上面的所有命名规则需要依赖于一个安装包:biosdevname biosdevname和net.ifnames属于两种不同的命名规范 CentOS-7中默认biosdevname的值为0,net.ifnames的值为1。
配置回归传统命名方式(了解知识)
#修改网卡配置文件名称 [root@egon ~]# cd /etc/sysconfig/network-scripts/ [root@egon ~]# mv ifcfg-ens33 ifcfg-eth0 #修改网卡配置文件设备名称 [root@egon ~]# sed -i "s#ens33#eth0#g" ifcfg-eth0 ##GRUB添加kernel参数 [root@egon ~]# vim /etc/sysconfig/grub GRUB_CMDLINE_LINUX="rhgb quiet 'net.ifnames=0 biosdevname=0'" #加载到引导分区 [root@egon ~]# grub2-mkconfig -o /boot/grub2/grub.cfg #重启系统生效 [root@egon ~]# reboot
二 基本网络配置
查看网卡信息
# 查看当前系统所连接的所有以太网卡 [root@egon ~]# lspci |grep -i ethernet # 确认网线已经连接好,以eth0 为例 [root@egon ~]# mii-tool eth0 # 该命令需要安装有net-tools才能用 eth0:negotiated 1000baseT-FD flow-control,link ok # link ok网卡能够被识别,并且接了有效的网线 [root@egon ~]# mii-tool eth1 SIOCGMIIPHY on 'eth1' failed: Invalid argument 网卡虽然能够被识别(网卡已经被驱动了,但不能用:网卡配置错误,网线没接等)
ifconfig命令
1、ifconfig -a 查看所有网卡信息(包括未激活的网卡) 2、ifconfig eth0 查看单个网卡信息 3、ifconfig eth0 192.168.1.122 netmask 255.255.255.0 临时设定IP和掩码(重启服务或者系统都失效) 4、ifconfig eth0 192.168.1.122/24 5、ifconfig eth0:1 192.168.0.2 netmask 255.255.255.0 配置子接口 # 删除:下述两种方式都可以 ifconfig eth0:0 down ifconfig eth0:1 del 192.168.0.2 # 删除,不必加掩码 6、开启与关闭 ifconfig eth0 down|up # 不加载网卡配置文件 ifdown eth0 |ifup eth0 # 加载网卡配置文件-centos7.9带 7、设置网卡最大传输单元 ifconfig eth0 mtu 1500 8、开启关闭模式(了解) 网卡的繁杂模式(Promiscuous mode)和多播(Multicast)是网络通信中两种非常重要的概念。 1.网卡的繁杂模式:在默认情况下,网卡只会接收发给自己MAC地址的数据帧,其它的数据帧则会被过滤丢弃。 但是当我们把网卡设置为繁杂模式时,网卡将接收通过该网卡的所有数据帧, 无论这些数据帧的目标MAC地址是什么。这个特性在一些特定的情况下很有用, 例如网络监听(sniffing)和网络调试。 2.多播:多播是一种网络传输技术,它允许一个网络节点将数据发送到多个接收节点, 但又不像广播那样向所有网络节点发送。多播通过使用特定的IP地址范围(224.0.0.0到239.255.255.255)和 MAC地址范围,来标示一组特定的接收节点。当发送节点发送数据时, 只有加入了相应多播组的节点会接收和处理这份数据,其它未加入的节点则会忽略这份数据。 多播技术可有效减少网络流量,提升网络的利用效率,因此在一些需要数据共享的场景, 例如视频直播和在线游戏,多播技术得到了广泛的应用。 ifconfig eth0 promisc # 开启繁杂模式 ifconfig eth0 -promisc # 关闭繁杂模式 ifconfig ens33 multicast # 开启多播 ifconfig ens33 -multicast # 关闭多播 这条命令将网络设备ens33配置为接收多播流。这意味着,如果多播流被发送到与ens33关联的多播IP地址, 只要设备在这个多播组中,那么ens33就能接收到这个多播流。 ifconfig eth0 allmulti # 开启 ifconfig eth0 -allmulti # 关闭 条命令启用了网络设备eth0上的全多播模式。全多播模式是指,网络设备接收所有来自网络的多播流, 而不仅仅是它已经订阅的流。这对于一些需要接收所有多播流的特殊应用, 例如路由器或者一些网络调试工具,是非常有用的。 9、添加、删除ipv6地址 ifconfig eth0 add 3ffe:3240:800:1005::2/64 ifconfig eth0 del 3ffe:3240:800:1005::2/64
ifconf命令查看到的结果解释
[root@egon ~]# ifconfig ens33 ens33: 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 # 表示开机后此接口累积接收报文错误数,丢弃数,溢出数(由于速度过快而丢失的数据包数),冲突的帧数 TX packets 102 bytes 16768 (16.3 KiB) # 表示开机后此接口累积发送的报文个数,总字节数 TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # 表示开机后此接口累积发送报文错误数,丢弃数,溢出数(由于速度过快而丢失的数据包数), # carrier 载荷数(发生carrier错误而丢失的数据包数) # collisions 冲突数
ethtool解决网卡丢包严重问题
储备知识
# 1、储备知识1: linux软硬件中断 中断是系统用来影响硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的终端处理程序来影响设备的请求。 中断是一个异步的事件处理机制,可以提高操作系统处理并发的能力。 详见博客:https://www.cnblogs.com/linhaifeng/articles/13916102.html # 2、储备知识2:全双工与半双工,目前网卡一般都应该采用全双工模式 全双工传输英文写法是:Full-Duplex Transmissions 是指交换机在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的交换机都支持全双工。 现代多数网络设备,如交换机、路由器、计算机的网卡等,通常支持全双工工作模式,能够提供更好的网络速率和性能。 与之对应的是【半双工】这个概念:就是指一个时间段内只有一个动作发生,举个简单例子,一天窄窄的马路,同时只能有一辆车通过,当目前有两量车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。早期的对讲机、以及早期集线器等设备都是实行半双工的产品。随着技术的不断进步,半双工会逐渐退出历史舞台。 // 了解更多全双工与半双工:https://www.cnblogs.com/linhaifeng/articles/13949762.html # 3、储备知识3:CRC CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性 CRC,全称循环冗余校验(Cyclic Redundancy Check),是一种常用的校验方式,用于发现网络通信中传输数据的错误。 网卡接收数据的每一帧数据都包含一个CRC值。这个CRC值是基于数据帧中的数据计算得来的。发送数据的设备,如网卡,会在发送数据的时候计算CRC,并将CRC值附加在数据帧的尾部。接收数据的设备则会重新计算接收到的数据帧的CRC值,然后与接收到的CRC值进行比较。如果两个CRC值不相等,则表示数据在传输过程中发生了错误。 网卡进行CRC校验的原理主要有以下几步: 1、发送方网卡在发送数据包时,会首先对数据包进行CRC计算,得出一个CRC值。 2、发送方在数据包的尾部附加CRC值后,就将整个数据包发出。 3、当接收方网卡收到数据包后,会对除CRC值之外的数据重新进行CRC计算,得出一个新的CRC值。 4、接收方网卡会将计算出的新CRC值,和数据包尾部接收到的CRC值进行对比,如果一致则认为此数据没有在传输中被篡改,如果不一致则认为数据在传输中被篡改。 这就是网卡的CRC校验原理。虽然CRC不能完全确保数据的完整性,但是它在很大程度上提高了数据传输的可靠性。 // 了解更多:https://www.cnblogs.com/linhaifeng/articles/13949806.html # 4、储备知识4:懂了上面的CRC校验流程,我们再来看下网卡工作流程,就很明朗了 网卡发包: 1、ip包+14个字节的mac头变成数据帧frame 2、frame拷贝到网卡芯片内部的缓冲区,由网卡处理 3、网卡芯片为frame添加头部同步信息和CRC校验,此时才是真正可以发送的packet,然后发送该packet 网卡收包: 1、网络包packet到达网卡,网卡先检查包packet的CRC校验,保证其完整性和正确性,然后去掉它的头得到frame 2、网卡将frame拷贝到网卡内部的FIFO缓冲区 3、网卡驱动程序产生硬件中断,把frame从网卡拷贝到内存中,接下来就交给内核处理 网卡丢包!!! 内核通常需要快速的拷贝网络数据包到系统内存!!! 因为网卡上接收网络数据包的缓存大小固定,而且相比系统内存也要小得多。 所以上述拷贝动作一旦被延迟,必然造成网卡FIFO缓存溢出 - 进入的数据包占满了网卡的缓存,后续的包只能被丢弃,这也应该就是ifconfig里的overrun的来源。 // 网卡工作原理: https://www.cnblogs.com/linhaifeng/articles/13949943.html
丢包问题解决
# 丢包排查 网卡工作在数据链路层,数据量链路层,会做一些校验,封装成帧。我们可以查看校验是否出错,确定传输是否存在问题。然后从软件层面,是否因为缓冲区太小丢包。 # 1 先查看硬件情况 一台机器经常收到丢包的报警,先看看最底层的有没有问题: # 1.1 查看工作模式是否正常 [root@egon ~]# ethtool ens33 | egrep 'Speed|Duplex' Speed: 1000Mb/s Duplex: Full # 全双工 # 1.2 查看CRC校验是否正常 [root@egon ~]# ethtool -S ens33 | grep crc # crc错误值大通常是因为服务器外部的网络环境有问题导致的 rx_crc_errors: 0 -----------Speed,Duplex,CRC 之类的都没问题,基本可以排除物理层面的干扰---------- # 2 通过 ifconfig 可以看到 overruns 是否一直增大,如果查看结果是一直增大 for i in `seq 1 100`; do ifconfig ens33 | grep RX | grep overruns; sleep 1; done # 3 调整网卡缓冲区 [root@egon ~]# ethtool -g ens33 Ring parameters for ens33: Pre-set maximums: # 最大可以设置的值 RX: 4096 RX Mini: 0 RX Jumbo: 0 TX: 4096 Current hardware settings: # 当前设置的值 RX: 256 RX Mini: 0 RX Jumbo: 0 TX: 256 [root@egon ~]# ethtool -G ens33 rx 2048 # 调大 [root@egon ~]# ethtool -G ens33 tx 2048 # 调大 [root@egon ~]# [root@egon ~]# ethtool -g ens33 Ring parameters for ens33: Pre-set maximums: RX: 4096 RX Mini: 0 RX Jumbo: 0 TX: 4096 Current hardware settings: RX: 2048 RX Mini: 0 RX Jumbo: 0 TX: 2048 [root@egon ~]#
ethtool网卡降速
[root@egon ~]# ethtool -s ens33 speed 100 duplex full [root@egon ~]# ethtool -s ens33 speed 100 duplex full autoneg off # 关闭自适应才能设置成功 [root@egon ~]# ethtool ens33 # 查看 若想完成永久设置,可以将上述ethtool设置写入/etc/rc.d/rc.local之中。 然后记住必须要加一个x权限 [root@egon ~]# chmod +x /etc/rc.d/rc.local
ping命令
ping 目标IP地址 # ctrl+c结束 测试是否两台主机网络是否通 ping -c 次数 目标IP地址 # 在自己的机器上执行,则禁用别人ping自己 [root@egon ~]# echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
NetworkManager服务(客户端管理工具nmcli,要求NetworkManager必须开启时nmcli才能用)
network服务和NetworkManager是两种不同的网络管理工具,每种工具都有自己的特点和适用场景。 1、network服务:它是基于传统的Linux网络管理方法,即手动配置网络接口和服务。在使用network服务时, 管理员需要编辑/etc/sysconfig/network-scripts/目录下的ifcfg文件来配置网络接口。 network服务在系统启动时读取这些配置文件,并应用这些设置。network服务的优势在于其稳定性和可预测性, 特别适合服务器环境。 2、NetworkManager:它是一个更现代的网络管理工具,可以自动管理其他网络接口和服务, 主要用于桌面环境。NetworkManager可以管理各种类型的网络连接,例如有线网络、无线网络和VPN等, 并在网络环境改变时动态更新网络配置。通常情况下,这两种服务不会同时运行,因为它们可能会产生冲突。 3、但是在CentOS 9中,NetworkManager已经成为默认的网络管理工具,而network服务已被移除。 也就是说,你需要使用NetworkManager来管理你的网络接口和连接。这相比早期的CentOS版本, 使得网络配置更加灵活和自动化,特别是对于经常需要切换网络环境的桌面用户来说。 但是,这也可能需要服务器管理员熟悉新的网络管理方法。 cenetos7.9中我们直接关闭掉它,而使用network服务,而在centos9中则只能用NetworkManager [root@egon ~]# systemctl stop NetworkManager [root@egon ~]# systemctl disable NetworkManager
centos7.9
centos7.9中使用network服务、关掉 NetworkManager,与network服务相关的配置文件
- 1、/etc/sysconfig/network-scripts/ifcfg-ethX 网卡的配置文件
# 打开网卡配置文件,完成静态ip配置,修改完毕后重启网络服务即可:systemctl restart network DEVICE=eth0 <-- 网卡名字 BOOTPROTO=static <---- dhcp 动态获取IP <---- none 根据其他选项决定动态还是静态 <---- static肯定是手工指定IP NM_CONTROLLED=no <---如果NetworkManager服务启用,该网卡配置文件也不受该服务管理 ONBOOT=yes <---- 网络服务启动的时候,yes代表激活状态 , no 代表禁用 TYPE=Ethernet IPADDR=10.1.1.11 <-- IP 地址 NETMASK=255.255.255.0 <-- 子网掩码 GATEWAY=10.1.1.1 <-- 默认网关 DNS1=10.1.1.1 <-- DNS1 服务器 DNS2=8.8.8.8 <-- DNS2 服务器 HWADDR=14:da:e9:eb:a9:61 <---MAC地址 USERCTL=no <---是否允许普通用户启动或者停止该网卡 IPV6INIT=no <---是否在该网卡上启动IPV6的功能 PEERDNS=yes <---是否允许网卡在启动时向DHCP服务器查询DNS信息, # 设置为yes时,此文件设置的DNS将覆盖/etc/resolv.conf, # 若开启了DHCP,则默认为yes,所以dhcp的dns也会覆盖/etc/resolv.conf - 2、dns配置文件
- 1)/etc/resolv.conf DNS解析文件,
[root@egon ~]# cat /etc/resolv.conf # 设置DNS指向,最多3个
nameserver 8.8.8.8 # 对应网卡配置文件中的配置项DNS1
nameserver 192.168.12.1 # 对应网卡配置文件中的配置项DNS2 - 2)/etc/hosts 本地名称解析文件,优先于DNS
ps:dns检索优先级
浏览器DNS缓存->本地系统DNS缓存->本地计算机HOSTS文件->ISP DNS缓存->递归or迭代搜索
- 1)/etc/resolv.conf DNS解析文件,
注意:
在NetworkManager服务开启的情况下,你在centos7中也可以用nmcli命令,使用该命令修改的就是
/etc/sysconfig/network-scripts下的文件
而在centos9中修改的则是/etc/NetworkManager/system-connections/下的文件
centos9
centos9中使用NetworkManager服务,与该服务相关的配置文件
详见:https://rockylinux.cn/notes/rocky-linux-9-network-configuration.html
直接说重点:用命令直接设置静态ip,不用改配置文件,非常方便
nmcli con mod ens33 ipv4.addresses "192.168.1.100/24" nmcli con mod ens33 ipv4.gateway "192.168.1.1" nmcli con mod ens33 ipv4.dns "8.8.8.8,8.8.4.4" # 多个dns nmcli con mod ens33 ipv4.method manual nmcli con down ens33 nmcli con up ens33
详解如下
# 1、新增两个块桥接网卡 # 2、查看设备信息,发现刚添加的两块网卡都是disconnected [root@rockylinux ~]# nmcli device DEVICE TYPE STATE CONNECTION ens160 ethernet connected ens160 lo loopback connected (externally) lo ens224 ethernet disconnected -- ens256 ethernet disconnected -- # 3、创建一个名为'ens224'的新以太网连接,该连接对应的网络接口(ifname)也是'ens224'。 [root@rockylinux ~]# nmcli con add type ethernet con-name ens224 ifname ens224 Connection 'ens224' (xxxx)successfully added. [root@rockylinux ~]# nmcli device DEVICE TYPE STATE CONNECTION ens160 ethernet connected ens160 ens224 ethernet connected ens224 lo loopback connected (externally) lo ens256 ethernet disconnected -- 另外一个也添加一下:nmcli con add type ethernet con-name ens256 ifname ens256 # 4、上述命令会自动添加配置文件到该目录下 [root@rockylinux ~]# ll /etc/NetworkManager/system-connections total 16 -rw-------. 1 root root 229 Mar 15 18:17 ens160.nmconnection -rw-------. 1 root root 184 Mar 17 15:59 ens224.nmconnection -rw-------. 1 root root 184 Mar 17 16:01 ens256.nmconnection 如果你重复执行上面3中命令则会重复创建带uuid的文件,需要删掉,否则冲突 ens224-85d88cca-2cb2-491d-bc7c-7e216c9128cc.nmconnection 删掉方式请用命令 nmcli con delete connection_name 会删除 connection_name的所有,所以需要重新创建一下,总之以后记住不要重复创建就没这么麻烦啦 # 5、用命令操作ip配置,一边操作,会自动写入对应的配置文件中 cat /etc/NetworkManager/system-connections/ens224.nmconnection # 配置 IPv4 地址 [root@localhost ~]# nmcli connection modify ens224 ipv4.addresses 192.168.11.172/24 # 配置 IPv4网关 [root@localhost ~]# nmcli connection modify ens18 ipv4.gateway 192.168.11.254 # 配置 IPv4 DNS,多个 DNS IP 之间使用双引号 + 空格 [root@localhost ~]# nmcli connection modify ens18 ipv4.dns "114.114.114.114 223.6.6.6" # 设置 DNS 基础搜索,多个域名之间使用双引号 + 空格 [root@localhost ~]# nmcli connection modify ens18 ipv4.dns-search "rockylinux.cn rockylinux.org" ==================================================================================== ipv4.dns和ipv4.dns-search两个选项用于指定DNS相关的配置。 1、ipv4.dns:这个选项用来指定DNS服务器的IP地址。这基本上就是你想让系统使用的DNS解析服务器。 你可以指定一个或多个IP地址,多个IP地址之间用逗号,分隔。 2、ipv4.dns-search:这个选项用来指定搜索域。这在你处于一个大型网络环境(比如公司网络)时特别有用。 搜索域是一种简化DNS解析的方式,它允许你只输入主机名(不包括域部分)来访问同一域中的计算机。 例如,如果你的完全限定域名(FQDN)是mycomputer.mydomain.com,并且你的搜索域设置为mydomain.com, 那么你只需要输入mycomputer就能访问这台计算机。 例如 nmcli con mod con-name ipv4.dns "8.8.8.8,8.8.4.4" nmcli con mod con-name ipv4.dns-search "mydomain.com" 在这个例子中,我们设置了Google的DNS服务器8.8.8.8和8.8.4.4为解析服务器,同时设置搜索域为mydomain.com。这样,当你在浏览器或命令行中输入mycomputer时,系统会自动尝试解析mycomputer.mydomain.com。 ==================================================================================== # 默认获取ip信息的method为auto,即DHCP模式,此处需要改为手动模式,不然会出现网络连接一会正常,一会中断的情况。这一点非常重要 [root@localhost ~]# nmcli connection modify ens18 ipv4.method manual # 重新加载网络配置 如果你上面没有设置为manual,则你执行up也会发现ip不变!!!! 如果你上面没有设置为manual,则你执行up也会发现ip不变!!!! 如果你上面没有设置为manual,则你执行up也会发现ip不变!!!! 如果你上面没有设置为manual,则你执行up也会发现ip不变!!!! 如果你上面没有设置为manual,则你执行up也会发现ip不变!!!! 如果你上面没有设置为manual,则你执行up也会发现ip不变!!!! 如果你上面没有设置为manual,则你执行up也会发现ip不变!!!! 如果你上面没有设置为manual,则你执行up也会发现ip不变!!!! 如果你上面没有设置为manual,则你执行up也会发现ip不变!!!! [root@localhost ~]# nmcli connection down ens18; nmcli connection up ens18 # 查看接口配置信息 [root@localhost ~]# nmcli device show ens18 # 查看配置文件,如果需要配置多IP,可以修改此配置文件。 [root@localhost ~]# cat /etc/NetworkManager/system-connections/ens18.nmconnection [connection] id=ens18 uuid=7f49fd62-02d9-323e-8f35-0c8249647a74 type=ethernet autoconnect-priority=-999 interface-name=ens18 timestamp=1669365850 [ethernet] [ipv4] address1=192.168.11.172/24,192.168.11.254 # 第一个ip地址:前一个地址是ip,后一个是网关 # address2=192.168.11.145/24,192.168.11.254 # 第二个ip地址:同上 dns=114.114.114.114;223.6.6.6; dns-search=rockylinux.cn;rockylinux.org; method=manual [ipv6] addr-gen-mode=eui64 method=disabled [proxy] # 查看网络连接 [root@localhost ~]# nmcli connection NAME UUID TYPE DEVICE ens18 7f49fd62-02d9-323e-8f35-0c8249647a74 ethernet ens18 # 重启网络 [root@localhost ~]# systemctl restart NetworkManager [root@localhost ~]# systemctl status NetworkManager ● NetworkManager.service - Network Manager Loaded: loaded (/usr/lib/systemd/system/NetworkManager.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2022-11-25 03:52:19 EST; 5s ago Docs: man:NetworkManager(8) Main PID: 2002 (NetworkManager) Tasks: 4 (limit: 48930) Memory: 2.9M CPU: 105ms CGroup: /system. slice/NetworkManager. service └─2002 /usr/sbin/NetworkManager --no-daemon
永久设置主机名
[root@egon ~]# hostnamectl set-hostname egon.xxx.com [root@egon ~]# hostname egon.xxx.com [root@egon ~]# [root@egon ~]# cat /etc/hostname egon.xxx.com
端口和服务的对应关系
[root@egon ~]# grep '^ftp\|^ssh' /etc/services
三 路由route
3.1 交换与路由
交换: 指同网络访问。两台机器连在同一个交换机上,配置同网段的不同ip就可以直接通迅 (这里不讨论三层交换).
路由: 指跨网络访问的路径选择
3.2 Linux处理数据包的过程
在解释Linux路由相关的内容时,我们先来了解一下数据包转发功能以及因此涉及到的路由决策,这对理清路由和未来的防火墙有重要帮助。
linux处理数据包过程如下图
当向外界主机发送数据时,在它从网卡流入后需要对它做路由决策,根据其目标决定是流入本机的用户空间还是在内核空间就直接转发给其他主机
# 1、如果是流入本机用户空间的数据, 则数据会从内核空间进入用户空间(被应用程序接收并处理); 此时如果本机用户空间的应用程序不需要产生新的数据包对外发送,那便不再涉及到从某个网卡流出数据; 但是如果本机用户空间的应用程序需要产生新的数据包对外发送,那便需要从某个网卡流出数据,但在流出之前,也需要做路由决策:根据目标决定从哪个网卡流出。 # 2、如果不是流入本机用户空间的数据,仅仅只是要经由本机把数据包转发给其他主机 则必然涉及到从某个网卡流出,此时数据包必须从流入网卡完整地转发给流出网卡,这要求Linux主机能够完成这样的转发。但Linux主机默认未开启ip_forward功能,这使得数据包无法转发而被丢弃。 ps:Linux主机和路由器不同,路由器本身就是为了转发数据包,所以路由器内部默认就能在不同网卡间转发数据包,而Linux主机默认则不能转发。若要开启linux主机的转发功能,有很多方式,如下所示
临时开启linux主机的路由转发功能,重启网络服务则失效
# 方式1: echo 1 > /proc/sys/net/ipv4/ip_forward # 方式2: sysctl -w net.ipv4.ip_forward=1
若要永久生效,则应该写入配置文件。
# 在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,并且这些文件中默认都没有net.ipv4.ip_forward项。当然,直接将此项写入到这些配置文件中也都是可以的,建议写在/etc/sysctl.d/*.conf中,这是systemd提供自定义内核修改项的目录。例如: echo "net.ipv4.ip_forward=1" > /etc/sysctl.d/ip_forward.conf
可以使用以下几种方式查看是否开启了转发功能。
[root@egon ~]# sysctl net.ipv4.ip_forward [root@egon ~]# cat /proc/sys/net/ipv4/ip_forward [root@egon ~]# sysctl -a | grep ip_forward
!!!注意了注意注意了:只有当本机被别人当成网关并且本机开启路由转发功能时,别人发来的请求包,本机才会帮忙转发,这一点很重要,请务必记住
!!!注意了注意注意了:只有当本机被别人当成网关并且本机开启路由转发功能时,别人发来的请求包,本机才会帮忙转发,这一点很重要,请务必记住
!!!注意了注意注意了:只有当本机被别人当成网关并且本机开启路由转发功能时,别人发来的请求包,本机才会帮忙转发,这一点很重要,请务必记住
!!!注意了注意注意了:只有当本机被别人当成网关并且本机开启路由转发功能时,别人发来的请求包,本机才会帮忙转发,这一点很重要,请务必记住
!!!注意了注意注意了:只有当本机被别人当成网关并且本机开启路由转发功能时,别人发来的请求包,本机才会帮忙转发,这一点很重要,请务必记住
如果Linux主机有多块网卡,如果不开启数据包转发功能,则这些网卡之间是无法互通的。
主机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
# 到达该Linux主机2的数据包无法从eth0交给eth1或者从eth1交给eth0,除非Linux主机开启了数据包转发功能。
另外,IP地址是属于内核的(不仅如此,整个tcp/ip协议栈都属于内核,包括端口号),只要能和其中一个地址通信,就能和另一个地址通信,而不需要开启数据包转发功能
但是前提本机一定要有匹配的路由,
例如主机1上要访问主机2的172.16.10.24/24
主机1上就必须配置一条可以匹配目标地址172.16.10.24/24的路由,这个路由可以是默认路由、网络路由、主机路由都行,只要路由能匹配上保证数据包能送出去就行,否则内核层面发现本机匹配不到路由就会直接在本机就把包扔了
主机1----------------------》eth0 主机2 etht1 192.168.12.46/24 192.168.12.42/24 172.16.10.24/24
具体案例
主机2有两网卡 eth0:192.168.12.42 eth1:172.16.10.24 主机1与主机2的eth0在一个网段里 ip地址为:192.168.12.46 网关指向:192.168.12.42, 若主机1执行ping 172.16.10.24,结果将是通的,因为地址属于内核,从主机2的ens33进来的数据包被内核分析时,发现目标地址为本机地址,直接就回应192.168.12.46,回应数据包继续从eth0出去。 示范: 主机2: [root@egon ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.12.42 netmask 255.255.255.0 broadcast 192.168.12.255 inet6 fe80::499e:c2c1:f5ed:3900 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:86:f8:59 txqueuelen 1000 (Ethernet) RX packets 11162 bytes 2670925 (2.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 653 bytes 65271 (63.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.16.10.24 netmask 255.255.0.0 broadcast 172.16.255.255 inet6 fe80::1dde:f649:4124:37fe prefixlen 64 scopeid 0x20<link> ether 00:0c:29:86:f8:63 txqueuelen 1000 (Ethernet) RX packets 1698 bytes 413552 (403.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 35 bytes 7070 (6.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 # 主机1 [root@egon ~]# ifconfig eth0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.12.46 netmask 255.255.255.0 broadcast 192.168.12.255 inet6 fe80::644f:3e62:6268:6b44 prefixlen 64 scopeid 0x20<link> inet6 fe80::d636:4f02:54b8:ad9 prefixlen 64 scopeid 0x20<link> inet6 fe80::499e:c2c1:f5ed:3900 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ef:d0:eb txqueuelen 1000 (Ethernet) RX packets 1597 bytes 346818 (338.6 KiB) RX errors 0 dropped 1 overruns 0 frame 0 TX packets 373 bytes 45758 (44.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@egon ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 192.168.12.1 0.0.0.0 UG 100 0 0 ens33 192.168.12.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0 [root@egon ~]# route del default gw 192.168.12.1 # 删除主机原来的网关,不删的话会默认把跨网段包扔给它 [root@egon ~]# route add default gw 192.168.12.42 # 把默认网关指向192.168.12.42 [root@egon ~]# ping -c 1 172.16.10.24 # 可以ping通 或者你删掉这条默认网关,添加route add -net 172.16.10.0/24 dev ens33 也可以通
3.3 网关/路由
Linux上分为3种路由:
- 主机路由:掩码位32位,Destination精确到某一台主机,
所以主机路由是直接指明到某台具体的主机怎么走,主机路由也就是所谓的静态路由 - 网络路由:掩码小于32位,Destination精确到某一个网段的主机
所以网络路由指明到某类网络怎么走 - 默认路由:掩码通常为0
不走主机路由的和网络路由的、全部都走默认路由。操作系统上设置的默认路由一般也称为网关。
路由是区分优先级的:若Linux上到某主机有多条路由可以选择,这时候会挑选优先级高的路由
大前提: 主机范围越小、越精确、优先级越高,而缩小主机范围的恰恰就是子网掩码,掩码越长范围越小、越精确、优先级越高 优先级区分: # 1、在Linux中,路由条目的优先级确定方式是先匹配掩码位长度,掩码越长的优先级高 也就是说,掩码位长的路由条目优先级一定比掩码位短的优先级高,所以主机路由的优先级最高, 然后是直连网络(即同网段)的路由(也算是网络路由)次之, 再是网络路由, 最后才是默认路由即网关。 # 2、若路由条目的掩码长度相同,则比较节点之间的管理距离(比如metric),管理距离短的生效。
例如1:在本机查看到路由表如下,
[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,发现也无法匹配, 接着再匹配192.168.0.0这条网络路由条目,发现能匹配,所以选择该路由条目,从eth0发出数据包
例2:如下路由表。由于两块网卡eth0和eth1都是192.168.100.0/24网段地址,所以它们的路由条目在掩码长度的匹配上是相同的,但是和eth0直连的网段主机通信时,肯定会选择eth0这条路由条目(即第二条),因为eth1和该网段主机隔了一个eth0,距离增加了1。
[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
3.4 route命令(安装net-tools才有)
route命令用于显示和管理路由表。当使用了add或del选项时,route命令将设置路由条目,否则route命令将显示路由表。
要显示路由表信息,只需简单的route -n即可,其中-n选项表示不解析主机名。
例如:
如果本机eth1这个网卡有172.16.10.0/24这个网段的IP,默认就会产生一条路由条目 172.16.10.0 0.0.0.0 255.255.255.0 U 100 0 0 eth1 169.254.0.0/24 是保留网关 192.168.100.2 是配置的网关 [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 各字段含义 # 1、Destination:目标网络或目标主机 # 2、Gateway:要达到目标所需要经过的网关。如果没有通过网关,这部分将显示为0.0.0.0。 # 3、Genmask:和目标IP配对使用的网络掩码 # 4、Flags::表示特定的路由信息,有三个字符 U 表示该路由处于up状态、该路由可用 G 表示通过网关,路由项指向了一个网关 H 表示路由项指向一个主机,而非整个网络 # 5、Metric:Metric用于距离衡量,一般用于路由选择,值越小优先级越高。 # 6、Ref:使用/引用这个路由项的活动连接数量 (通常对普通用户没有意义)。 # 7、Use:这个路由项被使用的次数。 # 8、Iface:该路由所绑定的网络接口名,例如eth0,lo。 对于CentOS 6以上的系统,请忽略Metric和Ref两列,它们已经不被内核使用,只是有些路由软件可能会用上。
若要管理路由表,则使用add或del选项。
route [add/del] [-host/-net/default] [address[/mask]] [netmask] [gw] [dev] 选项说明: add/del:增加或删除路由条目 -net:增加或删除的是一条网络路由 -host:增加或删除的是一条主机路由 default:增加或删除的是一条默认路由 netmask:明确使用netmask关键字指定掩码,要可以不使用该选项直接在地址上使用cidr格式的掩码,即IP/MASK。 gw:指定下一跳的地址。要求下一跳地址必须是能到达的,且一般是和本网段直连的接口。 dev:强制将路由条目关联到指定的接口上。一般内核会自动判断路由条目应该关联到哪个网络接口。 # route命令添加的多少临时生效
例如:
(1).添加和删除默认路由
[root@egon ~]# route add default gw 192.168.100.10 [root@egon ~]# route del default [root@egon ~]# route del default gw 192.168.100.10 # 若有多条默认路由,则再加上gw即可唯一删除指定条目
因为默认路由的目的地是0.0.0.0,所以操作默认路由也可以使用0.0.0.0替代default关键字,但这样就麻烦的多了,还是用default会简单一点。
(2).添加和删除网络路由
[root@egon ~]# route add -net 172.16.10.0/24 gw 192.168.100.70 [root@egon ~]# route add -net 172.16.10.0 netmask 255.255.255.0 gw 192.168.100.70
若实在不知道下一跳给谁,想直接从某个端口扔出去就行,那就这么设置
[root@egon ~]# route add -net 172.16.10.0/24 dev eth0
删除路由可以直接在增加路由的语句上将add改为del关键字。如
[root@egon ~]# route del -net 172.16.10.0/24 gw 192.168.100.70 [root@egon ~]# route del -net 172.16.10.0 netmask 255.255.255.0 gw 192.168.100.70 [root@egon ~]# route del -net 172.16.10.0/24 dev eth0
但大多数时候,可以偷懒,只要能唯一确定删除的是哪条路由即可。如:
[root@egon ~]# route del -net 172.16.10.0/24
(3)添加和删除主机路由
[root@egon ~]# route add -host 172.16.10.55 gw 192.168.10.20 [root@egon ~]# route del -host 172.16.100.55
3.5 配置永久路由
(1)centos7.9中
根据接口创建路由配置文件/etc/syconfig/network-scripts/route-ethX,要从那个接口出去X就是几。
路由配置文件的配置格式非常简单,每一行一个路由条目,先是要到达的目标,然后是via关键字,最后是下一跳地址。要求下一跳必须能到达,且一般都和ethX同网段。
DEST via nexthop
例如eth0网卡的IP地址是192.168.10.123,要通过网卡eth0出去到达10.0.0.10,那么下一跳的地址要和eth0的地址在同网段,如192.168.10.222。
10.0.0.0 via 192.168.10.222
添加主机路由、默认路由、网段路由示例如下,其中dev是可以省略的,因为没有任何用处,配置在哪个eth文件中就会从哪个接口出去。
#默认路由 default via 192.168.100.1 0.0.0.0/0 via 192.168.100.1 #网段路由 192.168.10.0/24 via 192.168.100.1 #主机路由 192.168.100.52/32 via 192.168.100.33 dev eth1
配置完后,重启network服务即可立即生效。
route-ethX文件的还有另外一种永久路由的配置写法,但上面的方法更简单快捷,所以此处就不多说了。
配置永久路由时,需要注意几点:
(1).route-ethX的对应网卡配置文件ifcfg-ethX必须存在,否则路由无效。(注意:对于虚拟机,通常新添加的网卡都没有对应的ifcfg-ethX文件,但ifconfig却能找到该网卡)
(2).如果在文件中配置永久默认路由,则必须保证所有使用了DHCP服务的网卡配置文件ifcfg-ethX中的DEFROUTE指令设置为”no”,表示DHCP不设置默认路由。
(3).如果在route-ethX文件中配置永久路由,且该网卡使用了DHCP服务分配地址,则必须保证该网卡的ifcfg-ethX文件中的PEERROUTES指令设置为”no”,表示DHCP设置的路由允许被覆盖。
(2)centos9
nmcli的改动会直接自动改到配置文件中, centos7改的是/etc/sysconfig/network-scripts/route-ens33 centos9改的是/etc/NetworkManager/system-connections/ens160.nmconnection,新增一条类似route1=0.0.0.0/32,192.168.71.10 “nmcli connection up 网卡“后可以在route -n中看到 强调:+号代表增加路由条目,-号代表删除,如果不带任何符号代表覆盖 # 1、添加默认路由:“0.0.0.0/0”代表所有IP地址,“192.168.1.1”代表路由的网关。 nmcli connection modify eth0 +ipv4.routes "0.0.0.0/0 192.168.1.1" # 注意在centos7中该命令的掩码不允许设置为0 nmcli connection up eth0 # 使更改生效 # 2、添加网络路由:“192.0.2.0/24”是目标网络,“192.168.1.1”是网关。 nmcli connection modify eth0 +ipv4.routes "192.0.2.0/24 192.168.1.1" nmcli connection up eth0 # 3、添加主机路由:“192.0.2.2/32”是目标主机的网络地址, “192.168.1.1”是网关。 nmcli connection modify eth0 +ipv4.routes "192.0.2.2/32 192.168.1.1" nmcli connection up eth0 删除它们也很简单,只需要将上述命令中的+ipv4.routes更改为-ipv4.routes即可: nmcli connection modify eth0 -ipv4.routes "0.0.0.0/0 192.168.1.1" nmcli connection modify eth0 -ipv4.routes "192.0.2.0/24 192.168.1.1" nmcli connection modify eth0 -ipv4.routes "192.0.2.2/32 192.168.1.1" nmcli connection up eth0
3.6 练习
首先创建仅主机模式的四个”交互机“:vmnet1、vmnet2、vmnet3、vmnet4
然后创建四台虚拟机,四台主机执行下述三条命令
iptables -F setenforce 0 systemctl stop NetworkManager !!!然后按照下属网络拓扑配置静态IP,注意子网掩码一定要与vmnet的配置保持一致,即24位 配置文件参考如下 [root@egon ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1 TYPE=Ethernet BOOTPROTO=static IPADDR=2.2.2.2 NETMASK=255.255.255.0 NAME=eth1 DEVICE=eth1 ONBOOT=yes
网络拓扑如下
虚拟机1
[root@egon ~]# ifconfig ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 1.1.1.8 netmask 255.255.255.0 broadcast 1.1.1.255 inet6 fe80::20c:29ff:fe86:f863 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:86:f8:63 txqueuelen 1000 (Ethernet) RX packets 308 bytes 32432 (31.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 251 bytes 36999 (36.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 36 bytes 2912 (2.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 36 bytes 2912 (2.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [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 ens37 [root@egon ~]#
虚拟机2
[root@egon ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 1.1.1.2 netmask 255.255.255.0 broadcast 1.1.1.255 inet6 fe80::20c:29ff:feef:d0eb prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ef:d0:eb txqueuelen 1000 (Ethernet) RX packets 241 bytes 29171 (28.4 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 202 bytes 38291 (37.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 2.2.2.2 netmask 255.255.255.0 broadcast 2.2.2.255 inet6 fe80::20c:29ff:feef:d0f5 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:ef:d0:f5 txqueuelen 1000 (Ethernet) RX packets 216 bytes 44837 (43.7 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 242 bytes 27730 (27.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 21 bytes 2352 (2.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 21 bytes 2352 (2.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [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 0 0 0 eth0 2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 [root@egon ~]#
虚拟机3
[root@egon ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 2.2.2.3 netmask 255.255.255.0 broadcast 2.2.2.255 inet6 fe80::20c:29ff:fe0f:5b1c prefixlen 64 scopeid 0x20<link> ether 00:0c:29:0f:5b:1c txqueuelen 1000 (Ethernet) RX packets 252 bytes 40507 (39.5 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 522 bytes 87027 (84.9 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 3.3.3.3 netmask 255.255.255.0 broadcast 3.3.3.255 inet6 fe80::20c:29ff:fe0f:5b26 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:0f:5b:26 txqueuelen 1000 (Ethernet) RX packets 209 bytes 31979 (31.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 490 bytes 68919 (67.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 448 bytes 38080 (37.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 448 bytes 38080 (37.1 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@egon ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 2.2.2.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 3.3.3.0 0.0.0.0 255.255.255.0 U 101 0 0 ens37 [root@egon ~]#
虚拟机4
[root@egon ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 3.3.3.4 netmask 255.255.255.0 broadcast 3.3.3.255 inet6 fe80::20c:29ff:fe75:fd9f prefixlen 64 scopeid 0x20<link> ether 00:0c:29:75:fd:9f txqueuelen 1000 (Ethernet) RX packets 268 bytes 49290 (48.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 424 bytes 48665 (47.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 4.4.4.4 netmask 255.255.255.0 broadcast 4.4.4.255 inet6 fe80::20c:29ff:fe75:fda9 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:75:fd:a9 txqueuelen 1000 (Ethernet) RX packets 126 bytes 13057 (12.7 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 404 bytes 47702 (46.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 112 bytes 9520 (9.2 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 112 bytes 9520 (9.2 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@egon ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 3.3.3.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 4.4.4.0 0.0.0.0 255.255.255.0 U 101 0 0 ens37 [root@egon ~]#
做下述实验前,egon再次温馨提示你:
**!!!注意了注意注意了:只有当本机被别人当成网关并且本机开启路由转发功能时,别人发来的请求包,本机才会帮忙转发,这一点很重要,请务必记住**
要做下面的实验,把握住窍门,无论怎么玩,套路都一样
1、自己先在纸上写下来,你本次的数据包:源ip-》目标ip 数据包无非是一去一回 (1)去的路上:数据发沿途经过每个设备,都必须要有匹配目标ip的路由才行。 (2)回来的路上:也是一样。只不过当初的源ip变成了目标ip 2、某一台设备是你到达目的地的桥梁,你想让对方帮你转发,你就必须把自己的网关对方,并且对方也要开启转发功能才行。 始终记住:一台设备只有在开启了路由转发功能,并且被别人指定为网关的情况下,别人发来的请求包,它才会帮忙转发,这一点很重要,请务必记住*
- 在虚拟机1上ping1.1.1.2,能不能通? 如果不能通怎么解决?
# 分析 可以通 因为本机1.1.1.8与目标主机1.1.1.2 两台机器处于一个LAN中,并且两台机器上的路由表里具有Destination指向对方的网段路由条目 虚拟机1:1.1.1.8-------》Vmnet1《---------虚拟机2:1.1.1.2 # 用route -n查看虚拟机1的路由 [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 ens37 发现路由条目里包含了一条网络路由,则数据包就会从对应路由条目后面的网卡出去 # 如果我们删掉该网络路由,则无法ping通 [root@egon ~]# route del -net 1.1.1.0/24 [root@egon ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface [root@egon ~]# ping 1.1.1.2 # 无法ping通 connect:Network is unreachable # 可以添加网络路由,也可以添加主机路由,只要能到达虚拟机2就可以 [root@egon ~]# route add -host 1.1.1.2/32 dev ens37 # 主机路由必须指定设备 [root@egon ~]# ping 1.1.1.2 # 可以ping通 [root@egon ~]# route del -host 1.1.1.2/32 dev ens37 - 在前面ping通的基础上,继续在vm1上ping2.2.2.2,能不能通? 如果不能通怎么解决?
# 分析 不通, 因为本机1.1.1.8与目标主机1.1.1.2 两台机器处于一个LAN中,但虚拟机1的路由表里没有Destination指向2.2.2.0/24网段的路由条目 虚拟机1:1.1.1.8-------》Vmnet1《---------虚拟机2:1.1.1.2 # 用route -n查看虚拟机1的路由 [root@egon ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 1.1.1.2 0.0.0.0 255.255.255.255 UH 0 0 0 ens37 [root@egon ~]# ping 2.2.2.2 # 网络不可达,因为压根没有任何的Destination指向2.2.2.2 connect:Network is unreachable # 解决方式: 在虚拟机1上添加到达2.2.2.0/24网段的路由,其实主机路由、默认路由其实都可以,只要Destination能到达1.1.1.2即可 [root@egon ~]# route add -net 2.2.2.0/24 dev ens37 [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 ens37 2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 ens37 [root@egon ~]# ping 2.2.2.2 # 可以ping通 虚拟机1发送的包:源ip1.1.1.8 目标ip2.2.2.2 该数据包的目标ip对上了虚拟机1路由表哦的第二条,于是顺着网卡ens37发了出去,发到了交换机Vmnet1里 虚拟机1与虚拟机2正是通过Vmnet1交换机连接的,于是虚拟机2会收到该数据包,虽然此时虚拟机2用来收包的网卡是1.1.1.0段的网卡,但是虚拟机2在做内核分析时会发现目标ip:2.2.2.2就是自己机器上的、压根不会搭理是哪个网卡的,所以会正常接收和处理该包 虚拟机2回复的包:源ip2.2.2.2 目标ip1.1.1.8 该数据包的目标ip也能对应上虚拟机2路由表的条目,请自行查阅 - 在前面ping通的基础上,继续在vm1上ping2.2.2.3,能不能通? 如果不能通怎么解决?
# 分析 不通, 虚拟机1的数据包需要经过虚拟机2来转发,虽然在实验2我们为虚拟机1添加了到达2.2.2.0/24段的路由,数据包沿着虚拟机的ens33网卡发送到虚拟机2同网段的网卡,但虚拟机2压根不会帮你转发,因为虚拟机1根本没有将网关指向虚拟机2,此时虚拟机2即便开启了路由转发也没用 虚拟机1:1.1.1.8--》Vmnet1《--虚拟机2:1.1.1.2 2.2.2.2--》Vmnet2《--虚拟机3:2.2.2.3 # 在虚拟机1上: [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 ens37 2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 ens37 [root@egon ~]# ping 2.2.2.3 # 无法ping通,但是沿着本机的ens37发给了虚拟机2同网段的网卡 [root@egon ~]# route add -net 2.2.2.0/24 gw 1.1.1.2 # 添加网关指向虚拟机2,这样虚拟机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 ens37 2.2.2.0 1.1.1.2 255.255.255.0 UG 0 0 0 ens37 2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 ens37 # 在虚拟机2上: [root@egon ~]# route -n # 我们要找的目标是2.2.2.3,在虚拟机2上匹配到Destination:2.2.2.0,要想顺着eth1转发出去,需要开启虚拟机2的转发功能 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 0 0 0 eth0 2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 [root@egon ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 在虚拟机3上: [root@egon ~]# route -n # 虚拟机3在收到虚拟机2转发过来的包后,需要回包,回包的目标地址为虚拟机1的地址1.1.1.8,而在虚拟机3上没有任何Destination匹配成功,并且虚拟机3也不跟虚拟机1链接在一个LAN中,所以只能为虚拟机3添加网关指向虚拟机2,也借助虚拟机2帮助转发 [root@egon ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 2.2.2.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 3.3.3.0 0.0.0.0 255.255.255.0 U 101 0 0 ens37 [root@egon ~]# route add -net 1.1.1.0/24 gw 2.2.2.2 # 只要目标符号即可,可以是网络路由 [root@egon ~]# route del -net 1.1.1.0/24 gw 2.2.2.2 [root@egon ~]# route add -host 1.1.1.8/32 gw 2.2.2.2 # 只要目标符合即可,即也可以是主机路由 [root@egon ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 1.1.1.8 2.2.2.2 255.255.255.255 UGH 0 0 0 ens33 2.2.2.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 3.3.3.0 0.0.0.0 255.255.255.0 U 101 0 0 ens37 [root@egon ~]# - 在前面ping通的基础上,继续在vm1上ping3.3.3.3,能不能通? 如果不能通怎么解决?
不能ping通,解决思路略,下述操作已经做过的话就不需要重复做了 在虚拟机1上: [root@egon ~]# route add -net 3.3.3.0/24 gw 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 ens37 2.2.2.0 1.1.1.2 255.255.255.0 UG 0 0 0 ens37 2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 ens37 3.3.3.0 1.1.1.2 255.255.255.0 UG 0 0 0 ens37 在虚拟机2上 [root@egon ~]# echo 1 > /proc/sys/net/ipv4/ip_forward # 实验3中已经做过了,此处不需要再做了 [root@egon ~]# route add -net 3.3.3.0/24 dev eth1 [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 0 0 0 eth0 2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 3.3.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 [root@egon ~]# 在虚拟3上: [root@egon ~]# route add default gw 2.2.2.2 # 实验3中已经做过了,此处不需要再做了 [root@egon ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 1.1.1.8 2.2.2.2 255.255.255.255 UGH 0 0 0 ens33 2.2.2.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 3.3.3.0 0.0.0.0 255.255.255.0 U 101 0 0 ens37 [root@egon ~]# - 在前面ping通的基础上,继续在vm1上ping3.3.3.4,能不能通? 如果不能通怎么解决?
不同ping通, 解决思路:虚拟机1需要让虚拟机2帮忙转发包,虚拟机2需要虚拟机3帮忙转发包,虚拟机4回包的时候需要指定网关为虚拟机3 下述操作已经做过的话就不需要重复做了 # 虚拟机1:到达3.3.3.0/24段的网关指向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 ens37 2.2.2.0 1.1.1.2 255.255.255.0 UG 0 0 0 ens37 2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 ens37 3.3.3.0 1.1.1.2 255.255.255.0 UG 0 0 0 ens37 # 虚拟机2:到达3.3.3.0/24段的网关指向2.2.2.3,让其帮忙转发,需要配置 [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 0 0 0 eth0 2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 3.3.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 [root@egon ~]# route add -net 3.3.3.0/24 gw 2.2.2.3 [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 0 0 0 eth0 2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 3.3.3.0 2.2.2.3 255.255.255.0 UG 0 0 0 eth1 3.3.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 [root@egon ~]# echo 1 > /proc/sys/net/ipv4/ip_forward # 已经开启过了,此处只为提醒读者 # 在虚拟机3上开启路由转发 [root@egon ~]# echo 1 > /proc/sys/net/ipv4/ip_forward # 在虚拟机4上添加默认网关 [root@egon ~]# route add -net 1.1.1.0/24 gw 3.3.3.3 - 在前面ping通的基础上,继续在vm1上ping4.4.4.4,能不能通? 如果不能通怎么解决?
不同ping通, 解决思路:略 # 虚拟机1:到达4.4.4.0/24段的网关指向1.1.1.2,让其帮忙转发,需要配置 route add -net 4.4.4.0/24 gw 1.1.1.2 # 虚拟机2:到达4.4.4.0/24段的网关指向2.2.2.3,让其帮忙转发,需要配置 route add -net 4.4.4.0/24 gw 2.2.2.3 echo 1 > /proc/sys/net/ipv4/ip_forward # 虚拟机3:到达4.4.4.0/24段的路由(主机路由、网络路由、默认路由均可) route add -net 4.4.4.0/24 dev ens37 #设备为3.3.3.0段的网卡,因为该网卡与虚拟机4同链在Vmnet4上 echo 1 > /proc/sys/net/ipv4/ip_forward # 虚拟机4:到达1.1.1.0段的网关指向3.3.3.3,让其帮忙转发,之前已经配置过了 [root@egon ~]# route add -net 1.1.1.0/24 gw 3.3.3.3 [root@egon ~]# route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 1.1.1.0 3.3.3.3 255.255.255.0 UG 0 0 0 ens33 3.3.3.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33 4.4.4.0 0.0.0.0 255.255.255.0 U 101 0 0 ens37 - 路由优化
# 以虚拟机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 ens37 2.2.2.0 1.1.1.2 255.255.255.0 UG 0 0 0 ens37 2.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 ens37 3.3.3.0 1.1.1.2 255.255.255.0 UG 0 0 0 ens37 4.4.4.0 1.1.1.2 255.255.255.0 UG 0 0 0 ens37 [root@egon ~]# # 所以我们可以统一用一条即可,这就是默认路由的来历 [root@egon ~]# route del -net 2.2.2.0/24 [root@egon ~]# route del -net 2.2.2.0/24 # 我没写错,就是要再删一次 [root@egon ~]# route del -net 3.3.3.0/24 [root@egon ~]# route del -net 4.4.4.0/24 [root@egon ~]# route add default gw 1.1.1.2 测试: ping -c 1 1.1.1.2 ping -c 1 2.2.2.2 ping -c 1 2.2.2.3 ping -c 1 3.3.3.3 ping -c 1 3.3.3.4 ping -c 1 4.4.4.4 # 其他虚拟机路由条目优化思路相同,懒得写了
四 arp和arping命令
维护或查看系统arp缓存
arp为地址解析协议,将给定的ipv4地址在网络中查找其对应的MAC地址。
一般会使用arp协议获取局域网内的主机MAC,所以局域网主机之间也互称为网络邻居。
- arping与ping的区别
“arping”和”ping”都是用来测试网络连通性的工具,但它们工作的方式和侧重点不同。
“ping”:ping工具基于ICMP协议工作,它发送ICMP Echo请求到目标IP地址,并等待ICMP Echo响应。如果收到响应,说明网络是连通的;如果没有收到,可能网络不通,或是目标主机的防火墙规则阻止了ICMP请求。ping能够测量网络延迟和丢包率,这对于网络性能分析很有帮助。
“arping”:arping工具则基于ARP协议工作,它发送ARP请求到目标IP地址,并等待ARP响应。ARP协议通常用于解析网络层(IP地址)到数据链路层(MAC地址)的映射关系。因此,arping主要用来检测和解析IP地址与MAC地址的映射关系,同时也可用来检测本地网络(通常是同一子网)中的IP冲突问题。
总体来说,虽然arping和ping都可以用来测试网络连通性,但它们的工作原理和用途有所不同。如果你需要检测网络延迟、丢包情况或者跨网络(子网)的连通性,ping是更好的选择;而如果你想检测和解析IP和MAC的映射关系,或者测试本地网络的IP冲突,arping更适合。
4.1 arp命令
arp命令语法:
arp -n -v -i # 查看arp缓存 选项说明: -n:不解析ip地址为名称 -v:详细信息 -i:指定操作的接口 -d:删除一个arp条目
hostname:操作该主机的arp条目,除了删除还有其他动作,如手动添加主机的arp条目,此处就不解释该用法了
例如: