linux抓包经历
背景
java程序运行在docker内,想抓一下程序的网络请求情况。
deepseek给的方案
可以通过以下步骤获取Java程序在Docker容器中访问的外部接口:
方法一:使用抓包工具(如 tcpdump)
-
确定容器的网络接口
获取容器IP:docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <容器名或ID>
-
在宿主机上抓包
监听容器流量(假设容器使用默认的桥接网络docker0
):sudo tcpdump -i docker0 host <容器IP> -w capture.pcap
触发Java程序运行后,停止抓包。使用Wireshark分析
capture.pcap
文件,过滤HTTP/HTTPS流量(如http.request.uri
或tls.handshake.extensions_server_name
)。
方法二:使用容器内网络工具
-
进入容器安装工具
docker exec -it <容器名或ID> /bin/bash
安装
net-tools
或iproute2
:apt-get update && apt-get install net-tools # Debian/Ubuntu apk add net-tools # Alpine
-
实时监控连接
查看Java进程的实时连接:netstat -tunap | grep java
或使用
ss
(更现代的工具):ss -tunp | grep java
方法三:使用 iptables 记录连接
- 添加iptables规则
在宿主机上记录容器的出站连接:
查看日志:sudo iptables -I OUTPUT -s <容器IP> -j LOG --log-prefix "Container-Outgoing: "
tail -f /var/log/syslog | grep "Container-Outgoing:"
方法四:检查连接跟踪(conntrack)
查看所有现有连接:
sudo conntrack -L -s <容器IP>
方法五:使用Docker日志(若程序输出网络请求)
查看容器日志:
docker logs <容器名或ID>
总结建议
- 快速抓包分析:推荐使用方法一(
tcpdump
),直接捕获流量并分析目标IP/端口。 - 实时连接监控:使用方法二(
netstat
/ss
)在容器内查看实时连接。 - 长期监控:使用方法三(
iptables
)记录所有出站请求。
注意事项
- 加密流量(HTTPS):抓包仅能获取目标域名/IP和端口,无法解密内容,需额外配置MITM工具(如Charles/Fiddler)进行中间人解密(需Java信任代理CA证书)。
- 容器权限:部分操作可能需要
--cap-add=NET_ADMIN
或特权模式运行容器。
实战
我的容器使用的是host方式不是桥接
宿主linux会有很多块网卡,根据ip确定抓那一块
sudo tcpdump -i eth1 -w eth1.pcap
抓完之后,将eth1.pcap文件下载下来,拖入wireshark查看即可
相关资料
https://blog.csdn.net/buyaore_wo/article/details/69787715
https://www.cnblogs.com/willingtolove/p/12519490.html