我正在尝试在 Digital Ocean VM 上部署使用 Redis 的 Quarkus 应用程序(6.2.6,因为我使用 Redis-Graph)。
谁能告诉我当在虚拟机上的私有 Docker 网络上的容器中使用 Redis 时,他们是如何保护 Redis 的安全的?
我的 docker compose 看起来像这样:
version: '3'
services:
redis:
image: redis/redis-stack-server:6.2.6-v9
container_name: flowt-central-redis
command: redis-server /usr/local/etc/redis/redis.conf
volumes:
- redis_data:/data
- ./redis.conf:/usr/local/etc/redis/redis.conf
ports:
- "6379:6379"
networks:
- flowt-net
flowt-central:
image: ghcr.io/my-docker-image/flowt-central-jvm:latest
container_name: flowt-central
# The rest is deleted for brevity ....
networks:
- flowt-net
volumes:
redis_data:
networks:
flowt-net:
name: flowt-net
driver: bridge
我的 Quarkus Redis 客户端使用
quarkus.redis.hosts=redis://flowt-central-redis:6379
连接。
在 redis.conf 中,如果我注释掉
bind 127.0.0.1 -::1
并设置 protected-mode no
(即不安全的方式),则所有内容都会连接,并且我的 Quarkus 应用程序会读取和写入 Redis。一切都好。
当然,Redis 可以通过这种方式被外界访问,因为我禁用了绑定和保护模式。
如果我恢复它们,Redis 会拒绝 Quarkus 连接:
Connection refused: flowt-central-redis/192.168.192.3:6379
。 :-(
所以,从我的阅读看来,我需要在我的 docker 网络上设置一个 IP 地址,这样它就不是随机分配的,然后使用它来连接到 Redis,但也许这也不正确。
我不是第一个需要这样做的人,但还没有找到任何关于将bind与docker网络结合使用的具体帖子或文档。它可能在那里,但我还没有找到它,或者更有可能误解了我正在阅读的内容。
谁能告诉我当在虚拟机上的私有 docker 网络上的容器中使用 Redis 时,他们是如何保护 Redis 的安全的?我是在正确的轨道上还是完全误解了?
谢谢, 穆雷
好的。根本原因是我对redis.conf中的
bind
指令的误解。我以为它绑定到 host
环回,实际上它绑定到 container
环回,这不是我想要的。
此外,我认为当容器在自定义 docker 网络上的 docker run / compose 中暴露端口时,该端口暴露在
network
上,而它实际上暴露在 host
上,无论是否容器是否位于自定义网络上。
感谢 Redis 社区 Discord 上的 @Mephalich 帮助理解这一点。 :-)
因此,解决方案是不要使用
bind
或 protected mode
,而是从我的 docker compose 中完全删除 ports: - "6379:6379"
指令。 Redis 的寻址可以是 redis://flowt-central-redis:6379
或只是 redis://flowt-central-redis
(因为 6379 无论如何都是默认的内部端口)。这样,主机上就不会暴露端口 6379,并且与防火墙阻止一起,无法从外部访问 Redis 容器。
好吧,无论如何我希望故事就这样结束了!
穆雷