【问题标题】:Why am I able to access redis over public IP even with UFW enabled?为什么即使启用了 UFW,我也能够通过公共 IP 访问 redis?
【发布时间】:2021-07-20 17:08:55
【问题描述】:

我有 Droplet A 和 Droplet B 分别运行 Django 和 Redis。它们都位于数字海洋上的 VPC 上,并且具有公共和私有 IP 地址。

下面是我的 redis docker-compose。我正在尝试将容器 redis 端口映射到主机端口,以便可以通过 VPC 连接到它。

redis:
    restart: always
    image: redis
    command: ["redis-server", "--appendonly", "yes"]
    volumes:
        - redis_data:/data
    ports:
        - 6379:6379

在 Django 上 - 也连接到 VPC,我是这样连接到 redis 的:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://private_ip:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        },
    }
}

这行得通 - 我能够与我的 redis 液滴交互。但是我怀疑ports: 6379:6379实际上可能会打开redis droplet到互联网,果然,如果我尝试通过公共IP地址连接,这也可以。即使我在浏览器中输入 droplet 的公共 IP 地址,如下所示:public_ip:6379,我的 redis 安装仍将其检测为潜在的安全威胁——请求以某种方式通过。我如何阻止所有对 redis droplet 的 http/public 请求,并且只允许通过 VPN 上的私有 ip 进行流量?

这也有效:

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://public_ip:6379",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        },
    }
}

更新: 在 Droplet B (redis) 上,这是来自 UFW 的读数

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)     

然后,如果我将液滴的公共 IP 地址键入 chrome,public_ip:6379,我的 docker 读数会这样说:


It looks like somebody is sending POST or Host: commands to Redis. This is likely due to an attacker attempting to use Cross Protocol Scripting to compromise your Redis instance. Connection aborted.

不仅如此,通过公网IP连接redis droplet真的有效吗?

【问题讨论】:

    标签: docker networking redis digital-ocean ufw


    【解决方案1】:

    Docker 和 UFW 之间存在问题。 UFW 不控制 Docker 打开的端口,不幸的是,这种情况也不会显示在 ufw 状态中。有很多建议的解决方案,你可以用谷歌搜索,但我发现对我最有用的是:

    https://jorisvergeer.nl/2019/11/03/let-docker-and-ufw-work-nicely/

    但是,由于您使用的是 DigitalOcean,因此更简单的方法可能是创建一个 DigitalOcean 防火墙,它只允许授权 IP 在允许的端口访问 Droplet B。设置好防火墙后,将 Droplet B 放入其中,这样可以很好地控制到 Droplet B 的流量。

    【讨论】:

      猜你喜欢
      • 2017-05-20
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 2021-03-01
      • 2022-08-05
      • 1970-01-01
      • 2020-02-02
      • 2014-05-23
      相关资源
      最近更新 更多