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