必备工具: ping

ICMP 是一种基于 IP 协议的控制协议,翻译为网际控制协议,其报文格式如下图:

image.png

  1. 类型:即 ICMP 的类型, 其中 ping 的请求类型为 8,应答为 0。
  2. 代码:进一步划分 ICMP 的类型, 用来查找产生错误的原因。
  3. 校验和:用于检查错误的数据。
  4. 标识符:通过标识符来确认是谁发送的控制协议,可以是进程 ID。
  5. 序列号:唯一确定的一个报文,前面 ping 名字执行后显示的 icmp_seq 就是这个值。

基本命令: ifconfig

  1. vagrant@ubuntu-xenial-01:~$ ifconfig
  2. cni0 Link encap:Ethernet HWaddr 0a:58:0a:f4:00:01
  3. inet addr:10.244.0.1 Bcast:0.0.0.0 Mask:255.255.255.0
  4. inet6 addr: fe80::401:b4ff:fe51:bcf9/64 Scope:Link
  5. UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
  6. RX packets:2133 errors:0 dropped:0 overruns:0 frame:0
  7. TX packets:2216 errors:0 dropped:0 overruns:0 carrier:0
  8. collisions:0 txqueuelen:1000
  9. RX bytes:139381 (139.3 KB) TX bytes:853302 (853.3 KB)
  10. docker0 Link encap:Ethernet HWaddr 02:42:93:0f:f7:11
  11. inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
  12. inet6 addr: fe80::42:93ff:fe0f:f711/64 Scope:Link
  13. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  14. RX packets:653 errors:0 dropped:0 overruns:0 frame:0
  15. TX packets:685 errors:0 dropped:0 overruns:0 carrier:0
  16. collisions:0 txqueuelen:0
  17. RX bytes:49542 (49.5 KB) TX bytes:430826 (430.8 KB)
  18. enp0s3 Link encap:Ethernet HWaddr 02:54:ad:ea:60:2e
  19. inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
  20. inet6 addr: fe80::54:adff:feea:602e/64 Scope:Link
  21. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  22. RX packets:7951 errors:0 dropped:0 overruns:0 frame:0
  23. TX packets:4123 errors:0 dropped:0 overruns:0 carrier:0
  24. collisions:0 txqueuelen:1000
  25. RX bytes:5081047 (5.0 MB) TX bytes:385600 (385.6 KB)
  • Metric 就是用来确定多块网卡的优先级的,数值越小,优先级越高,1 为最高级。

netstat 和 lsof:对网络状况了如指掌

netstat

当前所有的连接详情:

$ netstat -alepn

image.png

只对 UNIX 套接字进行筛查:

$ netstat Socket -x -alepn

image.png

  • 最关键的信息是 Path,这个信息显示了本地套接字监听的文件路径

lsof

lsof 的常见用途之一是帮助我们找出在指定的 IP 地址或者端口上打开套接字的进程,而 netstat 则告诉我们 IP 地址和端口使用的情况,以及各个 TCP 连接的状态。Isof 和 netstst 可以结合起来一起使用。

通过 lsof 查看到底是谁打开了这个文件:

$ lsof /var/run/docker.sock

image.png

lsof 还有一个非常常见的用途。如果我们启动了一个服务器程序,发现这个服务器需要绑定的端口地址已经被占用,内核报出“该地址已在使用”的出错信息,我们可以使用 lsof 找出正在使用该端口的那个进程。

$ lsof -i :8080

抓包利器: tcpdump

指定网卡:

$ tcpdump -i eth0

指定来源:

$ tcpdump src host hostname

这里抓的包是 TCP,且端口是 80,包来自 IP 地址为 192.168.1.25 的主机地址:

$ tcpdump 'tcp and port 80 and src host 192.168.1.25'

过滤分节类型:

  • 这里 tcp[13:1]表示的是 TCP 头部开始处偏移为 13 的字节,如果这个值为 2,说明设置了 SYN 分节,当然,我们也可以设置成其他值来获取希望类型的分节。注意,这里的偏移是从 0 开始算起的,tcp[13]其实是报文里的第 14 个字节。
$ tcpdump 'tcp and port 80 and tcp[13:1]&2 != 0'

tcpdump 的输出格式:

image.png

比较常见的包格式如下:

  1. [S]:SYN,表示开始连接
  2. [.]:没有标记,一般是确认
  3. [P]:PSH,表示数据推送
  4. [F]:FIN,表示结束连接
  5. [R] :RST,表示重启连接

数据:

  1. seq:包序号,就是 TCP 的确认分组
  2. cksum:校验码
  3. win:滑动窗口大小
  4. length:承载的数据(payload)长度 length,如果没有数据则为 0