怎么对容器抓包

.container .card .information strong · · 632 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

微信公众号:LinuGo,欢迎关注

在生产中,容器为了轻量级,里面并没有封装一些ip,ping这些基础命令,这时候可以通过进入容器的网络命名空间来执行命令。当然,也可以用这种方式对容器进行抓包。

使用命令介绍

  • nsenter
nsenter命令用于进入指定进程的命名空间,包括最常用的挂载命名空间和网络命名空间。适用于容器这种特殊的进程。
#常用用法:

#进入网络命名空间
$ nsenter -t <Pid> -n 

#进入挂载命名空间,类似docker exec进入容器
$ nsenter -t <Pid> -m
  • tcpdump
tcpdump是Linux原生的抓包工具,常用与在linux系统上抓包,常见几种用法如下。
# 常用用法:

# 抓取某网卡所有数据包

$ tcpdump -i <网卡名>

# 抓取包含某IP的网络包

$ tcpdump -i <网卡名> -vnn host <IP>

# 抓取某源IP的网络包

$ tcpdump -i <网卡名> -vnn src host <源IP>

# 抓取某目标IP的网络包

$ tcpdump -i <网卡名> -vnn dst host <目标IP>

# 抓取网络包放到文件

$ tcpdump -i <网卡名> -w <文件名>

接下来介绍一下如何使用上述命令对容器进行抓包。

1.找到容器Pid

  • 方法一

使用docker top命令

$ docker top <container-id>

对于一般的容器,只有一个进程,Pid如图所示。

有的容器里面运行着多个进程,一般也是取第一行的Pid,对于多行的可以查看后面CMD启动容器的进程,取前面对应的Pid。

  • 方法二

使用docker inspect查看

$ docker inspect <container-id>| grep Pid

该命令可以截取到容器进程的Pid。

2.进入容器的命名空间

接下来通过nsenter命令进入容器进程的网络命名空间。

$ sudo nsenter -t <进程标识符Pid> -n

此时使用ifconfig命令查看到的就是该容器的网卡信息。

3.使用tcpdump抓包

$ tcpdump -i <网卡名>

使用tcpdump命令对eth0网卡抓包

如果是在kubernetes环境中,需要定位容器的位置,并到对应节点去抓包;

$ kubectl get pod -n <命名空间> <pod名> -o wide

查看该pod的容器名

$ kubectl get pod -n <命名空间> <pod名> -o yaml | grep containerID

继续按照上述方式去抓容器的包,最后把抓到的包放到wireshark上分析。


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:.container .card .information strong

查看原文:怎么对容器抓包

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

632 次点击  
加入收藏 微博
1 回复  |  直到 2021-01-06 12:41:52
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传