注意:不同操作系统或不同 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
8
9
10
11
|
# 显示所有正在监听的 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
# 查看当前 TCP 半连接队列长度
$ netstat -natp | grep SYN_RECV | wc -l
256 #表示处于半连接状态的 TCP 连接有 256个
|
ss
ss 是用于查看用于查看套接字(socket)的状态,它提供了比传统的 netstat 命令更多的功能和选项,并且在某些情况下执行速度更快。
1
2
3
4
5
6
|
# 查看正在监听的 TCP/UDP 端口
$ ss -tuln | grep 9999
tcp LISTEN 0 4096 127.0.0.1:9999 0.0.0.0:*
# 查看 TCP 全连接队列的情况
$ ss -nt
|
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 连接并进行数据传输,不提供对特定协议的内置支持。
常用于低级网络操作,如端口扫描、网络调试、创建简单的网络服务等
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 不同网址的差异
-
ping 127.0.0.1(回环地址)
不能测试与其他主机的连接,检测自己主机的基础网络配置是否正常(本机 TCP/IP 正常),未连接网络也可 ping 通
-
ping 192.168.10.5(本机内网 IP 地址,ifconfig->eth0)
本机 IP 地址分为公网 IP 和内网 IP,路由器或 ISP 会禁止 ping 公网 IP,这里 ping 本机的内网 IP。
ping 回环地址和 ping 本机地址都走的"假"网卡,一样不需要网络
-
ping 192.168.10.1(默认网关 - 路由器,ip route):检查路由器是否故障
-
ping 目标 IP 地址
ping 不通不是自己主机或网络的问题,可能是对方主机下线,也可能是防火墙禁止了 ping 的请求,或是数据包丢失
-
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 协议的 ping
、traceroute
或 mtr
等工具来检视链路状况,因此建议使用 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