FirewallD 和 docker:阻止端口被公开访问

FirewallD 和 docker:阻止端口被公开访问

我在尝试限制对当前使用 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。到目前为止我已经做了但没有成功的事情:

  1. 首先,我尝试将 docker zone 的目标更改为,default 这只会破坏两个应用程序之间的通信,而不会造成其他影响
  2. 添加了丰富的规则: 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 路径,则通过根位置(“/”)传递流量。

这还允许您运行服务的多个副本,所有副本都侦听相同的端口,同时仍然能够通过反向代理公开它们(并过滤流量)。

相关内容