一、前言
linux系统是大多数软件运行的首选操作系统。作为Linux系统管理员,日常工作的一大部分时间都是在对数据中心或者机房里的服务器进行配置、维护、问题排查,管理这些服务器和网络。在Linux系统中自带了大量的工具能够帮助我们实现管理的目的。
在这篇文章中,我们主要来介绍几个在网络管理方面用的最多的命令行工具,他们分别用于不同的用途,也会介绍一些通用的使用样例,这些工具会让你在Linux下管理网络更加容易。大家觉得有用可以收藏或转发给其他的朋友。
二、网络配置、排障和调试工具
1、ifconfig命令
ifconfig是用于网络接口配置的命令行工具,也用于在系统启动时初始化网络接口。一旦服务器启动并运行,就使用ifconfig命令为接口分配IP地址,并根据需要启用或禁用该接口。
ifconfig还可以用于查看当前活动接口的IP地址、硬件/mac地址以及MTU(Maximum Transmission Unit,最大传输单元)大小。因此,ifconfig对于调试或执行系统调优非常有用。
下面的例子用于显示所有活动网络接口的状态。
$ ifconfig
enp1s0 Link encap:Ethernet HWaddr 28:d2:44:eb:bd:98
inet addr:192.168.0.103 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::8f0c:7825:8057:5eec/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:169854 errors:0 dropped:0 overruns:0 frame:0
TX packets:125995 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:174146270 (174.1 MB) TX bytes:21062129 (21.0 MB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:15793 errors:0 dropped:0 overruns:0 frame:0
TX packets:15793 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:2898946 (2.8 MB) TX bytes:2898946 (2.8 MB)
如果要显示所有的网络接口,包含在线(up)的或下线(down)的,使用-a 选项。
$ ifconfig -a
如果要给一个网络接口分配一个IP地址,使用下面的命令
$ sudo ifconfig eth0 192.168.56.5 netmask 255.255.255.0
如果要启用一个网络接口,使用下面命令
$ sudo ifconfig up eth0
如果要禁用一个网络接口,使用下面命令
$ sudo ifconfig down eth0
注意:虽然ifconfig是一个很不错的工具,但是现在过时了,有一个更好用的工具就是ip命令。
2、ip命令
ip命令是另一个用于显示和维护路由,网络设备,接口的非常有用的命令行工具。能够代替ifconfig和其他网络命令。
下面的命令显示了网络接口的IP地址和其他相关信息。
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 28:d2:44:eb:bd:98 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.103/24 brd 192.168.0.255 scope global dynamic enp1s0
valid_lft 5772sec preferred_lft 5772sec
inet6 fe80::8f0c:7825:8057:5eec/64 scope link
valid_lft forever preferred_lft forever
3: wlp2s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 38:b1:db:7c:78:c7 brd ff:ff:ff:ff:ff:ff
...
如果要给一个网络接口(eth0)分配一个IP地址,使用如下命令:
$ sudo ip addr add 192.168.56.1 dev eth0
如果要从网络接口(eth0)移除一个IP地址,使用如下命令:
$ sudo ip addr del 192.168.56.15/24 dev eth0
如果要显示内核中的相邻表,使用如下命令:
$ ip neigh
192.168.0.1 dev enp1s0 lladdr 10:fe:ed:3d:f3:82 REACHABLE
3、ifup,ifdown命令
ifup命令用于激活一个网络接口,使得可以接收或传输数据。
$ sudo ifup eth0
ifdown命令可以禁用一个网络接口,禁掉后就不能传输和接收数据了。
$ sudo ifdown eth0
4、ethtool命令
ethtool命令是一个用于查询和修改网络接口控制器参数和设备驱动程序的工具。下面的示例显示了ethtool的用法和查看网络接口参数的命令。
$ sudo ethtool enp0s3
Settings for enp0s3:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: No
Advertised auto-negotiation: Yes
Speed: 1000Mb/s
Duplex: Full
Port: Twisted Pair
PHYAD: 0
Transceiver: internal
Auto-negotiation: on
MDI-X: off (auto)
Supports Wake-on: umbg
Wake-on: d
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes
5、ping命令
ping(Packet INternet Groper)是一个用于测试位于一个网络LAN(Local Area Network)和WAN(Wide Area Network)的两个系统的连通性的工具。使用ICMP(Internet Control Message Protocol)进行通信。
为了测试到另一个节点的连通性,可以提供IP或hostname,例如:
$ ping 192.168.0.103
PING 192.168.0.103 (192.168.0.103) 56(84) bytes of data.
64 bytes from 192.168.0.103: icmp_seq=1 ttl=64 time=0.191 ms
64 bytes from 192.168.0.103: icmp_seq=2 ttl=64 time=0.156 ms
64 bytes from 192.168.0.103: icmp_seq=3 ttl=64 time=0.179 ms
64 bytes from 192.168.0.103: icmp_seq=4 ttl=64 time=0.182 ms
64 bytes from 192.168.0.103: icmp_seq=5 ttl=64 time=0.207 ms
64 bytes from 192.168.0.103: icmp_seq=6 ttl=64 time=0.157 ms
^C
--- 192.168.0.103 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5099ms
rtt min/avg/max/mdev = 0.156/0.178/0.207/0.023 ms
可以指定发送特定数量的ECHO_REQUEST包后退出,使用-c选项:
$ ping -c 4 192.168.0.103
PING 192.168.0.103 (192.168.0.103) 56(84) bytes of data.
64 bytes from 192.168.0.103: icmp_seq=1 ttl=64 time=1.09 ms
64 bytes from 192.168.0.103: icmp_seq=2 ttl=64 time=0.157 ms
64 bytes from 192.168.0.103: icmp_seq=3 ttl=64 time=0.163 ms
64 bytes from 192.168.0.103: icmp_seq=4 ttl=64 time=0.190 ms
--- 192.168.0.103 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3029ms
rtt min/avg/max/mdev = 0.157/0.402/1.098/0.402 ms
6、traceroute命令
traceroute是一个命令行工具,用于跟踪从本地系统到另一个网络系统的完整路径。他会打印到达终端服务器的路径中的跳数,它是另一个易于使用的网络故障排除使用工具。
下面的例子,是跟踪从本地系统到baidu的域名的路由包信息。
$ traceroute www.baidu.com
traceroute to www.baidu.com (182.61.200.7), 30 hops max, 60 byte packets
1 gateway (192.168.159.2) 0.290 ms 0.091 ms 6.320 ms
2 * * *
7、mtr网络诊断工具
mtr是一个现代的命令行网络诊断工具,将ping和traceroute的功能结合到一个诊断工具中。默认情况下,输出是实时更新的,直到按q退出程序。
最简单的方式就是执行mtr,然后提供一个hostname或者IP地址作为参数,如下:
$ mtr baidu.com
localhost.localdomain (0.0.0.0) Thu Jul 16 22:16:20 2020
Keys: Help Display mode Restart statistics Order of fields quit
Packets Pings
Host Loss% Snt Last Avg Best Wrst StDev
1. 192.168.159.2 0.0% 72 0.4 2.8 0.2 38.3 6.2
2. 192.168.1.1 0.0% 72 10.9 4.4 1.2 24.8 4.2
3. 115.183.128.1 0.0% 72 8.1 10.3 2.7 126.7 16.5
4. 218.241.253.153 0.0% 72 24.3 8.3 2.0 59.9 10.7
5. 218.241.253.161
8、route命令
route是一个用于显示和维护Linux系统中IP路由表的命令行工具,主要用于通过网口配置静态路由到特定主机或网络。
可以通过如下命令查看内核IP路由表:
$ route
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 enp0s3
192.168.0.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s3
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
添加默认gateway到一个路由表:
$ sudo route add default gw <gateway-ip>
添加一个网络路由到一个路由表:
$ sudo route add -net <network ip/cidr> gw <gateway ip> <interface>
从路由表中删除特定的路由项:
$ sudo route del -net <network ip/cidr>
9、nmcli命令
nmcli是一个易用的、脚本化的命令行工具,用于报告网络状态,管理网络连接,以及控制NetworkManager。
查看所有网络设备的状态:
$ nmcli dev status
DEVICE TYPE STATE CONNECTION
virbr0 bridge connected virbr0
enp0s3 ethernet connected Wired connection 1
只显示已连接的网络
$ nmcli con show
Wired connection 1 bc3638ff-205a-3bbb-8845-5a4b0f7eef91 802-3-ethernet enp0s3
virbr0 00f5d53e-fd51-41d3-b069-bdfd2dde062b bridge virbr0
三、网络扫描和性能分析工具
1、netstat命令
netstat是一个命令行工具,用于显示如网络连接,路由表,端口统计等信息,对网络排障和性能分析很有帮助。
另外,netstat也是一个基本的网络服务调试工具,用于检测哪个应用监听哪个端口。例如,下面的命令显示了所有的TCP端口,已经哪个应用在监听他们。
$ sudo netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:587 0.0.0.0:* LISTEN 1257/master
tcp 0 0 127.0.0.1:5003 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 1015/dovecot
tcp 0 0 0.0.0.0:143 0.0.0.0:* LISTEN 1015/dovecot
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
netstat也可以查看内核路由表,使用-r选项,和上面的route命令一样的效果。
$ netstat -r
Destination Gateway Genmask Flags MSS Window irtt Iface
default gateway 0.0.0.0 UG 0 0 0 enp0s3
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 enp0s3
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
虽然netstat是一个比较好的工具,但也过时了,可以使用ss命令代替它。
2、ss命令
ss(socket statistics)是一个强大的命令行工具,用于检测套接字。dump套接字统计信息并进行显示,与netstat类型。另外,与其他类似程序相比,它显示了更多的TCP和状态信息。
$ ss -ta
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 *:submission *:*
LISTEN 0 128 127.0.0.1:fmpro-internal *:*
LISTEN 0 100 *:pop3 *:*
LISTEN 0 100 *:imap *:*
LISTEN 0 128 *:sunrpc *:*
LISTEN 0 100 *:urd
如果要显示所有活动的TCP连接以及计时器,运行以下命令:
$ ss -to
3、nc命令
nc(NetCat)也被称为“网络瑞士军刀”,是一个非常强大的工具,用于与TCP,UDP,UNIX域套接字的几乎任何任务。可以打开TCP连接,监听任意的TCP和UDP端口,执行端口扫描等。
也可以将它作为一个简单的TCP代理,用于网络守护进程测试,检查远程端口是否可达等等。此外,还可以使用nc和pv命令在两台计算机之间传输文件。
下面的例子,可以显示如何扫描一个端口列表:
$ nc -zv server2.tecmint.lan 21 22 80 443 3000
也可以指定一个端口范围:
$ nc -zv server2.tecmint.lan 20-90
下面使用nc在源端口3000与server2.tecmint.lan的5000端口之间建立一个TCP连接:
$ nc -p 3000 -w 10 server2.tecmint.lan 5000
4、nmap命令
nmap(Network MApper)是一个为Linux系统和网络管理员准备的一个功能强大、广泛的工具。用于收集有关单个主机的信息或者浏览整个网络。nmap也可以用于执行安全扫描,网络审核和查找远程主机上的开放端口等等。
可以使用hostname或IP地址来扫描主机:
$ nmap baidu.com
Starting Nmap 6.40 ( http://nmap.org ) at 2020-07-17 06:55 CST
Nmap scan report for baidu.com (220.181.38.148)
Host is up (0.00067s latency).
Other addresses for baidu.com (not scanned): 39.156.69.79
Not shown: 998 filtered ports
PORT STATE SERVICE
80/tcp open http
443/tcp open https
Nmap done: 1 IP address (1 host up) scanned in 63.76 seconds
四、DNS查找工具
1、host命令
host命令是一个用于DNS查找的简单实用的工具。他可以将hostname转换为IP地址,或者反过来。
$ host baidu.com
baidu.com has address 220.181.38.148
baidu.com has address 39.156.69.79
baidu.com mail is handled by 10 mx.maillb.baidu.com.
baidu.com mail is handled by 20 mx50.baidu.com.
baidu.com mail is handled by 20 mx1.baidu.com.
baidu.com mail is handled by 20 jpmx.baidu.com.
baidu.com mail is handled by 15 mx.n.shifen.com.
2、dig命令
dig(domain information groper)是另一个用于DNS查找的实用工具。用于查找DNS相关的信息,如A Record, CNAME, MX Record 等
$ dig baidu.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-16.P2.el7_8.6 <<>> baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16725
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 5, ADDITIONAL: 5
;; QUESTION SECTION:
;baidu.com. IN A
;; ANSWER SECTION:
baidu.com. 600 IN A 220.181.38.148
baidu.com. 600 IN A 39.156.69.79
;; AUTHORITY SECTION:
baidu.com. 82983 IN NS dns.baidu.com.
baidu.com. 82983 IN NS ns4.baidu.com.
baidu.com. 82983 IN NS ns3.baidu.com.
baidu.com. 82983 IN NS ns7.baidu.com.
baidu.com. 82983 IN NS ns2.baidu.com.
;; ADDITIONAL SECTION:
dns.baidu.com. 19431 IN A 202.108.22.220
ns2.baidu.com. 9900 IN A 220.181.33.31
ns3.baidu.com. 50234 IN A 112.80.248.64
ns4.baidu.com. 16079 IN A 14.215.178.80
ns7.baidu.com. 40791 IN A 180.76.76.92
;; Query time: 7 msec
;; SERVER: 221.228.225.1#53(221.228.225.1)
;; WHEN: 五 7月 17 06:45:11 CST 2020
;; MSG SIZE rcvd: 229
3、nslookup命令
nslookup也是一个常用的命令行实用工具,可以交互式和非交互式的查询DNS服务器。可以用于查询DNS资源记录,可以找到域的“A”记录(IP地址),如图所示:
$ nslookup baidu.com
Server: 221.228.225.1
Address: 221.228.225.1#53
Non-authoritative answer:
Name: baidu.com
Address: 220.181.38.148
Name: baidu.com
Address: 39.156.69.79
五、网络包分析工具
1、tcpdump命令
tcpdump命令是一个非常强大和广泛实用的命令行网络嗅探器,用于捕获和分析在特定接口上传输或接收的TCP/IP数据包。
要想捕获特定接口上的数据包,可以使用-i选项
$ tcpdump -i enp0s3
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s3, link-type EN10MB (Ethernet), capture size 262144 bytes
09:35:40.287439 IP tecmint.com.ssh > 192.168.0.103.36398: Flags [P.], seq 4152360356:4152360552, ack 306922699, win 270, options [nop,nop,TS val 2211778668 ecr 2019055], length 196
09:35:40.287655 IP 192.168.0.103.36398 > tecmint.com.ssh: Flags [.], ack 196, win 5202, options [nop,nop,TS val 2019058 ecr 2211778668], length 0
09:35:40.288269 IP tecmint.com.54899 > gateway.domain: 43760+ PTR? 103.0.168.192.in-addr.arpa. (44)
09:35:40.333763 IP gateway.domain > tecmint.com.54899: 43760 NXDomain* 0/1/0 (94)
要想捕获特定数量的包,可以使用-c选项:
$ tcpdump -c 5 -i enp0s3
也可以将捕获的包存储到一个外部的文件用于后续的分析,可以使用-w选项指定输出文件。
$ tcpdump -w captured.pacs -i enp0s3
六、总结
对于一个Linux系统或网络管理员来说,在平时工作中对遇到的网络问题进行排障,调试,这些工具基本就够用了。这里只是简单的说明了几个示例,并没有做详细的介绍,后面如果有时间再做详细的介绍,等不急的小伙伴可以下来自己找相关的资料。如果您认为这些信息可以帮助到您,可以将它转发出去,让更多的朋友看到,收藏起来吧,早晚会用到!