【Linux】常用网络命令

注意:不同操作系统或不同 Linux 版本会导致命令和参数有所差异

1
2
3
4
5
6
7
$ uname -a

# ubuntu
Linux aliyun-ecs 5.15.0-71-generic #78-Ubuntu SMP Tue Apr 18 09:00:29 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

# macos
Darwin elf-MacBook-Pro.local 23.1.0 Darwin Kernel Version 23.1.0: Mon Oct  9 21:27:24 PDT 2023; root:xnu-10002.41.9~6/RELEASE_ARM64_T6000 arm64

资源查看

ifconfig & ip

ifconfig(ipconfig on Windows) 用于显示和配置网络接口的信息,包括IP地址、子网掩码、MAC地址等。

在一些Linux发行版中,已经逐渐转到使用 ip 命令来替代 ifconfig

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看所有网络接口信息
$ ifconfig
$ ip addr [show] # ip link 只显示接口连接,不显示地址

# 查看特定网络接口信息(例如eth0)
$ ifconfig eth0
$ ip addr show eth0

# 启用或禁用网络接口(例如eth0)
$ ifconfig eth0 up
$ ifconfig eth0 down
$ ip link set eth0 up
$ ip link set eth0 down

# 配置IP地址和子网掩码(例如eth0)
$ ifconfig eth0 192.168.0.10 netmask 255.255.255.0
$ ip addr add 192.168.0.10/24 dev eth0

# 修改MAC地址(例如eth0)
$ ifconfig eth0 hw ether 00:11:22:33:44:55
$ ip link set dev eth0 address 00:11:22:33:44:55

netstat

1
2
3
4
5
6
7
# 显示所有正在监听的 TCP 和 UDP 端口
$ netstat -tuln
$ netstat -tuln | grep 8888
tcp        0      0 127.0.0.1:8888          0.0.0.0:*               LISTEN

# 统计当前系统上建立的TCP连接数
netstat -napt | grep "ESTABLISHED" | wc -l

ss

ss 是用于查看系统网络连接状态的实用工具,它提供了比传统的 netstat 命令更多的功能和选项,并且在某些情况下执行速度更快。

1
2
3
# 查看正在监听的 TCP/UDP 端口
$ ss -tuln | grep 9999
tcp   LISTEN  0       4096          127.0.0.1:9999         0.0.0.0:*

lsof

lsof(list open files) 用于查看系统的打开文件,可显示被进程打开的文件、网络连接、管道、设备等信息,这里使用它查看网络连接情况

1
2
3
4
5
6
7
8
# 列出所有的网络连接
$ lsof -i
$ lsof -i :<port> # 显示特定端口的监听情况
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
main    506123  lfe    3u  IPv4 842753      0t0  TCP localhost:8888 (LISTEN)

# 打印出所有监听端口的进程及相应的端口
$ lsof | grep LISTEN

route

查看和操作 IP 路由表

1
2
3
4
5
# 显示路由表,以数字格式显示 IP 地址
route -n

# 添加默认网关
route add default gw 192.168.150.2

arp

查看和操作 ARP(地址解析协议)缓存表

1
2
3
arp -a

arp -d 192.168.1.1

域名 DNS

dig

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
$ dig www.baidu.com
; <<>> DiG 9.10.6 <<>> www.baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51516
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.baidu.com.                 IN      A

;; ANSWER SECTION:
www.baidu.com.          877     IN      CNAME   www.a.shifen.com.
www.a.shifen.com.       46      IN      A       180.101.50.188
www.a.shifen.com.       46      IN      A       180.101.50.242

;; Query time: 2 msec
;; SERVER: 210.28.129.251#53(210.28.129.251)
;; WHEN: Tue Jan 02 11:52:35 CST 2024
;; MSG SIZE  rcvd: 101

nslookup

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ nslookup www.baidu.com
# linux server
Server:         127.0.0.53
Address:        127.0.0.53#53

** server can\'t find www.baidu.com: SERVFAIL

Server:		210.28.129.251
Address:	210.28.129.251#53

# mac
Non-authoritative answer:
www.baidu.com	canonical name = www.a.shifen.com.
Name:	www.a.shifen.com
Address: 180.101.50.188
Name:	www.a.shifen.com
Address: 180.101.50.242

网络连接

nc

nc(netca) 建立 TCP/UDP 连接并进行数据传输,不提供对特定协议的内置支持。

