IPv6绑定错误:无法分配请求的地址

4
据我了解,IPv6地址是按块分配的。每台机器都会获得一个IPv6地址范围,该范围内的任何IPv6地址都将指向它。
此假设的基础在于:https://dev59.com/8mUp5IYBdhLWcg3wdXWa#15266701 引用如下: “/64” 是前缀长度,指定了地址中固定的位数。例如,/64 表示128位的IPv6地址中前64位固定,剩余的位数(在这个例子中为64)是灵活的,可以全部使用。这意味着当你的ISP提供给你一个 /64 的地址时,他们实际上提供给你2的64次方个地址,即 18446744073709551616 个地址。
编辑:经过 Wireshark 的确认,发送到该 /64 范围内的任何IP数据包都会被路由到我的服务器。
查看 ifconfig 输出中的这一行:
inet6 2a01:2e8:d2c:e24c::1  prefixlen 64  scopeid 0x0<global>

我得出结论,所有以2a01:2e8:d2c:e24c前缀的IPv6地址都将指向我的计算机。

但是除了2a01:2e8:d2c:e24c:0000:0000:0000:0001之外,我无法将任何服务绑定到其他任何IPv6地址。

nc -l 2a01:2e8:d2c:e24c:0000:0000:0000:0002 80不起作用

nc -l 2a01:2e8:d2c:e24c:0000:0000:0001:0001 80不起作用

nc -l 2a01:2e8:d2c:e24c:1000:0000:0000:0001 80不起作用

nc -l 2a01:2e8:d2c:e24c:0000:0000:0000:0001 80只有这个可以工作

nc -l <IP> <PORT>在指定的IP和端口上打开一个简单的TCP服务器。

我收到的错误是nc:无法分配请求的地址

我想在同一端口上运行多个服务实例但使用不同的IPv6地址。由于每台计算机都可以获得丰富的公共IPv6地址,我考虑利用这一点。

ifconfig

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 88.77.66.55  netmask 255.255.255.255  broadcast 88.77.66.55
        inet6 fe80::9300:ff:fe33:64c1  prefixlen 64  scopeid 0x20<link>
        inet6 2a01:2e8:d2c:e24c::1  prefixlen 64  scopeid 0x0<global>
        ether 96:00:00:4e:31:e4  txqueuelen 1000  (Ethernet)
        RX packets 26788391  bytes 21199864639 (21.1 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21940989  bytes 20045216536 (20.0 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

操作系统: Ubuntu 18.04

VPS主机: Hetzner

我正在尝试在主机的不同IPv6地址上映射端口80运行多个nginx docker容器。这就是我遇到问题的地方。 nc -l 测试只是为了简化问题描述。

3个回答

2
我得出结论,所有带有2a01:2e8:d2c:e24c前缀的IPv6地址都将指向我的计算机。 这种假设是错误的。前缀长度具有与IPv4子网掩码相同的含义。它决定了哪些地址位于您的本地网络中,而不是哪些地址属于您的本地主机。

我实际上在我的机器上收到了数据包(使用Wireshark确认)。但是我收到了“nc:无法分配请求的地址”错误。我认为nc请求操作系统将其绑定到该IP:端口,而拒绝请求的是操作系统。因此,我认为需要在操作系统中配置某些内容,以便它识别这些IP地址属于它。 - Dojo

1

0

重申并扩展Sander的答案:

在将流量发送到堆栈之前,您必须将每个单独的IP地址绑定到网卡(网络接口卡)。

Wireshark将nic设置为混杂模式,即发送所有接收到的流量。

系统上可以分配的IP地址数量有一个实际限制,远远小于op帖子所需的2^64。仅存储这些地址就超过了任何系统的内存。

与其拥有2^24个环回地址的IPV4不同,IPV6仅定义了一个单一地址0::1/128。

唯一的实际解决方案是将整个IPV6子网视为使用IP伪装(NAT)的“反向”NAT。此解决方案需要第二个充当NAT“路由器”的实例。规则将目标地址重写为单个地址/端口。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接