如何限制来自同一服务器中其他 dockerized 应用程序的 dockerized MongoDB 连接并拒绝 public 访问 27017

How to restrict connections to dockerized MongoDB from other dockerized application in the same server and deny public access to 27017

我正在使用 Orion Context Broker(在 docker 容器中),我需要它连接到 MongoDB(在它自己的 docker 容器中)。同时,我必须拒绝所有从外部源到 27017 的传入流量,因为在 运行 之后 docker-compose 端口 27017 被“暴露”给 public.

以上所有使用 Ubuntu 20.04.

这是我的 docker-compose.yml 文件

version: "3.5"
services:
  orion:
    image: fiware/orion-ld
    hostname: orion
    container_name: fiware-orion
    expose:
      - "1026"
    ports:
      - "1026:1026"
    depends_on:
      - mongo-db
    command: -dbhost mongo-db -logLevel DEBUG

  mongo-db:
    image: mongo:3.6
    hostname: mongo-db
    container_name: db-mongo
    ports:
      - "27017:27017"
    networks:
      - default
    command: --nojournal
    volumes:
      - mongo-db:/data

volumes:
  mongo-db: ~

172.18.0.3 是给 Orion 的 docker 容器的内部 IP。所以我尝试在 docker-compose 文件中将 --bind_ip 172.18.0.3 添加到 command mongo_db 参数,但这会中断 docker-compose up 过程并出现以下错误:

db-mongo | 2022-01-12T13:17:56.650+0000 E STORAGE [initandlisten] Failed to set up listener: SocketException: Cannot assign requested address

这是我的 ubuntu 防火墙规则(我刚刚得知 docker 绕过了 [*])

OpenSSH                    ALLOW       Anywhere
1026                       ALLOW       Anywhere
27017                      DENY        Anywhere
27017                      ALLOW       127.0.0.1
27017                      ALLOW       172.18.0.3
OpenSSH (v6)               ALLOW       Anywhere (v6)
1026 (v6)                  ALLOW       Anywhere (v6)
27017 (v6)                 DENY        Anywhere (v6)

[*] https://www.techrepublic.com/article/how-to-fix-the-docker-and-ufw-security-flaw/ 我也做了教程建议的修复,但是如果重新启动 docker 然后(出于某种未知原因)我停止访问 1026 端口,这应该是唯一的 public 端口。

Compose ports: 设置使容器可以从外部访问 Docker space。容器之间的连接没有必要(或使用)。删除这个应该可以满足你的需求。

version: '3.8'
services:
  orion:
    image: fiware/orion-ld
    ports:
      - "1026:1026"  # accessible from host port 1026
    depends_on:
      - mongo-db
    command: -dbhost mongo-db -logLevel DEBUG
    #  same hostname ^^^^^^^^ and default MongoDB port 27017
# vvvvvvvv
  mongo-db:
    image: mongo:3.6
    command: --nojournal
    volumes:
      - mongo-db:/data
    # no ports:, not accessible from outside Docker

volumes:
  mongo-db:

(我还从此设置中删除了不必要的 container_name:hostname:networks:expose: 选项;它们没有区别,Compose 堆栈应该没有它们也能正常工作。)

将它放在自己的网络上(即新的 docker 网络:orion_net)并且只公开你需要的端口。 当前您使用的是共享的“默认”网络。