常用于低级网络操作,如端口扫描、网络调试、创建简单的网络服务等

1
$ nc 127.0.0.1 8888

curl

curl 是一个用于发送和接收 HTTP、HTTPS、FTP 等网络请求的高级工具,HTTP 默认 GET 请求,常用命令如下

有丰富的功能和选项,更适合与 Web 服务器进行交互

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# url 参数
$ curl "http://localhost:8888/hello?name=xyz"

# -i: 输出 HTTP 返回头
$ curl -i www.baidu.com # 响应头和响应体
$ curl -I www.baidu.com # 响应头

# -L: 自动跟随重定向 -v: 启用详细输出模式
$ curl -Lv www.baidu.com

# -x 设置代理
$ curl -x "http://127.0.0.1:7890" https://www.google.com 

# -X 设定请求类型 -d 添加数据
$ curl "http://localhost:8888/login" -X POST -d 'username=xyz&password=1234'

# -H http 首部
$ curl "http://localhost:8888/login" -X POST -H 'Content-Type:application/json' -d 'username=xyz&password=1234'

# -o 下载 -C 恢复下载
$ curl -o filename url
$ curl -C -

连通时延测试

ping

ping 是应用层命令,底层用的是网络层 ICMP 协议。ping 使用了 ICMP 里面的 ECHO REQUEST(类型为 8)和 ECHO REPLY(类型为 0)。 ICMP 报文是封装在 IP 包里面,它工作在网络层,是 IP 协议的助手。

Linux/MacOS 中 ping 不会像 Windows 固定次数便停下,可以设置次数或 ctrl + c 停下

在结束命令前,包超时丢失终端没有任何提示信息,默认一直发包,需要一直等待…

1
2
3
4
5
$ ping -c5 142.251.43.14
PING 142.251.43.14 (142.251.43.14) 56(84) bytes of data.

--- 142.251.43.14 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4080ms

ping 不同网址的差异

  1. ping 127.0.0.1(回环地址)

    不能测试与其他主机的连接,检测自己主机的基础网络配置是否正常(本机 TCP/IP 正常),未连接网络也可 ping 通

  2. ping 192.168.10.5(本机内网 IP 地址,ifconfig->eth0)

    本机 IP 地址分为公网 IP 和内网 IP,路由器或 ISP 会禁止 ping 公网 IP,这里 ping 本机的内网 IP。

    ping 回环地址和 ping 本机地址都走的"假"网卡,一样不需要网络

  3. ping 192.168.10.1(默认网关 - 路由器,ip route):检查路由器是否故障

  4. ping 目标 IP 地址

    ping 不通不是自己主机或网络的问题,可能是对方主机下线,也可能是防火墙禁止了 ping 的请求,或是数据包丢失

  5. ping 目标主机名:检查域名解析

localhost 是域名不等价于 IP 地址 127.0.0.1,默认情况下 /etc/hosts 指定 localhost 解析为 127.0.0.1

ping 0.0.0.0 是会失败的,因为它在 IPV4中表示的是无效的目标地址,客户端无法访问。 服务端常用 0.0.0.0 监听所有访问的 IP 地址。

ping 结果分析

1
2
3
4
5
6
~ > ping localhost      # on macos
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.112 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.218 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.196 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.357 ms

ping 是处于网络层(IP 层)的 ICMP 协议,数据包 64 bytes = 报头 8 bytes + 数据 56 bytes。 icmp_seq 是发送 icmp 包的序号,从 0 开始递增。

traceroute

traceroute 通过故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器。

它的原理是利用 IP 包的生存期限从 1 开始按照顺序递增的同时发送 UDP 包,强制接收 ICMP 超时消息,以此拿到所有路由器 IP。

为了判断 UDP 包到达了目的主机,traceroute 选择不可能的值(大于 30 000)作为 UDP 端口号,然后对于下一个探针,它都会增加一。 目的主机的任何一个应用程序都不可能使用该端口,当该数据报到达时,目的主机返回端口不可达 ICMP 差错报文。

