前言¶
距离 上次首次介绍 ptcpdump 项目已经过去好几个月了, 最近这几个月我一直在持续开发这个项目, 本文将按变更顺序介绍一下从上次的 v1.16 版本到最新的 v1.26 版本期间所发布的主要变更内容。
主要变更内容¶
兼容老版本的 TencentOS/OpenCloudOS 系统¶
根据用户 反馈 , 之前的版本无法在老版本的 TencentOS/OpenCloudOS 上运行, 当前最新版本已经支持了如下 TencentOS/OpenCloudOS 系统版本: OpenCloudOS 7/8/9 and TencentOS Server 2.4/2.6/3.1/3.2 。
在输出中增加父进程信息¶
老版本:
13:44:41.529003 eth0 In IP (tos 0x4, ttl 45, id 45428, offset 0, flags [DF], proto TCP (6), length 52) 139.178.84.217.443 > 172.19.0.2.42606: Flags [.], cksum 0x5284, seq 3173118145, ack 1385712707, win 118, options [nop,nop,TS val 134560683 ecr 1627716996], length 0 Process (pid 553587, cmd /usr/bin/wget, args wget kernel.org) Container (...) Pod (...)
新版本:
13:44:41.529003 eth0 In IP (tos 0x4, ttl 45, id 45428, offset 0, flags [DF], proto TCP (6), length 52) 139.178.84.217.443 > 172.19.0.2.42606: Flags [.], cksum 0x5284, seq 3173118145, ack 1385712707, win 118, options [nop,nop,TS val 134560683 ecr 1627716996], length 0 Process (pid 553587, cmd /usr/bin/wget, args wget kernel.org) ParentProc (pid 553296, cmd /bin/sh, args sh) Container (...) Pod (...)
支持使用 Dockershim 的老版本 Kubernetes 环境¶
之前的版本无法在使用 Dockershim (准确的说是基于 CRI v1alpha2)的老版本 Kubernetes 环境中获取 Pod 信息,新版本已兼容这种环境。
修复按 Pod 名称过滤时,无法支持包含点号的名称¶
之前的版本中按 Pod 名称过滤时,过滤的名称不能包含英文点号,新版本已兼容包含点号的名称:
--pod-name foo.bar.default
修复按 Pod 过滤时,无法支持包含多个容器的 Pod 的场景¶
之前的版本中按 Pod 过滤时,无法支持 Pod 中存在多个容器的场景,新版本已修复该问题。
支持同时运行多个 ptcpdump 实例¶
之前的版本同时只能运行一个 ptcpdump 进程,当运行多个 ptcpdump 进程时,老的进程将不能正常工作(抓不到任何流量), 新版本已修复该问题,在新版本中可以同时运行多个 ptcpdump 进程,多个 ptcpdump 进程不会出现互相干扰或导致其他进程无法抓包的问题。
新增参数 --micro, --nano, --time-stamp-precision 用于控制输出中的时间格式¶
新增参数 --micro, --nano, --time-stamp-precision ,作用和用法对标 tcpdump。
--micro, --time-stamp-precision=micro:
13:36:05.701978 IP 10.0.2.15.22 > 10.0.2.2.59874: Flags [P.], seq 1370707216:1370707292, ack 4569736, win 62780, length 76
--nano, --time-stamp-precision=nano:
13:36:05.701978488 IP 10.0.2.15.22 > 10.0.2.2.59874: Flags [P.], seq 1370707216:1370707292, ack 4569736, win 62780, length 76
新增参数 -A, -x, -xx, -X, -XX 用于控制数据输出格式¶
新增作用和用法对标 tcpdump 的参数 -A, -x, -xx, -X, -XX 。
-A:
14:36:38.159559 ens33 curl.244103 Out IP 10.0.2.15.53478 > 203.205.254.157.80: Flags [P.], seq 3293023896:3293023966, ack 1986159173, win 64240, length 70, ParentProc [ptcpdump.244094] E..nHL@.@... ..........P.G..vbbEP.......GET / HTTP/1.1 Host: qq.com User-Agent: curl/7.81.0 Accept: */*
-x:
14:36:38.159559 ens33 curl.244103 Out IP 10.0.2.15.53478 > 203.205.254.157.80: Flags [P.], seq 3293023896:3293023966, ack 1986159173, win 64240, length 70, ParentProc [ptcpdump.244094] 0x0000: 4500 006e 484c 4000 4006 1bc4 0a00 020f 0x0010: cbcd fe9d d0e6 0050 c447 8e98 7662 6245 0x0020: 5018 faf0 d6da 0000 4745 5420 2f20 4854 0x0030: 5450 2f31 2e31 0d0a 486f 7374 3a20 7171 0x0040: 2e63 6f6d 0d0a 5573 6572 2d41 6765 6e74 0x0050: 3a20 6375 726c 2f37 2e38 312e 300d 0a41 0x0060: 6363 6570 743a 202a 2f2a 0d0a 0d0a
-xx:
14:36:38.159559 ens33 curl.244103 Out IP 10.0.2.15.53478 > 203.205.254.157.80: Flags [P.], seq 3293023896:3293023966, ack 1986159173, win 64240, length 70, ParentProc [ptcpdump.244094] 0x0000: 0050 56eb bc4e 000c 298e 31f3 0800 4500 0x0010: 006e 484c 4000 4006 1bc4 0a00 020f cbcd 0x0020: fe9d d0e6 0050 c447 8e98 7662 6245 5018 0x0030: faf0 d6da 0000 4745 5420 2f20 4854 5450 0x0040: 2f31 2e31 0d0a 486f 7374 3a20 7171 2e63 0x0050: 6f6d 0d0a 5573 6572 2d41 6765 6e74 3a20 0x0060: 6375 726c 2f37 2e38 312e 300d 0a41 6363 0x0070: 6570 743a 202a 2f2a 0d0a 0d0a
-X:
14:36:38.159559 ens33 curl.244103 Out IP 10.0.2.15.53478 > 203.205.254.157.80: Flags [P.], seq 3293023896:3293023966, ack 1986159173, win 64240, length 70, ParentProc [ptcpdump.244094] 0x0000: 4500 006e 484c 4000 4006 1bc4 0a00 020f E..nHL@.@....... 0x0010: cbcd fe9d d0e6 0050 c447 8e98 7662 6245 .......P.G..vbbE 0x0020: 5018 faf0 d6da 0000 4745 5420 2f20 4854 P.......GET / HT 0x0030: 5450 2f31 2e31 0d0a 486f 7374 3a20 7171 TP/1.1..Host: qq 0x0040: 2e63 6f6d 0d0a 5573 6572 2d41 6765 6e74 .com..User-Agent 0x0050: 3a20 6375 726c 2f37 2e38 312e 300d 0a41 : curl/7.81.0..A 0x0060: 6363 6570 743a 202a 2f2a 0d0a 0d0a ccept: */*....
-XX:
14:36:38.159559 ens33 curl.244103 Out IP 10.0.2.15.53478 > 203.205.254.157.80: Flags [P.], seq 3293023896:3293023966, ack 1986159173, win 64240, length 70, ParentProc [ptcpdump.244094] 0x0000: 0050 56eb bc4e 000c 298e 31f3 0800 4500 .PV..N..).1...E. 0x0010: 006e 484c 4000 4006 1bc4 0a00 020f cbcd .nHL@.@......... 0x0020: fe9d d0e6 0050 c447 8e98 7662 6245 5018 .....P.G..vbbEP. 0x0030: faf0 d6da 0000 4745 5420 2f20 4854 5450 ......GET / HTTP 0x0040: 2f31 2e31 0d0a 486f 7374 3a20 7171 2e63 /1.1..Host: qq.c 0x0050: 6f6d 0d0a 5573 6572 2d41 6765 6e74 3a20 om..User-Agent: 0x0060: 6375 726c 2f37 2e38 312e 300d 0a41 6363 curl/7.81.0..Acc 0x0070: 6570 743a 202a 2f2a 0d0a 0d0a ept: */*....
新增用于编译和运行 ptcpdump 的 Docker 镜像¶
新增用于编译程序的 Docker 镜像: quay.io/ptcpdump/develop:latest 以及用于通过 Docker 运行 ptcpdump 的镜像: quay.io/ptcpdump/ptcpdump:latest
可以通过 make build-bpf-via-docker 和 make build-via-docker 按需编译 eBPF 程序和 ptcpdump 程序。
可以使用类似下面的命令,通过 docker 运行 ptcpdump:
docker run --privileged --rm -t --net=host --pid=host \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ quay.io/ptcpdump/ptcpdump:latest ptcpdump -i any -c 2 tcp
实验性新功能:在对 Go 程序进行抓包时生成相应的 TLS Key Log 文件¶
在新版本中还尝试了一个实验性的功能:在对 Go 程序进行抓包时生成相应的 TLS Key Log 文件。
TLS Key Log 文件又叫 SSLKEYLOGFILE , 在 Wireshark 中对应的是 pre-master secret 配置, 第三方程序可以通过这个文件中记录的信息解密抓取的 TLS 流量。
注意:该功能是一个实验性的功能,只支持 1.18+ 版本的 Go 编译的程序, 并且只支持通过 ptcpdump 运行目标 Go 程序。
可以通过下面两种方法试用这个功能:
通过 --write-keylog-file 参数或者环境变量 SSLKEYLOGFILE 指定 SSLKEYLOGFILE 文件的保存路径:
sudo ptcpdump -i any --write-keylog-file /tmp/keylogfile.txt -w /tmp/go.pcapng -- ./gohttpapp
通过指定 --embed-keylog-to-pcapng 参数在保存数据到 pcapng 格式文件时内嵌 SSLKEYLOGFILE 文件内容:
sudo ptcpdump -i any --embed-keylog-to-pcapng -w /tmp/gotls.pcapng -- ./gohttpapp
可以通过 Wireshark 或 tshark 使用记录的 SSLKEYLOGFILE 内容对保存的 TLS 数据进行解密:
$ sudo tshark -r /tmp/go.pcapng -o tls.keylog_file:/tmp/keylogfile.txt | grep HTTP -B 2 Running as user "root" and group "root". This could be dangerous. 18 0.518380586 10.0.2.15 → 13.35.238.63 TLSv1.3 118 Change Cipher Spec, Finished 19 0.519208290 13.35.238.63 → 10.0.2.15 TCP 60 443 → 47606 [ACK] Seq=5508 Ack=340 Win=64240 Len=0 20 0.519914720 10.0.2.15 → 13.35.238.63 HTTP 179 GET /foo/bar HTTP/1.1 $ tshark -r /tmp/gotls.pcapng | grep HTTP -B 2 20 0.525662563 10.0.2.15 → 13.35.238.114 TLSv1.3 118 Change Cipher Spec, Finished 21 0.526138582 13.35.238.114 → 10.0.2.15 TCP 60 443 → 37618 [ACK] Seq=5987 Ack=340 Win=64240 Len=0 22 0.526977836 10.0.2.15 → 13.35.238.114 HTTP 179 GET /foo/bar HTTP/1.1
ptcpdump 计划未来内置支持使用 SSLKEYLOGFILE 对 TLS 数据进行解密的能力, 以及在抓包时实时获取 SSLKEYLOGFILE 并自动解密的能力, 目前暂时只能使用第三方工具实现 TLS 数据解密。
默认输出 TCP Options¶
新版本将默认输出 TCP Options 信息:
老版本:
14:09:54.324433 ens33 curl.26570 Out IP (..).43772 > (..).443: Flags [S], seq 1674193846, win 64240, length 0, ParentProc [ptcpdump.26560]
新版本:
14:09:54.324433 ens33 curl.26570 Out IP (..).43772 > (..).443: Flags [S], seq 1674193846, win 64240, options [mss 1460,sackOK,TS val 2107137325 ecr 0,nop,wscale 7], length 0, ParentProc [ptcpdump.26560]
同时新版本还新增对 TCP SACK (Selective Acknowledgment) 和 TFO (TCP Fast Open) 的支持:
SACK:
19:03:36.220872 IP6 dead:beef:2::2.35288 > dead:beef:2::1.10029: Flags [.], seq 731670714, ack 2274465610, win 201, options [nop,nop,TS val 1253137130 ecr 837820024,nop,nop,sack 1 {2274467010:2274483378},mptcp 12 dss ack 16301812255838552430], length 0
TFO:
19:22:26.586851 IP6 dead:beef:1::2.54040 > dead:beef:1::1.10056: Flags [S], seq 271661201, win 64800, options [mss 1440,sackOK,TS val 2947503028 ecr 0,nop,wscale 7,tfo cookiereq,nop,nop,mptcp 4 capable v1 flags [H]], length 0 19:22:26.591736 IP6 dead:beef:1::1.10056 > dead:beef:1::2.54040: Flags [S.], seq 1229575956, ack 271661202, win 64260, options [mss 1440,nop,nop,sackOK,nop,wscale 7,tfo cookie 29b3cc66639d427d,nop,nop,mptcp 12 capable v1 flags [H] {0xc87438912bc26cb7}], length 0
输出 TCP Options 中的 MPTCP 信息¶
应 MPTCP (MultiPath TCP) 社区的 需求 , 新增对 MPTCP 的支持:
15:31:51.696224 IP 10.0.1.2.60958 > 10.0.1.1.10004: Flags [S], seq 3019570341, win 64240, options [mss 1460,sackOK,TS val 1007819908 ecr 0,nop,wscale 7,mptcp 4 capable v1 flags [H]], length 0 15:31:51.696346 IP 10.0.1.1.10004 > 10.0.1.2.60958: Flags [S.], seq 2367868313, ack 3019570342, win 65160, options [mss 1460,sackOK,TS val 162498895 ecr 1007819908,nop,wscale 7,mptcp 12 capable v1 flags [H] {0x8ea1df6e0d588003}], length 0 15:31:51.696587 IP 10.0.1.2.60958 > 10.0.1.1.10004: Flags [.], seq 3019570342, ack 2367868314, win 502, options [nop,nop,TS val 1007819909 ecr 162498895,mptcp 20 capable v1 flags [H] {0x465bcd01b5d78120,0x8ea1df6e0d588003}], length 0
新增参数 --netns 支持对在其他网络命名空间中的网络接口进行抓包¶
之前的版本只支持对当前网络命名空间中的网络接口进行抓包,新版本通过新增 --netns 参数支持对其他网络命名空间中的网络接口进行抓包:
sudo ptcpdump -i lo --netns /run/netns/foobar sudo ptcpdump -i any --netns /run/netns/foobar sudo ptcpdump -i any --netns /proc/26/ns/net
PcapNg 格式增强:读取/写入网络接口名称和 Inbound/Outbound 信息¶
在之前的版本中使用 ptcpdump -r <file.pcapng> 读取 pcapng 文件不会读取其中记录的网络接口名称以及 Inbound/Outbound 信息, 在新版本中已经解决了这个问题:
$ ptcpdump -r demo.pcapng 14:36:35.880947 ens33 curl.244103 Out IP 10.0.2.15.37668 > 114.114.114.114.53: 44427+ A? qq.com. (24), ParentProc [ptcpdump.244094] 14:36:35.882099 ens33 curl.244103 Out IP 10.0.2.15.37668 > 114.114.114.114.53: 31415+ AAAA? qq.com. (24), ParentProc [ptcpdump.244094] 14:36:35.954613 ens33 curl.244103 In IP 114.114.114.114.53 > 10.0.2.15.37668: 44427 3/0/0 A 203.205.254.157, A 113.108.81.189, A 123.150.76.218 (72), ParentProc [ptcpdump.244094]
同时新版在将捕获的流量信息保存为 PcapNg 格式的文件时,会自动写入 Inbound/Outbound 信息(之前的版本已写入网络接口信息), 即支持 PcapNg 格式的 epb_flags (Enhanced Packet Block Flags Word ) 标记。
如果你对 ptcpdump 有额外的改进或新功能建议,欢迎在评论区或项目 issues 中留言。
Comments