将传出TCP连接映射到Docker容器

时间:2018-08-02 16:46:46

标签: docker tcpdump

我收集了tcpdump记录的IPv4流量集合,并且我有兴趣将给定的传出连接映射到同一台机器上的原始Docker容器。我可以查看TCP源端口,但是我不清楚如何询问Docker哪个容器正在使用此端口。如何才能做到这一点? 谢谢

2 个答案:

答案 0 :(得分:0)

您可以filter个发布或公开给定端口的容器:

docker ps --filter=expose=3306

或使用format开关获取具有已使用端口的容器ID列表:

docker ps --format "{{.ID}}: {{.Ports}}"

答案 1 :(得分:0)

我有一个确切的问题,我想知道哪个容器是特定Postgresql数据库查询的客户端。这些是我为找到我感兴趣的TCP连接源所采取的步骤。

在postgres查询pg_stat_activity中,确定您关注的查询的client_addrclient_port

SELECT * FROM pg_stat_activity;

现在您知道源ip(client_addr)了,您可以切换到此框并确定docker使用的网络接口:

ip addr

在我的情况下是docker0。现在,我们可以使用数据库连接的源端口(client_port)查找容器ip地址:

tcpdump -i docker0 src port 52282
 02:41:16.257106 IP 172.17.0.15.52282 > 192.168.2.119.postgres: Flags [P.] ...

现在,我们需要确定此源IP(172.17.0.15)属于哪个容器,为此,我们可以使用带有过滤器的docker inspect命令:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container

我们为每个正在运行的容器循环运行此命令,并为要查找的ip循环运行grep:

for name in $( docker ps --format '{{.Names}}' ); do echo -n "$name => " && docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $name; done | grep 172.17.0.15
my-container => 172.17.0.15

现在,我们知道容器my-container是我们感兴趣的流量的来源。