Docker

抓包命令

nsenter

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

  1. #常用用法:
  2. #进入网络命名空间
  3. $ nsenter -t <Pid> -n
  4. #进入挂载命名空间,类似docker exec进入容器
  5. $ nsenter -t <Pid> -m

tcpdump

Tcpdump是Linux原生的抓包工具,常用与在linux系统上抓包,常见用法如下。

  1. # 常用用法:
  2. # 抓取某网卡所有数据包
  3. $ tcpdump -i <网卡名>
  4. # 抓取包含某IP的网络包
  5. $ tcpdump -i <网卡名> -vnn host <IP>
  6. # 抓取某源IP的网络包
  7. $ tcpdump -i <网卡名> -vnn src host <源IP>
  8. # 抓取某目标IP的网络包
  9. $ tcpdump -i <网卡名> -vnn dst host <目标IP>
  10. # 抓取网络包放到文件
  11. $ tcpdump -i <网卡名> -w <文件名>

接下来使用上述命令对容器进行抓包。

找到容器Pid

方法一:docker top

  1. $ docker top <container-id>

对于一般的容器,只有一个进程,Pid如图所示。有的容器里面运行着多个进程,也是取第一行的Pid。

方法二:docker inspect

  1. $ docker inspect <container-id>| grep Pid

可以截取到容器进程的Pid。进入容器的命名空间
接下来通过nsenter命令进入容器进程的网络命名空间。

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

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

使用tcpdump抓包

  1. $ tcpdump -i <网卡名>

使用tcpdump命令对eth0网卡抓包
如果是在kubernetes环境中,需要定位容器的位置,并到对应节点去抓包;

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

查看该pod的容器名

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

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