WSL Docker 抓包

首先写出结论:

  1. WSL 的 Docker 中无法抓 WSL 和 Windows 的包,但是可以用于测试 Docker 抓包
  2. Docker 可以用来抓包

项目中需要使用 Suricata 来抓包(如果不知道 Suricata 是啥可以理解为 tcpdump。后续为了验证方便,使用 tcpdump 为例),由于环境较为混乱,因此期望使用 Docker 部署,故需要研究如何在 Docker 内进行抓包。

Docker 网络模式

Docker 本质上仍然是运行在机器上的一个程序,因此通过配置,可以控制其网络模式。

Docker 包含有如下几种网络模式:

  • bridge: 默认选项,桥接网络,独立的网络环境
  • host: 取消网络隔离,直接使用主机网络
  • overlay: 允许多个容器共用网络,可以使用 --net=container:web1--link web1 来使得当前容器和 web1 共享网络
  • macvlan: 为容器分配一个 MAC 地址,使其如同网络上的一个物理设备
  • none: 不配置网络

这里由于需要抓取宿主机的流量,因此应该使用 host 模式

Docker 内运行 tcpdump 抓 Docker 外数据

由于大部分情况下,容器内外环境隔离,容器内的操作对宿主机只是普通用户权限(尽管在容器内是 root)。当监听宿主机 eth0 接口时,需要宿主机 root 权限,需要使用 --privileged 来给对应容器权限

下面,构建一个简单的 tcpdump 镜像,并启动监听

echo -e "FROM alpine\nRUN apk add tcpdump" | docker build -t tcpdump -
docker run --net=host --privileged tcpdump tcpdump -i eth0 -vvv

在大部分情况下(正经 Linux),这里已经可以正确抓到包了。新开一个 Shell,执行 curl www.baidu.com,就可以看到对应的内容。

但是,由于 WSL Docker 的实现原理,Docker 服务端实际上运行在一个隔离的 Hyper-V 虚拟机内,因此 host 实际上连接的是这个虚拟机的网络,既不是 WSL、也不是 Windows。因此只能抓到一些无关紧要的内容

如果不是为了正式使用,而是为了测试(一般来说部署服务器应该是正经 Linux),那么可以再构建一个镜像,用于测试。
使用下面的命令,启动一个新的镜像,也将其连接到网络中

echo -e "FROM alpine\nRUN apk add curl" | docker build -t test -
docker run --name test --rm -it --net=host test curl www.baidu.com

执行后,其会在 Docker 服务端对应 Hyper-V 网络环境内执行 curl www.baidu.com,这样就可以被 tcpdump 正确抓取。在正式环境和测试环境下,tcpdump 容器不需要修改,只需要在测试环境添加一个额外的容器即可

下面是 tcpdump 对应的输出

192.168.65.3.36772 > 198.18.0.185.80: Flags [P.], cksum 0xf629 (correct), seq 1:78, ack 1, win 502, length 77: HTTP, length: 77
    GET / HTTP/1.1
    Host: www.baidu.com
    User-Agent: curl/7.74.0
    Accept: */*

03:23:03.327092 IP (tos 0x0, ttl 38, id 49158, offset 0, flags [none], proto TCP (6), length 40)
198.18.0.185.80 > 192.168.65.3.36772: Flags [.], cksum 0x2e1a (correct), seq 1, ack 78, win 65535, length 0
03:23:03.347776 IP (tos 0x0, ttl 38, id 29802, offset 0, flags [none], proto TCP (6), length 1500)
198.18.0.185.80 > 192.168.65.3.36772: Flags [P.], cksum 0x1e86 (correct), seq 1:1461, ack 78, win 65535, length 1460: HTTP, length: 1460
    HTTP/1.1 200 OK
    Accept-Ranges: bytes
    Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
    Connection: keep-alive
    Content-Length: 2381
    Content-Type: text/html
    Date: Thu, 08 Apr 2021 03:23:04 GMT
    Etag: "588604c8-94d"
    Last-Modified: Mon, 23 Jan 2017 13:27:36 GMT
    Pragma: no-cache
    Server: bfe/1.0.8.18
    Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/

    <!DOCTYPE html>

参考资料