Featured image of post Linux基础(九):网络管理

Linux基础(九):网络管理

网卡、基本网络配置、网关路由、常用网络命令

netstat 查看网络状态

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
[root@tianyun ~]# netstat -tnlp  # 查看正在监听的,且使用tcp协议的进程
-t   tcp协议
-u   udp协议
-l   listen
-p   进程信息 PID/Program name
-n   不反解,不将IP地址解析为主机名,不将端口号解析成协议名(80 ---> http)


[root@localhost ~]# netstat -an |grep :22
[root@localhost ~]# netstat -an |grep :80
[root@localhost ~]# lsof -i:22

-a  显示所有连接(包括监听和非监听)

常用组合 
netstat -tunalp

proc 文件系统

top命令统计的cpu状态信息就是从/proc/stat中取,系统所有进程的运行状态都在/proc下

文件/目录 说明
/proc/cpuinfo CPU 详细信息(型号、核心数、频率、缓存等)
/proc/meminfo 内存使用情况(总内存、空闲内存、缓存、Swap 等)
/proc/version 内核版本和 GCC 编译版本
/proc/loadavg 系统负载(1/5/15 分钟的平均负载,运行中的进程数/总进程数)
/proc/filesystems 当前内核支持的文件系统类型(如 ext4、xfs、proc 等)
/proc/mounts 当前挂载的文件系统(等效于 mount 命令输出)
/proc/diskstats 磁盘 I/O 统计信息(读写次数、扇区数等)
/proc/net/ 网络相关数据(如 net/tcpnet/udpnet/route 等)
/proc/sys/ 内核运行时参数(可通过 sysctl 修改,如 vm.swappiness
/proc/interrupts 中断请求(IRQ)分配情况
/proc/ioports 当前使用的 I/O 端口范围
/proc/modules 已加载的内核模块(等效于 lsmod 命令)
/proc/stat 系统综合统计(CPU 使用率、上下文切换次数、启动时间等)
/proc/uptime 系统运行时间(单位:秒)和空闲时间
/proc/devices 已注册的字符设备和块设备列表
/proc/cmdline 内核启动时传递的参数
/proc/swaps Swap 分区使用情况
/proc/partitions 磁盘分区信息(主设备号、次设备号、块数等)
1
2
3
4
5
6
7
8
9

需要注意当卸载/proc后
umount /proc -l

# 下述命令都不可用
free -m
uptime
lscpu
top

进程间通信 管道

管道操作符号 “|” ,主要用来连接左右两个命令, 将左侧的命令的标准输出, 交给右侧命令的标准输入

PS: 无法传递标准错误输出至后者命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 统计当前/etc/passwd中用户使用的shell类型
awk -F: '{print $7}' /etc/passwd | sort |uniq -c

# 统计网站的访问情况
netstat -an |grep :80 |awk -F":" '{print $8}'|sort |uniq -c

# 打印当前所有IP
ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'

# 打印根分区已用空间的百分比(仅打印数字)
df -P|grep '/$' |awk '{print $5}'|awk -F"%" '{print $1}'

# 统计网站的访问最多的ip top 10
awk '{print $1}' access.log |sort |uniq -c |sort -rn|head -n 10

管道中的tee技术

tee -a # 追加 重定向与 tee 在使用过程中有什么区别

1
2
3
date > date.txt # 直接将内容写入date.txt文件中

date |tee date.txt # 命令执行会输出至屏幕,但会同时保存一份至date.txt文件中

xargs 参数传递

主要让一些不支持管道的命令可以使用管道技术

1
2
3
4
5
6
7
which cat|xargs ls -l
 
ls |xargs rm -fv
 
ls |xargs cp -rvt /tmp/ -或-> ls | xargs -I {} cp -rv {} /tmp/
 
ls |xargs mv -t /tmp/ -或-> ls | xargs -I {} mv {} /tmp

网卡

网卡名字

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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
 2
 3
 4
 5
 6
 7
 8
 9
10
# 查看当前系统所连接的所有以太网卡
[root@localhost ~]# lspci |grep -i ethernet
 
# 确认网线已经连接好,以eth0 为例
[root@localhost ~]# mii-tool eth0  # 该命令需要安装有net-tools才能用
eth0:negotiated 1000baseT-FD flow-control,link ok # link ok网卡能够被识别,并且接了有效的网线
 
[root@localhost ~]# mii-tool eth1
SIOCGMIIPHY on 'eth1' failed: Invalid argument
网卡虽然能够被识别(网卡已经被驱动了,但不能用:网卡配置错误,网线没接等)

ifconfig 命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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

ifconfg 命令查看到的结果解释

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@localhost ~]# 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 冲突数

