在 IpV6 上绑定时无法使用主机名连接远程 Redis

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

我在 IpV6 接口上配置并打开了一个远程 Redis 服务器(名为

billy.home
)(以下行位于其 redis.conf 文件中):

bind ::

我可以使用另一台服务器的 IP 地址正确连接:

pi@octo:~ $ host billy.home
billy.home has address 192.168.1.59
billy.home has IPv6 address 2a01:cb14:7e1:f100:6506:b877:d743:f29e
pi@octo:~ $ redis-cli    -h 2a01:cb14:7e1:f100:6506:b877:d743:f29e
[2a01:cb14:7e1:f100:6506:b877:d743:f29e]:6379> 

但是,我无法连接它的主机名

pi@octo:~ $ redis-cli -h billy.home
Could not connect to Redis at billy.home:6379: Connection refused
not connected> 

我猜这是因为 redis 默认尝试在 IPv4 接口上连接。如果我将redis配置更改为

bind 0.0.0.0

然后我就可以连接了。

有没有办法使用 IpV6 通过主机名进行连接?

redis ipv6
1个回答
0
投票

根据Redis源代码(deps/hiredis/net.c):

static int _redisContextConnectTcp() {

    /* DNS lookup. To use dual stack, set both flags to prefer both IPv4 and
     * IPv6. By default, for historical reasons, we try IPv4 first and then we
     * try IPv6 only if no IPv4 address was found. */

}

据我在

redis-cli.c
deps/hiredis/hiredis.c
中看到,在调用此函数之前 would 不会设置“两个”标志。 (也就是说,该功能可用于使用hiredis的其他工具——具体来说,redis-cli不知道如何使用它。)结果是hiredis首先执行仅IPv4的DNS查询,成功了, 因此,hiredis 永远不会尝试 IPv6 或组合查询。

因此,使其工作的唯一方法是 a) 让您的 Redis 服务器同时侦听 IPv4 IPv6;或 b) 创建仅 IPv6 的 DNS 条目;或者 c) 使用 redis-cli 的自定义修补版本(或者我猜是hiredis)。

选项 a):使用

bind 0.0.0.0 ::
监听 IPv4 和 IPv6。 (看来 Redis 禁用了“
bind ::
监听两个”Linux 魔法。)

关于选项 b):如果您的服务器分布在不同的网络中,因此无法访问 IPv4,并且您正在使用其他安全机制(比如说 IPsec 或至少是基本防火墙),那么它仍然在 DNS 记录中包含“私有”IP 地址不是一个好主意 – 您不希望每次连接尝试都以“错误”的 IPv4 地址开始,并可能完全转到其他地方。

简而言之,如果通信仅支持 IPv6,则为它们设置仅支持 IPv6 的 DNS 条目。

(理想情况下,您的数据库服务器不应通过公共 Internet 进行访问。如果您的服务器确实分布在不同的网络上,那么我建议让服务器通过某种 VPN 隧道(例如 WireGuard)进行通信。一旦如果您拥有 VPN 隧道,则可以让服务器通过隧道通过 IPv4 进行通信,即使它们无法通过 Internet 直接访问 IPv4。)

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