如何限制来自同一服务器中其他 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)并且只公开你需要的端口。
当前您使用的是共享的“默认”网络。
我正在使用 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)并且只公开你需要的端口。 当前您使用的是共享的“默认”网络。