linux环境下常用的网络命令ping、telnet、traceroute、tcpdump

前言

因特网(Internet)的前身是美国国防部高级研究计划局(ARPA)用于军事目的的通信网络,真的就是一个内部的工具出圈成了改变世界的事物。网这个词用的很形象也很贴切,如今的世界任何事情都离不开这个大网了,特别是之前炒的非常火爆的万物互联概念,更是把所有事物都挂在了“网”上,虽然这张大网某些节点偶尔会不太通畅,但这并不能阻断消息的往来。之前都在讲全球化,谁能想到短短几年“逆全球化”居然越来越热。

1983年1月1日被认为是互联网的官方生日,在此之前,各种计算机网络没有相互通信的标准方式。但从这一天开始,用于军事目的的阿帕网和国防数据网络正式定义为TCP/IP标准,建立了一种统一的通信协议,它允许不同网络上不同类型的计算机相互”交谈”,互联网就此诞生了。

网络

如今人们已经离不开网络了,不管是每天工作,还是日常娱乐,网络无处不在,连两岁的宝宝看到动画片转圈圈都知道是网卡了,而进行应用开发和游戏开发的搬砖小哥儿们更是无人能逃脱网络问题,遇到网络问题不可怕,重启电脑、重启路由器,重启光猫,问题很可能就解决了。

但,总有那么几个问题是重启解决不了的,所以我们还是得掌握一些正常的工具来排查问题,那么接下来就列举几个常用的命令,真的很常见,大神请绕路~

网络命令

ping

这应该是用的最多的一个网络命令了吧,“ping一下通不通”,这句话经常在日常开发调试中被提及,ping 命令常常用来测试,指定的两台机器之间的网络是否可以连通,命令格式如下:

1
ping [OPTIONS] 域名或IP地址

一些常用的选项:

  • -4:只使用 IPv4
  • -6:只使用 IPv6
  • -c count:发送多少个测试包之后停止,linux环境下如果不加这个参数会一直发包
  • -i interval:指定发包的的间隔时间

用常用网站测试一下:

1
2
3
4
5
6
7
8
9
10
11
[root@VM-0-3-centos ~]# ping -c 5 -i 2 www.baidu.com
PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data.
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=251 time=10.3 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=2 ttl=251 time=10.2 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=3 ttl=251 time=10.2 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=4 ttl=251 time=10.2 ms
64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=5 ttl=251 time=10.2 ms

--- www.a.shifen.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 8007ms
rtt min/avg/max/mdev = 10.217/10.243/10.311/0.132 ms

测试信息的含义:

数据 含义
-c 5 发送5个测试包
-i 2 每个测试包发送间隔2s
www.baidu.com 指定的目标地址
www.a.shifen.com (110.242.68.3) 实际的目标主机的主机名和IP地址
56(84) bytes ICMP数据部分的大小56字节,加上8字节的ICMP头,则ICMP包大小为64字节,再加上20字节的IP头,IP包大小为84字节
64 bytes ICMP数据包大小
icmp_seq=1 ICMP包序号
ttl=251 剩余生存时间,生存时间是指数据包被路由器丢弃之前允许通过的网段数量,由发送主机设置的,以防止数据包在互联网络上永不终止的循环,每经过一个路由器至少将TTL减 1
time=10.3 ms 响应时间,这个时间越小,连接速度越快
— www.a.shifen.com ping statistics — 统计信息分割线,以下为统计信息
5 packets transmitted 发送数据包的数量
5 received 接收到的数据包的数量
0% packet loss 数据包的丢失率
time 8007ms 整个过程消耗的总时间
rtt min/avg/max/mdev = 10.217/10.243/10.311/0.132 ms 最小响应时间/平均响应时间/最大响应时间/响应时间的平均差

ping 命令全称 Packe InterNet Groper, 翻译为因特网包探索器,是一个用于测试网络连接状况的程序。该令会使用ICMP(Internet Control Message Protocol)传输协议,向特定的目标主机发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。

ICMP协议是IP层的附属协议,是介于IP层和TCP层之间的协议,一般认为属于IP层协议,也就是网络层协议。ICMP用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

注意:在Windows命令行中执行ping命令,默认只发送4个数据包就停止,这个行为和Linux环境下是不同的

telnet

telnet是电信(telecommunications)和网络(networks)的联合缩写,是Internet远程登陆服务的标准协议,为用户提供了在本地计算机上完成远程主机工作的能力。在终端使用者的电脑上使用telnet程序,可以连接到服务器,直接在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样,进而可以在本地就能控制远端的服务器。

telnet位于OSI模型的第7层,属于应用层上的一种协议,使用端口23,底层基于TCP协议。传输的数据和口令是明文形式,相对来说不安全,存在很大的安全隐患,不再用于通过公共网络访问网络设备和服务器。

现在使用更加安全的ssh代替telnet进行远程管理终端,ssh传输方式是以加密形式传输,并且功能比telnet更齐全,而telnet主要作用变成了查看某个端口是否可访问,常用命令格式如下:

1
telnet IP或域名 端口

