怎么给容器抓包

Go语言精选

共 1157字,需浏览 3分钟

 ·

2020-12-01 16:44

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



使用命令


nsenter


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



#常用用法:

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

#进入挂载命名空间,类似docker exec进入容器
$ nsenter -t -m




tcpdump


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



常用用法:

抓取某网卡所有数据包

$ tcpdump -i <网卡名>

抓取包含某IP的网络包

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

抓取某源IP的网络包

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

抓取某目标IP的网络包

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

抓取网络包放到文件

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




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


找到容器Pid

方法一


docker top


$ docker top 


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



有的容器里面运行着多个进程,也是取第一行的Pid。




方法二


docker inspect


$ docker inspect | grep Pid


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




进入容器的命名空间


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


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


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




使用tcpdump抓包





$ tcpdump -i <网卡名>


使用tcpdump命令对eth0网卡抓包




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


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




查看该pod的容器名


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





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



推荐阅读


福利

我为大家整理了一份从入门到进阶的Go学习资料礼包,包含学习建议:入门看什么,进阶看什么。关注公众号 「polarisxu」,回复 ebook 获取;还可以回复「进群」,和数万 Gopher 交流学习。

浏览 54
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报