Windows 中对等的命令叫做 tracert,原理类似,发送的包是 ICMP 的 ECHO REQUEST

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
$ traceroute baidu.com
traceroute: Warning: baidu.com has multiple addresses; using 110.242.68.66
traceroute to baidu.com (110.242.68.66), 64 hops max, 52 byte packets
 1  172.27.128.1 (172.27.128.1)  7.706 ms  17.307 ms  7.285 ms
 2  * 172.28.255.13 (172.28.255.13)  10.203 ms  7.199 ms
 3  * * *
 4  153.3.21.1 (153.3.21.1)  8.939 ms  6.510 ms  10.151 ms
 5  122.96.66.13 (122.96.66.13)  7.831 ms
	221.6.2.253 (221.6.2.253)  9.180 ms
	221.6.9.77 (221.6.9.77)  8.171 ms
 6  122.96.66.101 (122.96.66.101)  17.780 ms
	221.6.1.253 (221.6.1.253)  17.382 ms  17.101 ms
 7  * * 219.158.122.121 (219.158.122.121)  33.515 ms
 8  110.242.66.166 (110.242.66.166)  35.159 ms  35.109 ms
	110.242.66.162 (110.242.66.162)  35.852 ms
 9  221.194.45.130 (221.194.45.130)  36.267 ms
	221.194.45.134 (221.194.45.134)  35.431 ms  36.423 ms
10  * * *
11  * * *

traceroute 另外一个作用是故意设置不分片,从而确定路径的 MTU。

mtr

mtr(Matt’s Traceroute) 是一种由 Matt Kimball 开发的网络诊断工具,同时结合了 ping 和 traceroute 的功能。

mtr 通过发送一系列的网络探测数据包来测量到达目标主机的网络路径,并报告每个跳点的往返时间(RTT)和丢包情况。 与传统的 traceroute 相比,mtr 在连续的时间段内不断地执行网络探测,以实时更新跳点的信息。可以提供更准确详细的数据帮助诊断网络问题。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
$ sudo mtr baidu.com
elf-MacBook-Pro.local (172.27.148.255) -> baidu.com (110.242.68.66)                                                                                            2024-01-02T11:13:17+0800
Keys:  Help   Display mode   Restart statistics   Order of fields   quit
                                                                                                                                               Packets               Pings
 Host                                                                                                                                        Loss%   Snt   Last   Avg  Best  Wrst StDev
 1. 172.27.128.1               0.0%    13   16.2  14.4   5.2  47.2  12.1
 2. 172.28.255.13              7.7%    13   15.6   8.3   2.5  15.6   4.3
 3. (waiting for reply)
 4. 153.3.21.1                 0.0%    13    6.8  12.8   3.5  24.2   6.0
 5. 221.6.2.41                 0.0%    13   13.4  10.6   3.8  13.9   3.3
 6. 221.6.1.253               23.1%    13   20.9  18.2  10.0  28.5   5.7
 7. 219.158.122.121           30.8%    13   35.1  35.6  25.5  41.8   4.9
 8. 110.242.66.178             0.0%    13   28.8  33.8  28.7  48.1   5.7
 9. 221.194.45.134             0.0%    13   31.2  38.8  30.1  64.4   9.5
10. (waiting for reply)
11. (waiting for reply)

代理&运营商的影响

ping 使用 ICMP 协议,ICMP 处于网络层,而 SOCKS5 在会话层,HTTP 和 HTTPS 是应用层,协议层不同是无法代理的(具体原理有待考究,但实际来看,确实都没有支持 ICMP)。

注意:ICMP 与 IP 均位于网络层,但 ICMP 在 TCP/IP 协议栈中的位置比 IP 高一点,ICMP 的报文需要封装在 IP 数据报的数据部分进行传输。ICMP 不作为一个独立的层次,只是作为 IP 层的一部分存在。

运营商网络可能禁止使用 ICMP 协议的 pingtraceroutemtr 等工具来检视链路状况,因此建议使用 TCP 协议的工具 psping(Windows 环境)或 tcping(跨平台软件)等工具进行时延测试。

tcping 既可以基于 TCP 协议(通过建立 TCP 连接)也可以基于 ICMP 协议(通过发送 ICMP ECHO 请求)

使用 httping 和 curl(经过代理)进行连通测试:

1
2
3
4
5
6
7
8
### httping
# 必须手动指定代理,不会走终端代理
httping -x http://127.0.0.1:7890 -g https://www.google.com

### curl
curl -x "http://127.0.0.1:7890" https://www.google.com
# 不用手动指定代理,走终端代理
curl https://www.google.com

Reference

0%