14 個有用的 Linux 網絡命令

已發表: 2015-02-15

配置、監控和保護網絡是系統管理員工作的重要組成部分。 在管理 Linux 網絡時,有許多可用的命令和實用程序。

有時聯網系統會失敗。 您作為管理員需要診斷和解決問題。 監控有助於檢測問題並在事情失控之前解決問題。 監控安全和性能也是管理員活動的重要組成部分。

這裡我們討論一些常用的管理 Linux 網絡的命令。

知識產權

iproute2 包中包含用於網絡和路由配置的 IP 命令。 這取代了傳統的ifconfigroute命令。

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 中的網絡是一個龐大的主題,包含大量的命令和實用程序。 在本文中,我們討論了一些常用的命令,希望它們能幫助您管理和保護您的網絡。