微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么即使启用了 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 的流量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。