惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
H
Help Net Security
GbyAI
GbyAI
博客园_首页
G
Google Developers Blog
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
月光博客
月光博客
美团技术团队
B
Blog RSS Feed
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
博客园 - 叶小钗
有赞技术团队
有赞技术团队
T
The Blog of Author Tim Ferriss
Engineering at Meta
Engineering at Meta
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
宝玉的分享
宝玉的分享
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
云风的 BLOG
云风的 BLOG
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Proofpoint News Feed

OhYee 博客

小鹏辅助驾驶测评|OhYee 博客 小鹏非支持手机开启自动解锁|OhYee 博客 使用函数计算实现 301 重定向|OhYee 博客 针对 HTML 内容使用 Ant Design 图片弹框|OhYee 博客 博客进程泄露及僵尸进程解决|OhYee 博客 蓝易云服务器体验|OhYee 博客 SSH 调起本地 VSCode|OhYee 博客 【2022 秋招内推】阿里云后端研发工程师|OhYee 博客 使用函数计算获取 IP 地址信息|OhYee 博客 正确获取客户端 IP/HTTP Header 也可能重复|OhYee 博客 评测 Oculus Quest2 及 BigScreen|OhYee 博客 NextJS 热重载保留状态|OhYee 博客 如何优雅地贴 gist 代码|OhYee 博客 Linux 精细化文件权限|OhYee 博客 VSCode 容器开发环境|OhYee 博客 Clash 的不兼容更新排查|OhYee 博客 Zeek 导出 PCAP|OhYee 博客 记一次 ssh 配置问题|OhYee 博客 Git Commit 规范化工具|OhYee 博客 谈谈《星之卡比-探索发现》|OhYee 博客 VSCode 快捷键绑定 Shell 命令|OhYee 博客 ASN.1 语法及 X.509 证书格式解析解析|OhYee 博客 腾讯企业邮箱忽略 MX 记录发信|OhYee 博客 Chrome/Edge 标签组插件|OhYee 博客 【应届内推】阿里云后端研发工程师|OhYee 博客 损坏的 Typecho 备份处理为 JSON|OhYee 博客 VS Code VIM 插件高效使用|OhYee 博客 SSH 正反向代理|OhYee 博客 Let's Encrypt 根证书过期引发的问题|OhYee 博客 OpenWRT 忽略内核依赖|OhYee 博客
WSL Docker 抓包|OhYee 博客
2021-04-08 · via OhYee 博客

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>

参考资料