必备工具: ping
ICMP 是一种基于 IP 协议的控制协议,翻译为网际控制协议,其报文格式如下图:
- 类型:即 ICMP 的类型, 其中 ping 的请求类型为 8,应答为 0。
- 代码:进一步划分 ICMP 的类型, 用来查找产生错误的原因。
- 校验和:用于检查错误的数据。
- 标识符:通过标识符来确认是谁发送的控制协议,可以是进程 ID。
- 序列号:唯一确定的一个报文,前面 ping 名字执行后显示的 icmp_seq 就是这个值。
基本命令: ifconfig
vagrant@ubuntu-xenial-01:~$ ifconfig
cni0 Link encap:Ethernet HWaddr 0a:58:0a:f4:00:01
inet addr:10.244.0.1 Bcast:0.0.0.0 Mask:255.255.255.0
inet6 addr: fe80::401:b4ff:fe51:bcf9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1450 Metric:1
RX packets:2133 errors:0 dropped:0 overruns:0 frame:0
TX packets:2216 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:139381 (139.3 KB) TX bytes:853302 (853.3 KB)
docker0 Link encap:Ethernet HWaddr 02:42:93:0f:f7:11
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:93ff:fe0f:f711/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:653 errors:0 dropped:0 overruns:0 frame:0
TX packets:685 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:49542 (49.5 KB) TX bytes:430826 (430.8 KB)
enp0s3 Link encap:Ethernet HWaddr 02:54:ad:ea:60:2e
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::54:adff:feea:602e/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:7951 errors:0 dropped:0 overruns:0 frame:0
TX packets:4123 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:5081047 (5.0 MB) TX bytes:385600 (385.6 KB)
- Metric 就是用来确定多块网卡的优先级的,数值越小,优先级越高,1 为最高级。
netstat 和 lsof:对网络状况了如指掌
netstat
当前所有的连接详情:
$ netstat -alepn
只对 UNIX 套接字进行筛查:
$ netstat Socket -x -alepn
- 最关键的信息是 Path,这个信息显示了本地套接字监听的文件路径
lsof
lsof 的常见用途之一是帮助我们找出在指定的 IP 地址或者端口上打开套接字的进程,而 netstat 则告诉我们 IP 地址和端口使用的情况,以及各个 TCP 连接的状态。Isof 和 netstst 可以结合起来一起使用。
通过 lsof 查看到底是谁打开了这个文件:
$ lsof /var/run/docker.sock
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 的输出格式:
比较常见的包格式如下:
- [S]:SYN,表示开始连接
- [.]:没有标记,一般是确认
- [P]:PSH,表示数据推送
- [F]:FIN,表示结束连接
- [R] :RST,表示重启连接
数据:
- seq:包序号,就是 TCP 的确认分组
- cksum:校验码
- win:滑动窗口大小
- length:承载的数据(payload)长度 length,如果没有数据则为 0