【问题标题】:What iptable rules do I need in order to allow a docker network to connect to a host port?为了允许 docker 网络连接到主机端口,我需要哪些 iptable 规则?
【发布时间】:2018-04-03 19:57:06
【问题描述】:

已解决:请参阅我的评论。

我已经阅读了How to access host port from docker container,它建议添加iptables -A INPUT -i docker0 -j ACCEPT 的 iptable 规则,但我只想在特定端口上允许这样做。

我有以下 iptable 规则:

-A INPUT -s 127.0.0.0/8 -p tcp -m tcp --dport 3000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3000 -j DROP

所以目的是只允许来自本地主机或 docker 容器的连接,不允许外部连接到端口 3000。

我尝试过:-A INPUT -p tcp -m tcp -i docker0 --dport 3000 -j ACCEPT,但是在使用telnet 172.17.0.1 3000 进行检查时,这不允许从容器访问。

我现在如何允许 docker 访问 localhost(主机)上的这个端口?

【问题讨论】:

  • 对不起,我是个白痴 - telnet 172.17.0.1 3000 连接正常 - 只是没有显示我错误地认为失败的任何明显“输出”。如果有人正在发布答案,请保持打开状态。
  • 现在你怎么知道我正在输入答案? :)

标签: docker iptables


【解决方案1】:

我现在如何允许 docker 访问 localhost(主机)上的这个端口?

如果您希望容器拥有自己的网络命名空间,则不能。每个独立的网络命名空间都有自己的命名空间环回接口 (127.0.0.1),与主机和其他容器不同。

当容器尝试与主机上的应用程序通信时,它需要连接到主机的可路由 IP 之一。因此,您需要允许来自 docker0 接口的流量与您的其他接口通信的 iptables 规则,并且应用程序需要与主机接口通信,而不是 127.0.0.1。

或者您可以跳过网络命名空间,将 docker 容器直接附加到主机的网络命名空间--net host。这消除了一层容器隔离,并且不允许您使用 docker 网络与其他容器通信。但它确实允许您直接与容器内的 127.0.0.1 对话,并在主机上引用相同的环回接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2019-06-26
    • 2016-02-20
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多