如何利用 UFW 阻止来自 docker 的已发布端口

如何利用 UFW 阻止来自 docker 的已发布端口

这可能看起来像一个愚蠢的问题,但我正在尝试使以下操作发挥作用:

  • 我已正确配置 UFW,仅允许某些源 IP 访问我的本地服务
  • 将此服务迁移到具有已发布端口的 Docker 容器后,该端口将公开发布

因此,每个主机现在都可以从任何地方访问已发布的端口。

如何限制通过 UFW 对这个已发布的 docker 端口的访问?

该服务使用的具体端口是3333

我尝试使用 来-p 127.0.0.1:3333:3333将端口绑定到 localhost。但这样我就需要一个代理才能从 UFW 限制的公共端口转到localhost:3333。我也尝试使用iptables -j REDIRECT,但无法让它工作。

因此,这不是容器限制外部访问的问题,而是外部进入容器的问题。

我想保留我当前的 UFW 设置,并为 Dockerized 服务提供明确的白名单。

答案1

在 1.5+ 版的新 docker iptables 解决方案推出之前,我找到了一种更好、更一致的解决方案。

通过不使用FORWARD链条而是使用其他的规则来处理docker 会修改 iptable 链,因此在 docker 容器重启后仍会存在。如果有人需要它:这解决了我在主机上拥有自定义 iptable 规则和 docker 的问题:

iptables -I PREROUTING 1 -t mangle ! -s [SOURCEIP_TO_ALLOW] -p tcp --dport [PORT] -j ACCEPT
iptables -I PREROUTING 2 -t mangle -p tcp --dport [PORT] -j DROP

诀窍在于 PREROUTING 和 mangle 步骤。这样,我就可以从主机上的 PORT 上的 SOURCEIP_TO_ALLOW 允许,并禁止其他人进入...!

答案2

您有三个选项可以从 docker 发布/公开端口:

  • 不指定 EXPOSE 或 -p 意味着容器中的服务只能在容器内部访问。
  • 指定 EXPOSE 和 -p 容器中的服务可从任何地方访问。
  • 仅指定 EXPOSE。该服务在 docker 外部不可访问,但只能在 docker 容器之间进行容器内部通信。

如果您的主机中的防火墙阻止了所有到端口 3333 的传入连接,但您希望拥有全球访问权限,那么您可以使用 UFW 打开端口或为指定的源主机打开端口,如下所示:

  • ufw 允许 3333-这将为来自任何来源的 TCP 和 UDP 连接打开端口 3333。
  • ufw 允许从 1.2.3.4 到任何端口 3333 - 这将只允许从源 IP 1.2.3.4 到主机中任何 IP 的访问端口 3333。

请注意,您还可以指定与 proto 一起使用的协议,否则 ufw 将同时打开 tcp 和 udp。

相关内容