Linux网络管理
Posted 徐中祥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux网络管理相关的知识,希望对你有一定的参考价值。
Linux网络管理
一 网卡名字
网卡名称规则
#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 eth
# 确认网线已经连接好,以eth0 为例
[root@egon ~]# mii-tool eth0
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 # 加载网卡配置文件
7、设置网卡最大传输单元
ifconfig eth0 mtu 1500
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
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:全双工与半双工,目前网卡一般都应该采用全双工模式
全双工传输英文写法是:Full-Duplex Transmissions
是指交换机在发送数据的同时也能够接收数据,两者同步进行,这好像我们平时打电话一样,说话的同时也能够听到对方的声音。目前的交换机都支持全双工。
全双工的好处在于迟延小、冲突少、速度快。
与之对应的是【半双工】这个概念:就是指一个时间段内只有一个动作发生,举个简单例子,一天窄窄的马路,同时只能有一辆车通过,当目前有两量车对开,这种情况下就只能一辆先过,等到头儿后另一辆再开,这个例子就形象的说明了半双工的原理。早期的对讲机、以及早期集线器等设备都是实行半双工的产品。随着技术的不断进步,半双工会逐渐退出历史舞台。
// 了解更多全双工与半双工:https://www.cnblogs.com/linhaifeng/articles/13949762.html
# 2、储备知识2:CRC
CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性
// 了解更多:https://www.cnblogs.com/linhaifeng/articles/13949806.html
# 3、储备知识3:网卡工作原理
网卡发包:
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
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服务
NetworkManager作用:是redhat6自带的检测网络、自动连接网络的图形化工具。NetworkManager 服务会干扰网络配置,如:DNS经常会被刷掉,所以通常关闭
[root@egon ~]# systemctl stop NetworkManager
[root@egon ~]# systemctl disable NetworkManager
网卡相关的配置文件:/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
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迭代搜索
永久设置主机名
[root@egon ~]# hostnamectl set-hostname egon.xxx.com
[root@egon ~]# hostname
egon.xxx.com
[root@egon ~]# cat /etc/hostname
egon.xxx.com
端口和服务的对应关系
[root@egon ~]# grep '^ftp\\|^ssh' /etc/services
三 路由route
3.1 交换与路由
交换: 指同网络访问。两台机器连在同一个交换机上,配置同网段的不同ip就可以直接通迅
路由: 指跨网络访问的路径选择
3.2 Linux处理数据包的过程
在解释Linux路由相关的内容时,我们先来了解一下数据包转发功能以及因此涉及到的路由决策,这对理清路由和未来的防火墙有重要帮助。
当向外界主机发送数据时,在它从网卡流入后需要对它做路由决策,根据其目标决定是流入本机的用户空间还是在内核空间就直接转发给其他主机
# 1、如果是流入本机用户空间的数据,
则数据会从内核空间进入用户空间(被应用程序接收并处理);
此时如果本机用户空间的应用程序不需要产生新的数据包对外发送,那便不再涉及到从某个网卡流出数据;
但是如果本机用户空间的应用程序需要产生新的数据包对外发送,那便需要从某个网卡流出数据,但在流出之前,也需要做路由决策:根据目标决定从哪个网卡流出。
# 2、如果不是流入本机用户空间的数据,仅仅只是要经由本机把数据包转发给其他主机
则必然涉及到从某个网卡流出,此时数据包必须从流入网卡完整地转发给流出网卡,这要求Linux主机能够完成这样的转发。但Linux主机默认未开启ip_forward功能,这使得数据包无法转发而被丢弃。
# 3、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----------------------》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的eth0进来的数据包被内核分析时,发现目标地址为本机地址,直接就回应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
[root@egon ~]# ping -c 1 172.16.10.24 # 可以ping通
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 [linux][c/c++]代码片段02
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装
VSCode自定义代码片段14——Vue的axios网络请求封装