linux 系统管理之网络管理

最近在梳理 Linux 知识,发现网络管理的知识既熟悉又陌生,有必要整理一下,加强认识。说它熟悉,是因为我经常使用到它,例如查看服务器 ip,查看网关(路由),网络故障排查等等。那为什么说它陌生呢,因为一直以来,对于网络管理的众多命令,我都是现查现用,解决相关问题时也没有一个清晰的思路。

net-tools VS iproute

老版本 Linux 内核中配置网络功能的工具为 net-tools,包括 ifconfig、route、arp 和 netstat 等命令。
一些较新的 Linux 发行版,如 CentOS/RHEL 7 则抛弃了 net-tools,取而代之的是 iproute2。

下表为替代方案

用途 net-tools iproute2
地址和链路配置 ifconfig ip addr, ip link
路由表 route ip route
arp 表 arp ip neigh
VLAN vconfig ip link
隧道 iptunnel ip tunnel
组播 ipmaddr ip maddr
统计 netstat ss

iproute 常用命令

因为 iproute 是更先进的工具,所以我就只整理和说明它的常见命令,net-tools 的命令请自行学习和使用吧,其实都差不多,不同的命令行工具而已

ip 地址管理

    • 查看分配给所有网卡的 IP 地址:ip addr show
    • 查看分配给指定网卡的 IP 地址:ip addr show eth0
    • 输出结果解释:
    • inet 172.26.1.250/16,172.26.1.250 为 ip,ip 后面多了个 /16,这就表示,前 16 位是网络号,后 16 位是主机号
    • link/ether 08:00:27:7a:16:86 brd ff:ff:ff:ff:ff:ff 称为 MAC 地址,是网卡的物理地址,用16进制,6个字节表示
    • lo 全称是 loopback,也就是回环网卡,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现
    • ip addr 的一些说明
1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:7a:16:86 brd ff:ff:ff:ff:ff:ff
inet 172.26.1.250/16 brd 172.26.255.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::579d:3e94:ff24:5c00/64 scope link noprefixroute
valid_lft forever preferred_lft forever
1
2
3
4
5
6
7
[root@localhost ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:7a:16:86 brd ff:ff:ff:ff:ff:ff
inet 172.26.1.250/16 brd 172.26.255.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::579d:3e94:ff24:5c00/64 scope link noprefixroute
valid_lft forever preferred_lft forever
  1. 增加删除地址
1
2
[root@localhost ~]# ip addr add 192.0.2.1/24 dev eth0
[root@localhost ~]# ip addr del 192.0.2.2/24 dev eth0
  1. 显示接口统计
    TX: 发送(Transmit)数据包个数
    RX: 接收(Receive)数据包个数
1
2
3
4
5
6
7
[root@localhost ~]# ip -s link ls eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:7a:16:86 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
33576691 73137 0 0 0 9
TX: bytes packets errors dropped carrier collsns
2740193 18912 0 0 0 0

网卡和链路配置

  1. 显示链路
    ip link show
    ip link show eth0
1
2
3
4
5
[root@localhost ~]# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether 08:00:27:7a:16:86 brd ff:ff:ff:ff:ff:ff
  1. 修改接口状态
    注意:如果你正在使用 ssh 远程登录,禁用网卡后可能造成连接中断
1
2
[root@localhost ~]# ip link set eth0 up
[root@localhost ~]# ip link set eth0 down

路由表管理

日常工作中不太涉及到路由表的管理,所以这个部分就不详细说了,如果有兴趣可以自行学习网络相关知识 :)

  1. 显示路由表
    ip route show
    ip route show dev eth0
1
2
3
4
[root@localhost ~]# ip route show
default via 172.26.0.1 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
172.26.0.0/16 dev eth0 proto kernel scope link src 172.26.1.250
  1. 增加新路由
1
[root@localhost ~]# ip route add 10.2.2.128/27 dev eth0
  1. 增加默认路由
1
[root@localhost ~]# ip route add default via 192.168.1.1
  1. 修改默认路由
1
[root@localhost ~]# ip route chg default via 192.168.1.2
  1. 删除默认路由
1
[root@localhost ~]# ip route del default

socket 统计

  1. 查看当前服务器的网络连接统计
1
2
3
4
5
6
7
8
9
10
11
[root@localhost ~]# ss -s
Total: 167 (kernel 180)
TCP: 5 (estab 1, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0

Transport Total IP IPv6
* 180 - -
RAW 0 0 0
UDP 3 2 1
TCP 5 3 2
INET 8 5 3
FRAG 0 0 0
  1. 列出 tcp 连接的监听端口及其打开进程

-n, –numeric Do not try to resolve service names.
-p, –processes Show process using socket.
-t, –tcp Display TCP sockets.
-l, –listening Display only listening sockets (these are omitted by default).

1
2
3
4
5
6
[root@localhost ~]# ss -nptl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=1310,fd=13))
LISTEN 0 128 *:22 *:* users:(("sshd",pid=1076,fd=4))
LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=1310,fd=14))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1076,fd=3))

