ptcpdump v1.16 ~ v1.26 的主要变更内容

前言

距离 上次首次介绍 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 进程不会出现互相干扰或导致其他进程无法抓包的问题。

支持同时过滤多个进程 PID

现在 --pid 参数支持过滤多个 pid 了:

--pid pid1 --pid pid2

新增参数 --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-dockermake 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