【问题标题】:Map outgoing TCP connection to Docker container将传出 TCP 连接映射到 Docker 容器
【发布时间】:2018-08-02 16:46:45
【问题描述】:

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

【问题讨论】:

    标签: docker tcpdump


    【解决方案1】:

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

    docker ps --filter=expose=3306
    

    或使用format 开关来获取包含已使用端口的容器 ID 列表:

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

    【讨论】:

    • 感谢您的回复。上述命令确实非常有用,但它们显示给定容器正在侦听的端口,而不是 docker 用于源自容器的流量的端口。
    【解决方案2】:

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

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

    SELECT * FROM pg_stat_activity;
    

    现在你知道了源 ip (client_addr) 你可以 ssh 到这个盒子并确定 docker 使用的网络接口:

    ip addr
    

    就我而言,它是docker0。现在我们可以使用数据库连接的源端口(@98​​7654328@)来查找容器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是我们感兴趣的流量来源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-20
      • 2017-11-10
      • 2022-11-01
      • 2014-09-01
      • 2017-05-19
      • 1970-01-01
      • 2019-04-14
      • 2016-12-28
      相关资源
      最近更新 更多