已解决:使用`bind 127.0.0.1`时如何连接到docker网络上的Redis容器?

问题描述 投票:0回答:1

我正在尝试在 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 的安全的?我是在正确的轨道上还是完全误解了?

谢谢, 穆雷

security
1个回答
0
投票

好的。根本原因是我对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 容器。

好吧,无论如何我希望故事就这样结束了!

穆雷

© www.soinside.com 2019 - 2024. All rights reserved.