查看网卡物理连接情况

mii-tool eth0

1
2
[root@localhost ~]# mii-tool eth0
eth0: no autonegotiation, 1000baseT-FD flow-control, link ok

网卡名称

当你使用 ip link 查看网卡时, 可能会看到下面这些网卡名字:
eno1 板载⽹卡
ens33 PCI-E网卡
enp0s3 ⽆法获取物理信息的 PCI-E 网卡
CentOS 7 使⽤了一致性⽹络设备命名,以上都不匹配则使用 eth0

CentOS 7 上,由于 systemd 和 udev 引入了一种新的网络设备命名方式 —— 一致网络设备命名(CONSISTENT NETWORK DEVICE NAMING),可以根据固件、拓扑、位置信息来设置固定名字,带来的好处是命名自动化,名字完全可预测,在硬件坏了以后更换也不会影响设备的命名,这样可以让硬件的更换无缝化,带来的不利是新的设备名称比传统的名称更难阅读。另外,不全以 eth 开头的网卡名给批量化操作也带来了不便。

⽹卡命名规则受 biosdevname 和 net.ifnames 两个参数影响

biosdevname net.ifnames 网卡名
默认 0 1 ens33
组合1 1 0 em1
组合2 0 0 eth0

修改网卡名

1、修改grub2启动参数
编辑/etc/sysconfig/grub文件,在GRUB_CMDLINE_LINUX结尾的双引号前加上“net.ifnames=0 biosdevname=0”

1
2
3
4
5
6
7
8
9
[root@localhost ~]# vim /etc/default/grub

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet net.ifnames=0 biosdevname=0"
GRUB_DISABLE_RECOVERY="true"

2、生成新的 GRUB 文件更新 GRUB、内核配置

1
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

3、重命名网卡配置文件

1
[root@localhost ~]# mv /etc/sysconfig/network-scripts/ifcfg-enp0s3 /etc/sysconfig/network-scripts/ifcfg-eth0

注意:如果之前配置了固定IP,还需要将配置文件中的 “NAME=enp0s3” 改成 “NAME=eth0”,如果是自动获取那就不用管了。

4、重启

1
[root@localhost ~]# reboot

网卡配置文件

1
/etc/sysconfig/network-scripts/ifcfg-eth0

网络故障排除命令

当我们在服务器上部署的服务访问不可达时,可以使用下面的命令找到故障发生点:

  • ping 检测当前主机到目标主机的连接是否畅通,ping 不通说明有网络中断,或者目标主机有防火墙设置
  • traceroute 辅助 ping, 如果 ping 的通,但是访问还是有异常,说明网络质量可能有问题。追踪每一跳服务质量
  • mtr 辅助 ping 检查数据包的丢失
  • nslookup 用于查询 DNS 的记录,查询域名解析是否正常
  • telnet 查看某个端口是否可访问
  • tcpdump 抓取流经本机的数据包
  • ss 检查服务的监听范围

ping

0% packet loss 丢包率为 0%
rtt 往返时延

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# ping zhangxi.site
PING zhangxi.site (185.199.110.153) 56(84) bytes of data.
64 bytes from 185.199.110.153 (185.199.110.153): icmp_seq=1 ttl=47 time=41.1 ms
64 bytes from 185.199.110.153 (185.199.110.153): icmp_seq=2 ttl=49 time=43.4 ms
64 bytes from 185.199.110.153 (185.199.110.153): icmp_seq=3 ttl=47 time=44.0 ms
64 bytes from 185.199.110.153 (185.199.110.153): icmp_seq=4 ttl=49 time=57.2 ms
64 bytes from 185.199.110.153 (185.199.110.153): icmp_seq=5 ttl=47 time=51.7 ms
64 bytes from 185.199.110.153 (185.199.110.153): icmp_seq=6 ttl=47 time=47.0 ms
64 bytes from 185.199.110.153 (185.199.110.153): icmp_seq=7 ttl=47 time=56.1 ms
64 bytes from 185.199.110.153 (185.199.110.153): icmp_seq=8 ttl=49 time=51.3 ms
64 bytes from 185.199.110.153 (185.199.110.153): icmp_seq=9 ttl=49 time=55.0 ms
64 bytes from 185.199.110.153 (185.199.110.153): icmp_seq=10 ttl=47 time=61.8 ms
^C
--- zhangxi.site ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9021ms
rtt min/avg/max/mdev = 41.101/50.913/61.846/6.471 ms

traceroute

traceroute -w 1
-w 设置等待远端主机回报的时间
*** 表示该主机不支持追踪

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
[root@localhost ~]# yum install traceroute -y

