关于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上剖析。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理