14 个有用的 Linux 网络命令
已发表: 2015-02-15配置、监控和保护网络是系统管理员工作的重要组成部分。 在管理 Linux 网络时,有许多可用的命令和实用程序。
有时联网系统会失败。 您作为管理员需要诊断和解决问题。 监控有助于检测问题并在事情失控之前解决问题。 监控安全和性能也是管理员活动的重要组成部分。
这里我们讨论一些常用的管理 Linux 网络的命令。
知识产权
iproute2 包中包含用于网络和路由配置的 IP 命令。 这取代了传统的ifconfig
和route
命令。
ip
采用第二个参数,指定您希望对其执行命令和操作(如添加、删除或显示)的对象。
ip链接
ip link
用于配置、添加和删除网络接口。 使用ip link show
命令显示系统上的所有网络接口:
$ ip link show 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 02:35:97:08:6b:2a brd ff:ff:ff:ff:ff:ff 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 08:00:27:6f:60:ff brd ff:ff:ff:ff:ff:ff
您可以看到ip link
的手册页:
$ man ip-link
IP地址
使用 ip address 命令显示地址、绑定新地址或删除旧地址。 手册页 ip address 命令被命名为 ip-address。
例如,以下命令显示分配给网络接口 enp0s8 的 IP 地址:
ip address show dev enp0s8 3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:6f:60:ff brd ff:ff:ff:ff:ff:ff inet 10.0.0.51/24 brd 10.0.0.255 scope global enp0s8 ...
ip路由
使用 IP 路由打印或显示路由表。 以下命令显示路由表的内容:
$ ip route show default via 10.0.2.2 dev enp0s3 10.0.0.0/24 dev enp0s8 proto kernel scope link src 10.0.0.51 10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15
地图
虽然 Nmap 已在许多电影中使用,但The Matrix Reloaded (维基百科、 IMDB 、亚马逊)将 Nmap 变成了电影明星!
Nmap(“Network Mapper”)是一个用于网络发现、安全审计和管理的强大实用程序。 许多系统管理员使用它来确定他们的哪些系统在线,以及用于操作系统检测和服务检测。
默认的 Nmap 扫描显示端口、它们的状态(打开/关闭)和协议。 它向 1000 个最常见的端口发送数据包并检查响应。
$ nmap 10.0.0.50 Starting Nmap 7.01 ( https://nmap.org ) at 2020-09-07 10:32 UTC Nmap scan report for 10.0.0.50 Host is up (0.00077s latency). Not shown: 997 filtered ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 3306/tcp closed mysql
要检查您网络上的哪些主机已启动:
$ nmap -sn 10.0.0.0/24 Starting Nmap 7.01 ( https://nmap.org ) at 2020-09-07 11:59 UTC Nmap scan report for 10.0.0.1 Host is up (0.00084s latency). Nmap scan report for 10.0.0.50 Host is up (0.0021s latency). Nmap scan report for 10.0.0.51 Host is up (0.00026s latency). Nmap done: 256 IP addresses (3 hosts up) scanned in 2.61 seconds
使用 -O 标志来识别主机正在运行的操作系统。
$ sudo nmap 10.0.0.50 -O Starting Nmap 7.01 ( https://nmap.org ) at 2020-09-07 13:44 UTC Nmap scan report for 10.0.0.50 Host is up (0.00053s latency). ... Running: Linux 3.X OS CPE: cpe:/o:linux:linux_kernel:3 OS details: Linux 3.10 - 3.19 Network Distance: 1 hop OS detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 21.95 seconds
提醒一句:没有人喜欢他们的系统通过互联网被扫描。 因此,在您这样做之前,请先征得许可。
你也可以在 Windows 上使用 Nmap,查看这个安装指南。
平
使用 ping 查看主机是否处于活动状态。 这个超级简单的命令可以帮助您检查主机或网段的状态。 Ping 命令向目标主机发送一个 ICMP ECHO_REQUEST 数据包,并等待它是否回复。
但是,某些主机使用防火墙阻止 ICMP 回显请求。 互联网上的一些网站也可能这样做。
默认情况下,ping 在无限循环中运行。 要发送定义数量的数据包,请使用-c
标志。
$ ping -c 3 google.com PING google.com (172.217.167.238): 56 data bytes 64 bytes from 172.217.167.238: icmp_seq=0 ttl=118 time=7.898 ms 64 bytes from 172.217.167.238: icmp_seq=1 ttl=118 time=7.960 ms 64 bytes from 172.217.167.238: icmp_seq=2 ttl=118 time=6.247 ms --- google.com ping statistics --- 3 packets transmitted, 3 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 6.247/7.368/7.960/0.793 ms
带有 -o 标志的 ping 在收到一个回复数据包后成功退出。
$ ping -o google.com PING google.com (172.217.167.46): 56 data bytes 64 bytes from 172.217.167.46: icmp_seq=0 ttl=118 time=7.540 ms --- google.com ping statistics --- 1 packets transmitted, 1 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 7.540/7.540/7.540/0.000 ms
您可以使用-n
标志来避免反向 DNS 查找。 ICMP 序列号特别重要。 序列号中断表示丢失的数据包。
ping 失败可能是由于
- 网络故障
- 宿主不在世
- 防火墙阻止 ICMP ECHO 请求
您还可以执行在线 ping 测试以检查来自世界不同地区的连接。
iPerf
当 ping 验证主机的可用性时,iPerf 帮助分析和测量两台主机之间的网络性能。 使用 iPerf,您可以打开两台主机之间的连接并发送一些数据。 然后 iPerf 显示两台主机之间的可用带宽。
您可以使用分发包管理器安装 iPerf。 例如,在基于 Ubuntu 的发行版上,您可以像这样安装:
$ sudo apt install iperf -y
在两台机器上安装 iPerf 后,在其中一台机器上启动 iPerf 服务器。 以下示例在 IP 地址为 10.0.0.51 的主机上启动 iPerf 服务器。
$ iperf -s ------------------------------------------------------------ Server listening on TCP port 5001 TCP window size: 85.3 KByte (default) ------------------------------------------------------------
在第二台机器上使用 -c 标志启动 iPerf。 这与服务器连接并发送一些数据。
$ iperf -c 10.0.0.51 ------------------------------------------------------------ Client connecting to 10.0.0.51, TCP port 5001 TCP window size: 85.0 KByte (default) ------------------------------------------------------------ [ 3] local 10.0.0.50 port 42177 connected with 10.0.0.51 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 1.13 GBytes 972 Mbits/sec
iPerf 会在几秒钟内返回带宽结果。
追踪路线
如果 ping 显示丢失数据包,您应该使用 traceroute 来查看数据包采用的路由。 Traceroute 显示了数据包到达目的地所经过的网关序列。 例如,从我的机器到 google.com 的 traceroute 显示如下:
$ traceroute google.com traceroute to google.com (172.217.167.46), 64 hops max, 52 byte packets 1 dlinkrouter.dlink (192.168.0.1) 5.376 ms 2.076 ms 1.932 ms 2 10.194.0.1 (10.194.0.1) 5.190 ms 5.125 ms 4.989 ms 3 broadband.actcorp.in (49.207.47.201) 7.165 ms 5.749 ms 5.755 ms 4 broadband.actcorp.in (49.207.47.225) 5.918 ms * 8.483 ms ... 9 108.170.251.97 (108.170.251.97) 6.359 ms del03s16-in-f14.1e100.net (172.217.167.46) 5.448 ms 108.170.251.97 (108.170.251.97) 6.400 ms
此输出中的第 4 行在往返时间中显示 *。 这表示未收到任何响应。 这可能是由多种原因造成的——由于跟踪路由 ICMP 数据包的优先级较低,因此这些数据包可能会被路由器丢弃。 或者可能只是拥塞。 如果您在给定网关的所有时间字段中看到 *,则网关可能已关闭。
许多基于 Web 的路由跟踪工具允许您执行反向路由跟踪,即从网站到您的主机。 您可以在 traceroute.org 或 Geekflare Traceroute 上查看这些内容。
转储
tcpdump 是一种数据包嗅探工具,在解决网络问题时可以提供很大的帮助。 它侦听网络流量并根据您定义的标准打印数据包信息。
例如,您可以检查发送到或来自特定主机的所有数据包,本例中为 Ubuntu18:
$ sudo tcpdump host ubuntu18 -n -c 5 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 14:12:11.509092 IP 10.0.0.4.22 > 183.83.208.234.9633: Flags [P.], seq 2991049004:2991049112, ack 2956233368, win 501, options [nop,nop,TS val 292041322 ecr 405604219], length 108 14:12:11.509146 IP 10.0.0.4.22 > 183.83.208.234.9633: Flags [P.], seq 108:252, ack 1, win 501, options [nop,nop,TS val 292041322 ecr 405604219], length 144 14:12:11.509218 IP 10.0.0.4.22 > 183.83.208.234.9633: Flags [P.], seq 252:288, ack 1, win 501, options [nop,nop,TS val 292041322 ecr 405604219], length 36 14:12:11.509259 IP 10.0.0.4.22 > 183.83.208.234.9633: Flags [P.], seq 288:500, ack 1, win 501, options [nop,nop,TS val 292041322 ecr 405604219], length 212 14:12:11.509331 IP 10.0.0.4.22 > 183.83.208.234.9633: Flags [P.], seq 500:768, ack 1, win 501, options [nop,nop,TS val 292041322 ecr 405604219], length 268 5 packets captured 6 packets received by filter 0 packets dropped by kernel
默认情况下,tcpdump 将 IP 地址解析为主机名。 如果您不希望 tcpdump 执行名称查找,请使用-n
标志。

tcpdump 输出为每个数据包打印一行。 使用-c
标志限制输出,在上例中为 5。
tcpdump 对于解决网络问题和识别潜在问题很有用。 偶尔在您的网络上运行 tcpdump 以验证一切是否正常是个好主意。
网络统计
Netstat 命令用于检查网络连接、路由表以及各种网络设置和统计信息。
使用-i
标志列出系统上的网络接口。
这是一个例子:
$ netstat -i Kernel Interface table Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 0 4001 0 0 0 2283 0 0 0 BMRU eth1 1500 0 27154 0 0 0 838962 0 0 0 BMRU lo 65536 0 0 0 0 0 0 0 0 0 LRU
使用-r
标志将显示路由表。 这显示了为发送网络数据包配置的路径。
$ netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default 10.0.2.2 0.0.0.0 UG 0 0 0 eth0 10.0.0.0 * 255.255.255.0 U 0 0 0 eth1 10.0.2.0 * 255.255.255.0 U 0 0 0 eth0
最后两行中的星号表示不需要网关就可以将数据包发送到这些网络上的任何主机。 此主机直接连接到网络 10.0.0.0 和 10.0.2.0。
在第一行中,destination 是 default,这意味着发往未在此表中列出的网络的任何数据包都由路由器 10.0.2,2 处理。
不带任何选项的 netstat 命令显示打开的套接字列表。 使用-l
标志仅显示侦听套接字,默认情况下不显示。 您可以使用 -a 标志来显示监听和非监听套接字。 这是一个例子:
$ netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:ssh *:* LISTEN tcp 0 36 10.0.2.15:ssh 10.0.2.2:51017 ESTABLISHED tcp6 0 0 [::]:ssh [::]:* LISTEN udp 0 0 *:bootpc *:* Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 3 [ ] DGRAM 8186 /run/systemd/notify ...
更多 Netstat 命令示例在这里
SS
Linux 安装有很多默认运行的服务。 这些应该被禁用或最好被删除,因为这有助于减少攻击面。 您可以使用 netstat 命令查看正在运行的服务。 虽然 netstat 仍然可用,但大多数 Linux 发行版正在过渡到ss
命令。
使用带有-t
和-a
标志的 ss 命令列出所有 TCP 套接字。 这会显示监听和非监听套接字。
$ ss -t -a State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:sunrpc *:* LISTEN 0 128 *:http *:* LISTEN 0 128 *:ssh *:* LISTEN 0 128 *:60031 *:* ESTAB 0 0 10.0.2.15:ssh 10.0.2.2:51699 ESTAB 0 0 10.0.2.15:ssh 10.0.2.2:51049 LISTEN 0 128 :::sunrpc :::* LISTEN 0 128 :::http :::* LISTEN 0 128 :::ssh :::* LISTEN 0 128 :::54715 :::*
仅显示状态已建立的 TCP 连接:
ss -a -t -o state established Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 10.0.2.15:ssh 10.0.2.2:51699 timer:(keepalive,23min,0) 0 0 10.0.2.15:ssh 10.0.2.2:51049 timer:(keepalive,114min,0)
ssh
ssh 使您能够通过 Internet 与远程主机安全连接。 早期的 rlogin 和 telnet 用于连接和管理远程主机。 然而,两者都存在一个根本缺陷,即它们以明文形式发送包括登录名和密码在内的所有信息。
ssh 通过以下两个功能启用 Internet 上的安全通信:
- 它确认远程主机是它所说的那个人。
- 它加密主机之间的所有通信。
要连接到远程主机,您需要在远程主机上运行 OpenSSH 服务器。 您可以使用分发包管理器安装它。 例如在 Ubuntu 上你可以这样安装它:
$ sudo apt install openssh-server
以下示例显示了如何使用 ssh 命令连接到远程主机 10.0.0.50:
me@ubuntu-xenial:~$ ssh 10.0.0.50 The authenticity of host '10.0.0.50 (10.0.0.50)' can't be established. ECDSA key fingerprint is SHA256:s2tNJQa/C1/W0SevGm7Rt3xoBZG1QL5yT3ff/+PMpnY. Are you sure you want to continue connecting (yes/no)? yes
您收到一条消息,指出无法确定主机 10.0.0.50 的真实性,这是因为这是第一次与 10.0.0.50(服务器)建立连接,而 ssh 客户端之前从未见过此远程主机。 输入 yes 继续连接。 建立连接后,系统会提示您输入密码:
Warning: Permanently added '10.0.0.50' (ECDSA) to the list of known hosts. [email protected]'s password:
输入正确的密码后,您将登录到远程主机。
Welcome to Ubuntu 14.04.6 LTS (GNU/Linux 3.13.0-170-generic x86_64) * Documentation: https://help.ubuntu.com/ .. me@vagrant-ubuntu-trusty-64:~$
您可以使用 exit 命令退出此远程 shell。
此外,您可以使用 ssh 在远程主机上轻松执行单个命令。 例如,在远程主机上运行 df -h:
$ ssh 10.0.0.50 df -h [email protected]'s password: Filesystem Size Used Avail Use% Mounted on udev 241M 12K 241M 1% /dev tmpfs 49M 384K 49M 1% /run /dev/sda1 40G 1.6G 37G 5% / ... none 224G 113G 111G 51% /vagrant me@ubuntu-xenial:~$
scp 和 sftp
scp (secure copy) 与用于复制文件的cp
命令非常相似,另外还有一个功能——您可以在源路径名或目标路径名中包含远程主机名。 主机名和目录路径用冒号分隔。 这使您能够以加密形式通过网络安全地复制文件。 以下命令将 a.txt 从本地计算机复制到 10.0.0.50 :
me@ubuntu-xenial:~$ scp a.txt 10.0.0.50:/home/me [email protected]'s password: a.txt 100% 0 0.0KB/s 00:00
sftp (secure ftp) 也是一个类似于ftp
的文件复制程序。 但是,它使用 SSH 加密隧道来复制文件,而不是以明文形式发送所有内容。 此外,您不需要在远程主机上运行 FTP 服务器。 您只需要一个 ssh 服务器。 这是一个示例会话:
me@ubuntu-xenial:~$ sftp 10.0.0.50 [email protected]'s password: Connected to 10.0.0.50. sftp> put kali-linux-2020.3-installer-netinst-i386.iso Uploading kali-linux-2020.3-installer-netinst-i386.iso to /home/me/kali-linux-2020.3-installer-netinst-i386.iso kali-linux-2020.3-installer-netinst-i386.iso 100% 435MB 27.2MB/s 00:16 sftp> bye
ifconfig
大多数情况下,我们使用ifconfig
命令来检查分配给系统的 IP 地址。
[root@lab ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 209.97.137.171 netmask 255.255.240.0 broadcast 209.97.143.255 inet6 fe80::c035:b2ff:fe9d:72d5 prefixlen 64 scopeid 0x20<link> ether c2:35:b2:9d:72:d5 txqueuelen 1000 (Ethernet) RX packets 1333200 bytes 167143230 (159.4 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 979666 bytes 93582595 (89.2 MiB) 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 16 bytes 1392 (1.3 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 16 bytes 1392 (1.3 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@lab ~]#
挖
dig (Domain Information Groper) 是一种用于查询 DNS 名称服务器的灵活工具。
它执行 DNS 查找并显示从名称服务器返回的答案。
[root@lab ~]# dig geekflare.com ; <<>> DiG 9.11.13-RedHat-9.11.13-5.el8_2 <<>> geekflare.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12310 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;geekflare.com. IN A ;; ANSWER SECTION: geekflare.com. 30 IN A 104.27.119.115 geekflare.com. 30 IN A 104.27.118.115 ;; Query time: 12 msec ;; SERVER: 67.207.67.2#53(67.207.67.2) ;; WHEN: Wed Sep 16 17:58:45 UTC 2020 ;; MSG SIZE rcvd: 74 [root@lab ~]#
远程登录
telnet 通过 telnet 协议连接目的地的主机和端口,如果连接建立意味着两台主机之间的连接工作正常。
[root@lab ~]# telnet gf.dev 443 Trying 104.27.153.44... Connected to gf.dev. Escape character is '^]'.
nslookup
nslookup是一个查询域名服务器和解析IP的程序。
[root@lab ~]# nslookup relicflare.com Server: 67.207.67.2 Address: 67.207.67.2#53 Non-authoritative answer: Name: relicflare.com Address: 192.64.119.178 [root@lab ~]#
概括
Linux 中的网络是一个庞大的主题,包含大量的命令和实用程序。 在本文中,我们讨论了一些常用的命令,希望它们能帮助您管理和保护您的网络。