Host
准备环境
Server1
2
3
4
5
6
7
8ens3 Link encap:Ethernet HWaddr 02:42:ac:11:00:36
inet addr:172.17.0.54 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:36/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:3733 errors:0 dropped:0 overruns:0 frame:0
TX packets:1723 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1216408 (1.2 MB) TX bytes:678036 (678.0 KB)
Client1
2
3
4
5
6
7
8ens3 Link encap:Ethernet HWaddr 02:42:ac:11:00:18
inet addr:172.17.0.24 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:18/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1717 errors:0 dropped:0 overruns:0 frame:0
TX packets:904 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1021151 (1.0 MB) TX bytes:301129 (301.1 KB)
Program
在各自主机上启动进程
Server1
2
3
4
5
6
7
8
9
10
11
12import socket
import sys
BUFSIZE = 1024
ip_port = ('0.0.0.0', 9999)
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # udp
server.bind(ip_port)
while True:
data,client_addr = server.recvfrom(BUFSIZE)
print(data)
sys.stdout.flush()
server.close()
Client1
2
3
4
5
6
7
8import socket
BUFSIZE = 1024
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
msg = raw_input(">> ").strip()
ip_port = ('172.17.0.54', 9999)
client.sendto(msg.encode('utf-8'),ip_port)
client.close()
TCPDUMP
Linux cooked mode
首先尝试默认的linux处理模式
tcpdump udp -i any -w ./udp.cap
1 | 00000000: d4c3 b2a1 0200 0400 0000 0000 0000 0000 ................ |
0xd4c3 b2a1
首四字节被称为幻数
,它的主机序列用于传输识别0x0200 0400
两字节常数 + 两字节常数,代表主版本号 + 次版本号0x0000 0000
四字节常数,全为0,表示时区0x0000 0000
四字节常数,全为0,表示时间戳精度0x0000 0400
四字节常数,主机字节序为0x04000000
,表示每个包抓包大小0x7100 0000
四字节常数,主机字节序为0x00000071
,表示数据链路层类型DLT_LINUX_SLL
0x7315 f460
四字节变量,代表秒时间戳0xe14b 0300
四字节变量,代表微秒部分时间戳0x3100 0000
四字节变量,抓包数据长度0x3100 0000
四字节变量,数据包数据的未截断长度0x0000
两字节变量,报文来源,来自他人
0x0001
两字节变量,寻址类型,Novell 802.3
0x0006
两字节变量,数据链路层地址长度,6 Octets
0x0242 ac11 0018
六字节变量,发送方mac地址
在默认模式里,没有记录下服务端的mac地址
记录文件里,也没有记录下数据链路层
头尾的数据0x0000
地址少于8个字节,填充补足8字节0x0800
协议类型
指定数据链路类型
列出本机支持的类型1
2
3
4$ tcpdump -L
Data link types for ens3 (use option -y to set):
EN10MB (Ethernet)
DOCSIS (DOCSIS) (printing not supported)
指定以太网协议tcpdump udp port 9999 -i ens3 -y EN10MB -w ./udp.cap
1 | 00000000: d4c3 b2a1 0200 0400 0000 0000 0000 0000 ................ |
指定数据链路类型后,DLT字段主机序列变为0x00000001
,类型为DLT_EN10MB
指定数据链路类型后,同时记录下服务端mac地址、客户端mac地址
https://www.tcpdump.org/manpages/tcpdump.1.html
https://www.tcpdump.org/manpages/pcap-savefile.5.html
https://www.tcpdump.org/linktypes.html
https://www.tcpdump.org/linktypes/LINKTYPE_LINUX_SLL.html
tcpdump文件格式分析
Linux cooked-mode capture 格式转换
tcpdump抓包分析
网络层
格式
1 | 0 1 2 3 |
4500 0021 783d 4000 4011 6a1e ac11 0018 ac11 0036
4
: 版本,IPv45
: 头长度,5个32位,共20字节00
: 区分服务21
: 长度,33字节783d
:ID4000
:0b01000000
不分片,偏移为040
: 生存时间TTL,646a1e
:检验和11
:协议,17(udp)ac11 0018
:来源ipac11 0036
:目标ip
检验和
ip数据报,检验和仅检查头部是否正确:1
2
3
4
5
6
7
8
9
10
11
12 0100010100000000 4500
0000000000100001 0021
0111100000111101 783d
0100000000000000 4000
0100000000010001 4011
0000000000000000 0000
1010110000010001 ac11
0000000000011000 0018
1010110000010001 ac11
+ 0000000000110110 0036
--------------------
00101001010111011111 295DF
进位部分截断,加回低位,再取反:1
2
3
4
5
6
700101001010111011111 295DF
+ 0010 0002
--------------------
1001010111100001 95E1
XOR 1111111111111111 ffff
--------------------
0110101000011110 6a1e
运输层
格式
1 | 0 7 8 15 16 23 24 31 |
9f66 270f 000d 9d1b 6865 6c6c 6f
9f66
:40806 来源端口270f
:9999 目标端口000d
:13 UDP报文长度9d1b
:检验和6865 6c6c 6f
:hello
检验和
pseudo header:1
2
3
4
5
6
7
8 0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| source address |
+--------+--------+--------+--------+
| destination address |
+--------+--------+--------+--------+
| zero |protocol| UDP length |
+--------+--------+--------+--------+
假头(不传)+真头+数据,计算检验和:
1 | 1010110000010001 ac11 |
进位部分截断,加回低位,再取反:1
2
3
4
5
6
700110110001011100001 362E1
+ 0011
--------------------
0110001011100100 62E4
XOR 1111111111111111 ffff
--------------------
1001110100011011 9D1B