WSL Docker 抓包
首先写出结论:
- WSL 的 Docker 中无法抓 WSL 和 Windows 的包,但是可以用于测试 Docker 抓包
- 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>