为什么即使启用了 UFW,我也可以通过公共 IP 访问 redis?

问题描述

我有分别运行 Django 和 Redis 的 Droplet A 和 Droplet B。它们都位于数字海洋上的 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 droplet 进行交互。但是我怀疑 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",}
}

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

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

然后,如果我在 chrome public_ip:6379 中输入 Droplet 的公共 IP 地址,我的 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 和 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 的流量。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...