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

6vl6ewon  于 6个月前  发布在  Redis
关注(0)|答案(1)|浏览(59)

我有一个远程redis服务器(名为billy.home)配置并在IpV6接口上打开(以下行在它的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通过主机名连接?

yrdbyhpb

yrdbyhpb1#

根据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.cdeps/hiredis/hiredis.c中,在调用这个函数之前,没有任何东西会设置“both”标志。(也就是说,该功能可用于使用hiredis的 * 其他 * 工具-特别是不知道如何使用它的redis-server。)结果是hiredis首先执行仅限IPv4的DNS查询,这**成功,**所以hiredis从不尝试IPv6或组合查询。
因此,使其工作的唯一方法是a)使您的Redis服务器同时侦听IPv4 * 和 * IPv6;或者b)创建一个仅IPv6的DNS条目;或者c)使用自定义补丁版本的redis-task(或者hiredis,我猜)。
选项a):使用bind 0.0.0.0 ::监听IPv4和IPv6。(Redis似乎禁用了“bind ::同时监听”Linux的魔法。)
关于备选案文B):如果您的服务器分布在不同的网络中,因此没有IPv4可达性,并且如果您使用其他安全机制(例如防火墙或至少是基本的防火墙),那么在DNS记录中使用“私有”IP地址 * 仍然 * 不是一个好主意-您不希望每个连接尝试都从“错误”的IPv4地址开始,并可能完全转到其他地方。
简而言之,如果通信是仅IPv6的,那么为它们设置一个仅IPv6的DNS条目。
(理想情况下,您的数据库服务器不应该通过公共Internet访问。如果您的服务器确实分布在不同的网络中,那么我建议让服务器通过某种VPN隧道(如WireGuard)进行通信。一旦您有了VPN隧道,即使服务器不能通过Internet直接通过IPv4访问,也可以通过隧道通过IPv4进行通信。

相关问题