命令行辅助工具
# 用-s指定抓多少字节
# 指定抓多少字节。等同于Wireshark的Capture|Options|Limit each packet to ...
tcpdump -i eth0 -s 200 -w file.pcap
# 只抓指定IP的包
tcpdump host 192.168.1.121 -w d.pcap
# 只抓80端口的包,通常普通HTTP请求:注意这里的`tcp port 80`一起构成捕获条件
tcpdump -i eth0 tcp port 80
# 查找路由表
netstat -rn
# 或
route
# 发送1个指定大小的ping包
ping 192.168.1.121 -nc 1 -s 1
Wireshark过滤器
顾名思义,查询过滤器是对结果进行过滤,而捕获过滤器则表示只抓取满足条件的包。
查询过滤器
tcp.port == 8080
tcp.port==80 && ip.addr==192.168.1.112
# 排除某个地址的包时应该用如下表达式,而非ip.addr!=192.168.1.121,后者不会过滤任何包
!(ip.addr==192.168.1.121)
http.request.method==POST
http.host contains "baidu"
# 正则匹配dob
ftp.request.arg matches "(?i)(cat|dog)"
# 相邻两帧时差大于1秒的包
frame.time_delta > 1
除以上过滤器外,还可以在Wireshark的右键选择Follow Tcp Stream
或Follow Tcp Stream
过滤一次TCP/UDP请求。
捕获过滤器
host 192.168.1.112
not host 192.168.1.112
net 192.168.1.1/24
# 端口
port 80
# 端口范围
portrange 80-8080
# TCP端口
tcp port 8080
TCP协议
MTU
MTU(Max Transfer Unit)的计算公式为
MTU=MSS+TCP头+IP头
其中MSS即Max Sigment Size。TCP连接建立进行三次握手时会协商MTU值。
Seq
TCP包的两端各自维护一个Seq号,以便在收到乱序包时可以重新排序。
发送方发出的相邻两个包的Seq号的关系是
seq_n=seq_c+length_c
接收方响应ack的计算方式为,
ack=seq_r+length_r
表示相应包及之前的包已经收到
TCP标志位
- SYN 发起连接请求
- FIN 请求终止连接
- RST 重置混乱连接或拒绝无效请求
TCP连接的建立与终止
TCP建立连接时使用的三次握手而非两次握手,是为了防止建立无效连接。TCP终止连接需要四次握手。
TCP窗口大小
TCP窗口大小(TCP window size)声明当前发送方的可用缓存。对方发送包时,不会超过此大小。
与MSS的关系:窗口大小决定了同时能发送多少字节,MSS决定了一个TCP包的大小
由于TCP头只留了16bit给TCP窗口(最多表示65535)值,所以为了表示更大的窗口值,需要用Window size scaling factor
表示。将其乘以Window size value
才是真实的窗口大小。
丢包
RTO:原始包发送至重传的时间差
在本机模拟丢包:
tc qdisc change dev eth0 root netem loss 2%
nslookup
DNS查询默认使用UDP,在nslookup
里用如下方式强制使用TCP查询:
nslookup
> set vc
> example.com
检查否存在暴露的内网主机:
nslookup
> set type=srv
> example.com
tshark
# 统计TCP会话
tshark -n -q -r d.pcap -z "conv,tcp"
# 使用显示过滤器
tshark -r test.pcapng -2 -R "ip.addr==192.168.1.112"
# 统计重传
tshark -n -q -r test.pcap.pcapng -z "io,stat,0,tcp.analysis.retransmission"
注意tskark的显示过滤器与抓包过滤器格式不一样:
tshark -i eth0 -f 'tcp' -n -q -w d.pcap
拆分大包
# 每8秒拆分为1个包
editcap retran.pcap out.cap -i 8
问题
- 使用
sudo
在后台抓包:nohup sudo -b tcpdump -i eth0 tcp port 80 -w http.pcap