测试一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[root@VM-0-3-centos ~]# telnet www.baidu.com 80
Trying 110.242.68.4...
Connected to www.baidu.com.
Escape character is '^]'.
^]
telnet> send ?
ao Send Telnet Abort output
ayt Send Telnet 'Are You There'
brk Send Telnet Break
ec Send Telnet Erase Character
el Send Telnet Erase Line
escape Send current escape character
ga Send Telnet 'Go Ahead' sequence
ip Send Telnet Interrupt Process
nop Send Telnet 'No operation'
eor Send Telnet 'End of Record'
abort Send Telnet 'Abort Process'
susp Send Telnet 'Suspend Process'
eof Send Telnet End of File Character
synch Perform Telnet 'Synch operation'
getstatus Send request for STATUS
? Display send options
telnet> ?
Commands may be abbreviated. Commands are:

close close current connection
logout forcibly logout remote user and close the connection
display display operating parameters
mode try to enter line or character mode ('mode ?' for more)
open connect to a site
quit exit telnet
send transmit special characters ('send ?' for more)
set set operating parameters ('set ?' for more)
unset unset operating parameters ('unset ?' for more)
status print status information
toggle toggle operating parameters ('toggle ?' for more)
slc change state of special charaters ('slc ?' for more)
z suspend telnet
! invoke a subshell
environ change environment variables ('environ ?' for more)
? print help information
telnet> q
Connection closed.
[root@VM-0-3-centos ~]#

一般情况下测试80端口是否可用,看到第3行的 Connected to www.baidu.com. 就够了,如果想使用telnet工具发送数据,可以按组合键 Ctrl+]进入输入命令的模式,按字母 q 可以退出。

注意:在Windows环境下如果端口可以连通会显示一个无任何信息的黑框,按组合键 Ctrl+]才会有反应,如果端口不通则会提示超时

nc

上一小节说过,telnet是基于TCP的应用层协议,所以只能检测TCP端口是否正常,如果想检测一个UDP端口是否可用,使用telnet命令是办不到的,这时候就可以使用 nc 命令来实现,详细的用法可以参考之前的文章《网络工具nc的常见功能和用法》,下面只列举一下检查UDP端口的命令参数:

