这可能看起来像一个愚蠢的问题,但我正在尝试使以下操作发挥作用:
- 我已正确配置 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。