1. 使用docker启动一个tcp应用
参考:https://blog.csdn.net/LONG_Yi_1994/article/details/141175526
2. 获取容器id
docker ps |grep gochat
3. 获取容器的 PID
首先,你需要获得容器的进程 ID(PID)。可以使用 docker inspect 命令来实现:
docker inspect --format '{{.State.Pid}}' 37cb595d0370
这个命令将返回容器的 PID。
4. 查看网络接口信息
使用 nsenter 命令进入容器的网络命名空间。你需要安装 nsenter 工具(通常在 util-linux 包中)。假设你获得的 PID 是 12345:
sudo nsenter -t 12345 -n ip link
这个命令会列出容器内部的所有网络接口信息。
5. 解析网络接口信息
在 ip link 命令的输出中,容器的网络接口名称通常是以 eth 开头的,例如 eth0。你会看到类似如下的输出:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
252: eth0@if253: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default link/ether 02:42:ac:11:00:09 brd ff:ff:ff:ff:ff:ff link-netnsid 0
eth0 是容器内的网络接口名称。
lo 是容器的回环接口,不用于外部通信。
5. 查找主机上的 veth 接口
查找 veth 接口:
使用 ip link 命令列出主机上的所有网络接口,并找到 veth 开头的接口即为容器在主机上的网络接口。
6. 开始抓包
tcpdump -i vethfac5fb8 -S
-S表示显示绝对序列号。
7. 使用telnet建立连接
telnet localhost 8090
8. 分析包
执行步骤7后,即可抓到建立tcp连接的三次握手包,如下图: