14个有用的Linux网络命令 – ifconfig: 显示和配置网络接口信息 – ping: 测试与远程主机之间的连接 – traceroute: 显示到达远程主机的网络路径 – netstat: 显示网络连接和路由表 – route: 显示和配置IP路由表 – nslookup: 查询域名服务器以获取DNS记录 – dig: 更详细的域名查询工具 – host: 将主机名解析为IP地址 – ssh: 远程登录到其他计算机 – scp: 在本地主机和远程主机之间复制文件 – ftp: 使用文件传输协议进行文件传输 – wget: 从Web服务器下载文件 – curl: 与Web服务器进行数据交互 – nmap: 扫描远程主机上开放的端口 – iptables: 配置Linux防火墙规则

配置、监控和保护网络是系统管理员工作的重要组成部分。在管理Linux网络方面,有许多可用的命令和工具。

有时网络系统会出现故障。作为一个管理员,您需要诊断和解决问题。监控有助于在问题严重之前检测并修复问题。安全和性能监控也是管理员活动的重要部分。

在这里,我们讨论一些常用的用于管理Linux网络的命令。

ip

iproute2软件包包括IP命令,用于网络和路由配置。它替代了传统的ifconfigroute命令。

ip带有第二个参数,指定要在其上执行命令的对象以及add、delete或show等操作。

ip link

ip link用于配置、添加和删除网络接口。使用ip link show命令显示系统上的所有网络接口:

$ ip link show
1: lo:  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:  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:  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 address

使用ip address命令显示地址,绑定新地址或删除旧地址。ip address命令的手册页命名为ip-address。

例如,以下命令显示分配给网络接口enp0s8的IP地址:

ip address show dev enp0s8
3: enp0s8:  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 route

使用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

虽然Nmap已经在许多电影中使用过,The Matrix ReloadedWikipediaIMDBAmazon)将Nmap变成了电影明星!

Nmap(“Network Mapper”) is a powerful utility used for network discovery,安全审计和管理。许多系统管理员使用它来确定哪些系统在线,并进行操作系统和服务检测。

默认的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扫描报告:10.0.0.50
主机在线(0.00053秒延迟)。
...
正在运行:Linux 3.X
操作系统CPE:cpe:/o:linux:linux_kernel:3
操作系统详细信息:Linux 3.10 - 3.19
网络距离:1跳
操作系统检测已完成。请将任何不正确的结果报告给 https://nmap.org/submit/ 。
Nmap完成:扫描了1个IP地址(1个主机在线),耗时21.95秒

需要注意的是:没有人希望他们的系统在互联网上被扫描。因此,在进行扫描之前,请先获得许可。

您也可以在Windows上使用Nmap,查看此链接_6。

ping

使用ping命令来查看主机是否存活。这个超级简单的命令可以帮助您检查主机或网络段的状态。Ping命令发送一个ICMP ECHO_REQUEST数据包到目标主机,并等待它是否回复。

然而,一些主机通过防火墙阻止ICMP echo请求。互联网上的一些网站也可能这样做。

默认情况下,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统计数据 ---
已发送3个数据包,收到3个数据包,丢失0.0%
往返时间的最小值/平均值/最大值/标准差 = 6.247/7.368/7.960/0.793毫秒

使用 -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统计数据 ---
已发送1个数据包,收到1个数据包,丢失0.0%
往返时间的最小值/平均值/最大值/标准差 = 7.540/7.540/7.540/0.000毫秒

您可以使用 -n 标志来避免反向DNS查找。ICMP序列号尤其重要。序列号中断表示丢失的数据包。

ping失败的原因可能是

  • 网络故障
  • 主机不在线
  • 防火墙阻止ICMP ECHO请求

您还可以执行一个链接_7来检查世界各地的连通性。

iPerf

虽然ping用于验证主机的可用性,iPerf可以帮助分析和测量两个主机之间的网络性能。使用iPerf,您可以在两个主机之间建立连接并发送一些数据。iPerf然后显示两个主机之间可用的带宽。

您可以使用发行版的软件包管理器安装iPerf。例如,在基于Ubuntu的发行版上,您可以这样安装:

$ sudo apt install iperf -y

安装了iPerf之后,在两台机器上都启动iPerf服务器。以下示例在具有IP地址10.0.0.51的主机上启动iPerf服务器。

$ iperf -s
------------------------------------------------------------
服务器正在监听TCP端口5001
TCP窗口大小:85.3千字节(默认)
------------------------------------------------------------

在第二台机器上使用 -c 标志启动iPerf。这将与服务器建立连接并发送一些数据。

