我在尝试限制对当前使用 Centos8 和 Firewalld 运行的 2 个 docker 容器的访问时遇到一些问题。首先,容器具有以下配置:
services:
service1:
ports:
- 1234:1234
service2:
ports:
- 6969:6969
docker 区域具有以下(默认)配置:
docker (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: br-b2ef50b272a2 docker0
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
当离开这样的东西时,如果我运行 docker-compose up,应用程序正在运行并且它们之间存在通信,但它们的端口也可以通过公共互联网访问。我的最终目标是在应用程序之间进行内部通信,但阻止公众对其端口的访问,并且只允许特定的 IP。到目前为止我已经做了但没有成功的事情:
- 首先,我尝试将 docker zone 的目标更改为,
default
这只会破坏两个应用程序之间的通信,而不会造成其他影响 - 添加了丰富的规则:
rule family="ipv4" source NOT address="X.X.X.X" port port="6969" protocol="tcp" reject
规则被忽略。
有没有办法使用 FirewallD 和 docker zone 阻止对这些端口的访问,同时这两个服务可以相互通信?
答案1
您可以将反向代理服务添加到您的设置中,然后停止公开 service1 和 service2 端口并让反向代理过滤流量。
如果不公开端口,容器仍然可以相互通信(在同一个 docker 网络中),并通过内置 docker DNS 按服务名称解析 IP。 (例如服务1、服务2)。
在这种情况下,您的撰写文件大致如下所示:
services:
service1:
service2:
proxy:
ports:
- 80:80
- 443:443
- <extra ports>:<extra ports>
例如,您可以使用带有额外配置的 nginx 容器:(只需确保代理配置为侦听您在其服务下指定的外部端口。):
location /service1 {
allow X.X.X.X;
deny all;
proxy_pass http://service1:1234;
}
location /service2 {
allow X.X.X.X;
deny all;
proxy_pass http://service2:6969;
}
或者,您可以在 nginx 配置下创建两个“服务器”指令,每个指令监听一个服务端口,然后如果您不想添加 URL 路径,则通过根位置(“/”)传递流量。
这还允许您运行服务的多个副本,所有副本都侦听相同的端口,同时仍然能够通过反向代理公开它们(并过滤流量)。