乐趣区

关于docker:怎么对容器抓包

微信公众号: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 上剖析。

退出移动版