$ iperf -c 10.0.0.51
------------------------------------------------------------
客户端正在连接到10.0.0.51,TCP端口5001
TCP窗口大小:85.0千字节(默认)
------------------------------------------------------------
[  3] local 10.0.0.50 port 42177 connected with 10.0.0.51 port 5001
[ ID] 间隔       传输     带宽
[  3]  0.0-10.0秒  1.13 GBytes   972 Mbits/sec

iPerf几秒钟内返回与bandwidth结果。

traceroute

如果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行显示往返时间中的*。这表示未收到响应。这可能是由于多种原因导致 – 由于traceroute ICMP数据包的优先级较低,路由器可能会丢弃这些数据包。或者可能只是拥塞。如果在给定网关的所有时间字段中都看到一个*,那么可能网关已关闭。

许多基于Web的路由跟踪工具允许您进行反向路由跟踪,即从网站到您的主机。您可以在traceroute.orgGeekflare Traceroute上检查这些。

tcpdump

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

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
内核 IP 路由表
目标            网关            子网掩码         标志   MSS 窗口 irtt 接口
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。

在第一行中,目标是默认的,这意味着该表中未列出的网络的任何数据包都由路由器10.0.2.2处理。

没有任何选项的netstat命令会显示一个打开的套接字列表。使用-l标志仅显示正在侦听的套接字,默认情况下不显示。可以使用-a标志显示正在侦听和非侦听的套接字。以下是一个示例:

$ netstat -a
活动的 Internet 连接(服务器和已建立的连接)
协议 接收队列 发送队列 本地地址           外部地址           状态      
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                *:*                                
活动的 UNIX 域套接字(服务器和已建立的连接)
协议 引用计数 标志       类型       状态         I-Node   路径
unix  3      [ ]         DGRAM                    8186     /run/systemd/notify
...

更多的netstat命令示例 here

ss

Linux安装默认运行许多服务。这些服务应该被禁用或最好移除,因为这有助于减少攻击面。您可以使用netstat命令查看正在运行的服务。虽然netstat仍然可用,但大多数Linux发行版正在过渡到ss命令。

使用-t-a标志的ss命令列出所有TCP套接字。这会显示正在侦听和非侦听的套接字。

$ ss -t -a
状态        接收队列 发送队列            本地地址:端口                对方地址:端口   
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
接收队列 发送队列                 本地地址:端口                     对方地址:端口   
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使您能够通过互联网安全地与远程主机连接。之前使用rlogin和telnet连接和管理远程主机。然而,它们都存在一个根本性的缺陷,即它们发送的所有信息,包括登录名和密码,都是明文。

ssh通过以下两个功能在互联网上启用链接:secure communication

  • 确认远程主机的身份。
  • 加密主机之间的所有通信。

要连接到远程主机,您需要在远程主机上运行OpenSSH服务器。您可以使用发行版的软件包管理器进行安装。例如,在Ubuntu上,您可以这样安装:

$ sudo apt install openssh-server

这里有一个示例,显示了如何使用ssh命令连接到远程主机10.0.0.50:

me@ubuntu-xenial:~$ ssh 10.0.0.50
主机 '10.0.0.50 (10.0.0.50)' 的真实性无法得到证实。
ECDSA key fingerprint is SHA256:s2tNJQa/C1/W0SevGm7Rt3xoBZG1QL5yT3ff/+PMpnY。
是否确定要继续连接 (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(安全复制)与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(安全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 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
ether c2:35:b2:9d:72:d5 txqueuelen 1000 (以太网)
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 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (本地回环)
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

dig (Domain Information Groper) 是一个灵活的工具,用于查询 DNS 名称服务器。

它执行查询并显示从名称服务器返回的答案。

[root@lab ~]# dig yaoweibin.com

; <> DiG 9.11.13-RedHat-9.11.13-5.el8_2 <> yaoweibin.com
;; 全局选项: +cmd
;; 收到响应:
;; ->>HEADER<<- 操作码: QUERY, 状态: NOERROR, id: 12310
;; 标志: qr rd ra ad; 请求: 1, 回答: 2, 授权: 0, 附加: 1

;; OPT 伪部分:
; EDNS: 版本: 0, 标志:; udp: 512
;; 问题部分:
;yaoweibin.com. IN A

;; 回答部分:
yaoweibin.com. 30 IN A 104.27.119.115
yaoweibin.com. 30 IN A 104.27.118.115

;; 查询时间: 12 毫秒
;; SERVER: 67.207.67.2#53(67.207.67.2)
;; 当: Wed Sep 16 17:58:45 UTC 2020
;; MSG SIZE 收到: 74

[root@lab ~]#

telnet

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

非权威应答:
Name: relicflare.com
Address: 192.64.119.178

[root@lab ~]#

摘要

Linux 中的网络是一个广阔的主题,有大量的命令和工具。在本文中,我们讨论了一些常用的命令,希望能帮助您管理和保护您的网络。

类似文章