1
2
albert@home-pc:~$ nc -nvuz 82.156.125.169 666
Connection to 82.156.125.169 666 port [udp/*] succeeded!

traceroute

traceroute是一个路由跟踪命令,用于追踪数据包在网络上的传输时的全部路径,IPv4是发送的探测包大小是60字节,而IPv6默认是80字节,这个可以通过查询 man 手册来查询。

通过traceroute我们可以探测出数据从当前计算机到另一台主机是走了什么样网络路径,不过相同的数据包每次由从相同的出发点到相同目的地走的路径可能并相同,但大部分时候所走的路由是一样的,所以可以帮助我们了解网络状况。

traceroute的原理是利用逐步设置 ttl 参数进行参数,这个参数全称time-to-live, 指当前数据包在网络中存在的是时间,而时间不是我们平常所说的时间,指的是数据包在网络环境中最多可以被中转的次数,每经过一个路由设备就要减1,减到0则说明数据包超时,要给原地址一个包含自身信息的回应。

既然这样就可以利用 ttl 的特点来探测出路径,先将第一个数据包的 ttl 设置为 1,到达第一个路由设备后 ttl 减为0,返回给发送数据的起始设备,这样我们就找到了网络路径中的第一个点。然后将下一个数据包的 ttl 设置为2,就可以探测出路径上的第二个路由设备,直到找到目的地址,整个探测过程结束。

1
traceroute [OPTIONS] IP或域名

一些常用的选项:

  • -4:强制使用 IPv4 追踪,默认自动选择
  • -6:强制使用 IPv6 追踪,默认自动选择
  • -I:使用 ICMP 回应进行探测
  • -T:使用 TCP 同步进行探测
  • -m max_ttl:指定 time-to-live 的最大值,默认是30

测试如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@VM-0-3-centos ~]# traceroute www.baidu.com -T
traceroute to www.baidu.com (110.242.68.4), 30 hops max, 60 byte packets
1 9.61.26.129 (9.61.26.129) 0.464 ms 0.626 ms 0.788 ms
2 9.61.119.152 (9.61.119.152) 0.843 ms 1.085 ms 1.282 ms
3 * * *
4 10.200.44.221 (10.200.44.221) 1.130 ms 10.162.5.252 (10.162.5.252) 1.089 ms 10.200.44.205 (10.200.44.205) 1.385 ms
5 61.49.142.157 (61.49.142.157) 2.842 ms 61.49.142.153 (61.49.142.153) 0.923 ms 61.49.142.149 (61.49.142.149) 1.467 ms
6 123.126.0.217 (123.126.0.217) 2.031 ms 61.148.7.157 (61.148.7.157) 2.057 ms 202.96.13.5 (202.96.13.5) 5.015 ms
7 125.33.186.17 (125.33.186.17) 2.499 ms 124.65.194.161 (124.65.194.161) 6.422 ms 124.65.194.157 (124.65.194.157) 3.125 ms
8 * * *
9 110.242.66.190 (110.242.66.190) 10.030 ms 110.242.66.166 (110.242.66.166) 10.261 ms 110.242.66.162 (110.242.66.162) 10.751 ms
10 * * *
11 * * *
12 * * *
13 * * *
14 * * 110.242.68.4 (110.242.68.4) 9.245 ms

从上面的测试结果来看,每一行都是一个记录,每个纪录表示一跳,从我的机器到 www.baidu.com 一共经过了14个设备才到达,不过并不是每次探测的结果都一样,这个是会变化的,可以看到每行有3个以ms为单位时间,是因为该命令每次默认发送3个探测数据包,这3个时间就是网关响应后返回的时间。

另外在输出信息中部分节点显示 * * *,关于这种现象,我找到几种说法,遇到了需要针对具体情况进行分析:

  • 设备防火墙封掉了ICMP的返回信息,我们得不到什么相关的数据包返回数据
  • 由于回送TTL超时信息的时候,CPU生成这个返回包必须被打断,为保证其它工作的正常进行,每隔一秒才会处理traceroute,所以可能会看到中间一路 * * *,但却看得到最后的destination. 这时往往是路由设备CPU太忙或者中间路由器不回送TTL超时包的原因(感觉不太靠谱)。
  • 虚拟机nat路由器,默认丢弃port>32767的包,导致看不到中间路由的信息

注意:在Windows环境下,相同功能的命令为Tracert,而不是traceroute

tcpdump

tcpdump命令是一个网络嗅探,它可以打印所有经过该设备网卡的数据包的信息,也可以使用-w选项将数据包保存到文件中,方便以后分析,功能与Windows平台上的Wiresh相同,生成的数据文件也可以传送到Windows平台,使用 Wireshark 软件进行分析。

命令格式非常简单,必要时加一些参数就可以:

1
tcpdump [OPTIONS]

一些常用的选项:

  • -c count:接受count个数据包之后退出
  • -i:指定网卡
  • -v:打印较详细的信息用于分析
  • -w:结果写到文件之中
  • tcp:过滤出tcp数据
  • port xxxx:仅打印指定端口的数据

测试一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@VM-0-3-centos ~]# tcpdump -c 6 -v
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:30:45.344349 IP (tos 0x10, ttl 64, id 47149, offset 0, flags [DF], proto TCP (6), length 188)
VM-0-3-centos.ssh > 68.128.126.124.broad.bjtelecom.net.6183: Flags [P.], cksum 0x9127 (correct), seq 14744777:14744925, ack 1170924064, win 340, length 148
10:30:45.344782 IP (tos 0x0, ttl 64, id 39263, offset 0, flags [DF], proto UDP (17), length 73)
VM-0-3-centos.35281 > 183.60.83.19.domain: 48669+ PTR? 68.128.126.124.in-addr.arpa. (45)
10:30:45.344826 IP (tos 0x10, ttl 64, id 47150, offset 0, flags [DF], proto TCP (6), length 188)
VM-0-3-centos.ssh > 68.128.126.124.broad.bjtelecom.net.6183: Flags [P.], cksum 0x5e8b (correct), seq 148:296, ack 1, win 340, length 148
10:30:45.353844 IP (tos 0xa0, ttl 251, id 62658, offset 0, flags [DF], proto TCP (6), length 40)
68.128.126.124.broad.bjtelecom.net.6183 > VM-0-3-centos.ssh: Flags [.], cksum 0x6909 (correct), ack 296, win 258, length 0
10:30:45.424218 IP (tos 0x0, ttl 56, id 9062, offset 0, flags [DF], proto UDP (17), length 121)
183.60.83.19.domain > VM-0-3-centos.35281: 48669 1/0/0 68.128.126.124.in-addr.arpa. PTR 68.128.126.124.broad.bjtelecom.net. (93)
10:30:45.424327 IP (tos 0x0, ttl 64, id 17697, offset 0, flags [DF], proto UDP (17), length 68)
VM-0-3-centos.40741 > 183.60.82.98.domain: 15078+ PTR? 3.0.10.10.in-addr.arpa. (40)
6 packets captured
13 packets received by filter
0 packets dropped by kernel

因为不能一直盯着某个设备的网络情况,所以会将数据打印到文件中便于日后分析,常常将tcpdump命令后台运行,比如可以写成下面这样:

1
nohup tcpdump -i eth0 tcp port 8080 -v -w dm8080.cap &

在Windows平台一般就直接使用Wiresh软件啦,非常方便

总结

  • 设备一旦接入网络很难“独善其身”
  • ping 命令可以测试目的IP是否可达 ping www.baidu.com
  • telnet 命令可以测试指定的tcp端口是否可达 telnet 110.242.68.4 80
  • nc 命令可以测试指定udp端口是否可达 nc -nvuz 110.242.68.4 666
  • tracerout 命令可以探测网络路径 traceroute www.baidu.com
  • tcpdump 命令可以收集所有经过网卡的数据包 tcpdump -i eth0 tcp port 8080 -v

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

“王侯将相,宁有种乎?”讲的是权利;
“天下兴亡,匹夫有责!”说的是义务;
权力和义务的辩证关系体现于此,二者统一,不可分离~

2022-5-13 20:59:38

Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客