如何利用UFW阻止Docker发布的端口

可能似乎是一个愚蠢的问题,但我试图让以下工作:

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

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

我如何限制通过UFW访问此发布的docker端口?

该服务使用的特定端口是3333

我试图让它工作使用-p 127.0.0.1:3333:3333为了将端口绑定到本地主机。 但是之后我需要一个代理从UFW限制的公共端口到localhost:3333 。 我也尝试使用iptables -j REDIRECT ,但我无法使它工作。

所以这不是容器限制外部访问的问题,而是外部访问容器的问题。

我想保留我的当前UFW设置明确白名单Dockerized服务。

在新的docker iptables解决scheme推出1.5+以上之前,我已经find了一个更好的更一致的解决scheme。

通过不使用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步骤。 这样,我可以从主机上的SOURCEIP_TO_ALLOW允许其他人进入…!

您有三个选项来发布/公开Docker端口:

  • 既不指定EXPOSE也不指定-p意味着容器中的服务只能在容器内部访问。
  • 指定EXPOSE和-p容器中的服务可以从任何地方访问。
  • 仅指定EXPOSE。 该服务不能在docker以外的地方访问,但只能在用于内部集装箱通信的docker集装箱之间访问。

如果主机上有防火墙阻止所有到达端口3333的传入连接,但是您希望在全球范围内访问,则可以使用UFW打开端口或打开指定源主机的端口,如下所示:

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

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