[root@localhost ~]# traceroute -w 1 zhangxi.site
traceroute to zhangxi.site (185.199.110.153), 30 hops max, 60 byte packets
1 gateway (172.26.0.1) 3.917 ms 3.805 ms 3.741 ms
2 10.0.0.1 (10.0.0.1) 3.631 ms 3.492 ms 3.253 ms
3 223.71.45.205 (223.71.45.205) 3.423 ms 3.531 ms 3.389 ms
4 * * *
5 * 221.183.14.245 (221.183.14.245) 5.159 ms 221.183.14.237 (221.183.14.237) 4.169 ms
6 221.176.16.214 (221.176.16.214) 5.018 ms 4.488 ms 221.176.16.194 (221.176.16.194) 9.000 ms
7 221.183.25.202 (221.183.25.202) 8.966 ms 221.183.10.37 (221.183.10.37) 9.032 ms 8.952 ms
8 221.183.55.109 (221.183.55.109) 28.258 ms 221.183.55.113 (221.183.55.113) 16.193 ms 221.183.55.109 (221.183.55.109) 36.072 ms
9 223.120.22.22 (223.120.22.22) 37.979 ms 36.484 ms *
10 223.120.2.1 (223.120.2.1) 43.366 ms 223.120.2.81 (223.120.2.81) 39.785 ms 223.120.2.9 (223.120.2.9) 43.274 ms
11 223.120.2.118 (223.120.2.118) 41.885 ms 223.120.2.42 (223.120.2.42) 42.853 ms 43.510 ms
12 63-217-16-189.static.pccwglobal.net (63.217.16.189) 42.911 ms 223.120.2.118 (223.120.2.118) 42.755 ms 42.736 ms
13 63-217-16-189.static.pccwglobal.net (63.217.16.189) 44.668 ms * *
14 * * 63.218.174.117 (63.218.174.117) 45.445 ms
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *

mtr

网络连通性判断工具,它结合了 ping, traceroute, nslookup 的相关特性

1
2
3
4
5
6
                                                                    My traceroute  [v0.85]
localhost.localdomain (::) Wed Oct 23 14:54:29 2019
Resolver error: No error returned but no answers given. of fields quit
Packets Pings
Host Loss% Snt Last Avg Best Wrst StDev
1. localhost 0.0% 9 0.1 0.8 0.1 5.8 1.7

nslookup

查询 DNS 的记录,查询域名解析是否正常,在网络故障时用来诊断网络问题

1
2
3
4
5
6
7
[root@localhost ~]# nslookup zhangxi.site
Server: 10.0.0.1
Address: 10.0.0.1#53

Non-authoritative answer:
Name: zhangxi.site
Address: 185.199.110.153

telnet

查看某个端口是否可访问

1
2
3
4
[root@localhost ~]# telnet zhangxi.site 80
Trying 185.199.110.153...
Connected to zhangxi.site.
Escape character is '^]'.

tcpdump

网络抓包工具
-i any 任意网卡
-n Don’t convert host addresses to names.

1
tcpdump -i any -n port 80

⽹络服务管理

系统与服务管理器

systemdsysVinit 都是系统的 init 进程(系统启动程序)
参考资料:
systemd 与 sysVinit 彩版对照表
CentOS7 中 systemctl 的使用

对应的网络服务管理就有下面两类:

  1. 在 systemd 下,可以直接使用 systemctl 进行管理
    启动:systemctl start NetworkManger
    关闭:systemctl stop NetworkManager
    开机启动:systemctl enable NetworkManger
    查看是否开机启动:systemctl is-enabled NetworkManager
    禁用开机启动:systemctl disable NetworkManager

  2. 在 sysVinit 下,可以用 service 和 chkconfig 进行管理:
    启动:service NetworkManager start
    关闭:service NetworkManager stop
    开机启动:chkconfig NetworkManager on
    禁用开机启动:chkconfig NetworkManager off

网络管理工具

在 CentOS 系统上,目前有 NetworkManagernetwork 两种网络管理工具。如果两种都配置会引起冲突,而且 NetworkManager 在网络断开的时候,会清理路由,如果一些自定义的路由,没有加入到 NetworkManager 的配置文件中,路由就被清理掉,网络连接后需要自定义添加上去。另外,目前在 CentOS 上的 NetworkManager 版本比较低,而且比较适合有桌面环境的系统,所以服务器上保留 network 服务即可,将 NetworkManager 关闭,并且禁止开机启动

  1. systemd 管理上:
1
2
3
4
5
6
7
8
[root@localhost ~]# systemctl status NetworkManager
[root@localhost ~]# systemctl stop NetworkManager
[root@localhost ~]# systemctl disable NetworkManager
Removed /etc/systemd/system/multi-user.target.wants/NetworkManager.service.
Removed /etc/systemd/system/dbus-org.freedesktop.NetworkManager.service.
Removed /etc/systemd/system/dbus-org.freedesktop.nm-dispatcher.service.

[root@localhost ~]# systemctl is-enabled NetworkManager

通过上边的操作,可以看到关联的几个服务一起被禁用了。如果使用桌面的话,会发现网络管理的图标不见了。

  1. sysv+upstart管理上:
1
2
[root@localhost ~]# service NetworkManager stop
[root@localhost ~]# chkconfig NetworkManger off