基本网络配置

centos 7.9

使用 network 服务,相关配置文件

网卡的配置文件

/etc/sysconfig/network-scripts/ifcfg-ethX

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 打开网卡配置文件,完成静态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 配置文件

  • /etc/resolv.conf DNS解析文件
1
2
3
[root@localhost ~]# cat /etc/resolv.conf # 设置DNS指向,最多3个  
nameserver 8.8.8.8 # 对应网卡配置文件中的配置项DNS1  
nameserver 192.168.12.1 # 对应网卡配置文件中的配置项DNS2
  • /etc/hosts 本地名称解析文件,优先于DNS dns检索优先级
    浏览器DNS缓存->本地系统DNS缓存->本地计算机HOSTS文件->ISP DNS缓存->递归or迭代搜索

在NetworkManager服务开启的情况下,你在centos7中也可以用nmcli命令,使用该命令修改的就是 /etc/sysconfig/network-scripts下的文件 而在centos9中修改的则是/etc/NetworkManager/system-connections/下的文件

centos 9

centos9中使用NetworkManager服务,与该服务相关的配置文件 用命令直接设置静态ip,不用改配置文件,非常方便

1
2
3
4
5
6
7
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
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
# 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不变
[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```

## 路由 route
### 路由与交换
**路由**: 指跨网络访问的路径选择
**交换**: 指同网络访问。两台机器连在同一个交换机上,配置同网段的不同ip就可以直接通迅 (这里不讨论三层交换).
### Linux 处理数据包的过程
当向外界主机发送数据时,数据从网卡流入后需要对它做路由决策,根据其目标决定是流入本机的用户空间还是在内核空间就直接转发给其他主机
1、如果是流入本机用户空间的数据,
则数据会从内核空间进入用户空间 (被应用程序接收并处理)此时如果本机用户空间的应用程序不需要产生新的数据包对外发送,那便不再涉及到从某个网卡流出数据;
但是如果本机用户空间的应用程序需要产生新的数据包对外发送,那便需要从某个网卡流出数据,但在流出之前,也需要做路由决策:根据目标决定从哪个网卡流出。
 
2、如果不是流入本机用户空间的数据,仅仅只是要经由本机把数据包转发给其他主机
则必然涉及到从某个网卡流出,此时数据包必须从流入网卡完整地转发给流出网卡,这要求 Linux 主机能够完成这样的转发。但 Linux 主机默认未开启 ip_forward 功能,这使得数据包无法转发而被丢弃。

临时开启linux主机的路由转发功能,重启网络服务则失效:
```bash
# 方式1:
echo 1 > /proc/sys/net/ipv4/ip_forward
 
# 方式2:
sysctl -w net.ipv4.ip_forward=1

linux处理数据包过程

若要永久生效,则应该写入配置文件

1
2
3
4
5
6
7
# 在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

查看是否开启转发功能

1
2
3
sysctl net.ipv4.ip_forward
cat /proc/sys/net/ipv4/ip_forward
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的路由,这个路由可以是默认路由、网络路由、主机路由都行,只要路由能匹配上保证数据包能送出去就行,否则内核层面发现本机匹配不到路由就会直接在本机就把包扔了

网关/路由 (⭐)

Linux上分为3种路由:

  • 主机路由:掩码位32位,Destination精确到某一台主机,直接指明到某台具体的主机怎么走,主机路由也就是所谓的静态路由
  • 网络路由:掩码小于32位,Destination精确到某一个网段的主机,指明到某类网络怎么走
  • 默认路由:掩码通常为0,不走主机路由的和网络路由的、全部都走默认路由。操作系统上设置的默认路由一般也称为网关。 路由是区分优先级的:若Linux上到某主机有多条路由可以选择,这时候会挑选优先级高的路由 主机范围越小、越精确、优先级越高,而缩小主机范围的恰恰就是子网掩码,掩码越长范围越小、越精确、优先级越高

route 命令

需要安装 net-tools route命令用于显示和管理路由表。当使用了add或del选项时,route命令将设置路由条目,否则route命令将显示路由表。 要显示路由表信息,只需简单的route -n即可,其中-n选项表示不解析主机名。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
[root@localhost ~]# 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 表示路由项指向一个主机,而非整个网络

管理路由表

操作类型 命令示例 说明
查看路由表 route -n 以数字格式显示路由表(不解析主机名),包含目标网络、网关、子网掩码、接口等信息。
添加网络路由 sudo route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.1 eth0 指定目标网络、子网掩码、网关和网卡,将流量路由到特定子网。
添加默认网关 sudo route add default gw 192.168.1.1 设置默认路由,所有未匹配的流量通过此网关转发。
删除特定路由 sudo route del -net 192.168.2.0 netmask 255.255.255.0 删除指定目标网络和子网掩码的路由规则。
删除默认网关 sudo route del default 移除当前默认网关配置。

修改临时生效,重启后丢失 想要永久生效需将路由规则写入配置文件(如 /etc/network/interfaces 或通过 netplan / nmcli 工具)

配置永久路由

centos 7.9

根据接口创建路由配置文件/etc/syconfig/network-scripts/route-ethX,要从那个接口出去X就是几。

路由配置文件的配置格式非常简单,每一行一个路由条目,先是要到达的目标,然后是via关键字,最后是下一跳地址。要求下一跳必须能到达,且一般都和ethX同网段。

DEST via nexthop

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#默认路由
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服务即可立即生效 systemctl restart network 需要注意:

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

(2).如果在文件中配置永久默认路由,则必须保证所有使用了DHCP服务的网卡配置文件ifcfg-ethX中的DEFROUTE指令设置为”no”,表示DHCP不设置默认路由。

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

centos 9

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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

网络命令补充

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
arp -n -v -i           # 查看arp缓存
 
选项说明:
-n:不解析ip地址为名称
-v:详细信息
-i:指定操作的接口
-d:删除一个arp条目


arping 
用于发送arp请求报文,解析并获取目标地址的MAC。默认将先发送广播报文,收到回复后再发送单播报文,局域网内所有主机都能收到广播报文,但只有目标主机才会回复自己的MAC地址。

ip 命令
ip addr

ip addr show

ip route

网络问题排查思路

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
## 定位网络问题工具
mii-tool   eth0 # 判断物理网卡是否接了网线
ping命令
telnet 目标ip 端口
tcpdump + wireshark抓包分析

## 测试网络连通性
1、判断网卡是否能识别,是否接了有效的网线
mii-tool   eth0 # 判断物理网卡是否接了网线
有可能明明连接了有效的网线,但是还是看不到link ok,可以先确定网卡配置文件是正确的,并且ONBOOT=yes ,然后重启network服务(systemctl restart network )

2、**ping 127.0.0.1**
通,代表系统能够支持tcp/ip通信。
不通,原因: 相关驱动损坏或者没有。防火墙iptables拦截了。

3、**ping 网卡的ip**
假设eth0配置10.1.1.22
ping 10.1.1.22

通,说明网卡是能够正常工作
不通,可能是网卡驱动工作不正常,或iptables防火墙问题。
或者是网卡未激活,可以尝试重启网络服务

4、**ping 网关**
不通
原因: 网关有问题,或者IP冲突

解决方法:ping 同一个网段中其他IP,或者用其他计算机也ping网关,如果能通,那就是自己机器的原因了

5、**ping 外网(IP或域名)**
# ping 外网IP
通,只能说明通信没问题,网关是ok的。
不通,很可能就是网关无法联网

# ping 域名
如果连域名对应的IP都无法返回,说明域名解析失败,原因:DNS设定有问题。

7、**ping的错误类型**

**network unreachable (网络不可达): 一般没有设定正确的网关**
**unknow host xxxx : 设定DNS无效**

======================>Ping命令返回错误信息说明<======================
# 1.Request timed out
这是大家经常碰到的提示信息,很多文章中说这是对方机器置了过滤ICMP数据包,从上面工作过程来看,这是不完全正确的,至少有下几种情况。
(1) 对方已关机,或者网络上根本没有这个地址:比如在上图中主机A中PING 192.168.0.7 ,或者主机B关机了,在主机A中PING 192.168.0.5 都会得到超时的信息。
(2)对方与自己不在同一网段内,通过路由也无法找到对方,但有时对方确实是存在的,当然不存在也是返回超时的信息。
(3)对方确实存在,但设置了ICMP数据包过滤(比如防火墙设置)。
怎样知道对方是存在,还是不存在呢,可以用带参数 -a 的Ping命令探测对方,如果能得到对方的NETBIOS名称,则说明对方是存在的,是有防火墙设置,如果得不到,多半是对方不存在或关机,或不在同一网段内。
(4)错误设置IP地址
正常情况下,一台主机应该有一个网卡,一个IP地址,或多个网卡,多个IP地址(这些地址一定要处于不同的IP子网)。但如果一台电脑的“拨号网络适配器”(相当于一块软网卡)的TCP/IP设置中,设置了一个与网卡IP地址处于同一子网的IP地址,这样,在IP层协议看来,这台主机就有两个不同的接口处于同一网段内。当从这台主机Ping其他的机器时,会存在这样的问题:
A.主机不知道将数据包发到哪个网络接口,因为有两个网络接口都连接在同一网段。
B.主机不知道用哪个地址作为数据包的源地址。因此,从这台主机去Ping其他机器,IP层协议会无法处理,超时后,Ping 就会给出一个“超时无应答”的错误信息提示。但从其他主机Ping这台主机时,请求包从特定的网卡来,ICMP只须简单地将目的、源地址互换,并更改一些标志即可,ICMP应答包能顺利发出,其他主机也就能成功Ping通这台机器了。

# 2.Destination host Unreachable
(1) 对方与自己不在同一网段内,而自己又未设置默认的路由,比如上例中A机中不设定默认的路由,运行Ping192.168.0.1.4就会出现“Destination host Unreachable”。
(2)网线出了故障
这里要说明一下“destination host unreachable”和 “time out”的区别,如果所经过的路由器的路由表中具有到达目标的路由,而目标因为其他原因不可到达,这时候会出现“time out”,如果路由表中连到达目标的路由都没有,那就会出现“destination host unreachable”。

# 3.Bad IP address
这个信息表示您可能没有连接到DNS服务器,所以无法解析这个IP地址,也可能是IP地址不存在。

# 4.Source quench received
这个信息比较特殊,它出现的机率很少。它表示对方或中途的服务器繁忙无法回应。

# 5.Unknown host——不知名主机
这种出错信息的意思是,该远程主机的名字不能被域名服务器(DNS)转换成IP地址。故障原因可能是域名服务器有故障,或者其名字不正确,或者网络管理员的系统与远程主机之间的通信线路有故障。

# 6.No answer——无响应
这种故障说明本地系统有一条通向中心主机的路由,但却接收不到它发给该中心主机的任何信息。故障原因可能是下列之一:中心主机没有工作;本地或中心主机网络配置不正确;本地或中心的路由器没有工作;通信线路有故障;中心主机存在路由选择问题。

# 7.Ping 127.0.0.1
127.0.0.1是本地循环地址.如果本地址无法Ping通,则表明本地机TCP/IP协议不能正常工作。

# 8.no rout to host
网卡工作不正常。

# 9.transmit failed,error code:10043
网卡驱动不正常。

# 10.unknown host name
DNS配置不正确
使用 Hugo 构建
主题 StackJimmy 设计