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



据我所知,IPv6地址是按块分配的。每台机器都有一个IPv6地址范围,该范围内的任何IPv6地址都指向它

这一假设的依据:https://stackoverflow.com/a/15266701/681671

/64是前缀长度。它是地址中的位数这是固定的。因此,a/64表示128位IPv6地址是固定的。剩余的位(在这种情况下为64(是灵活的,你可以使用所有的。这意味着当ISP给你一个/64,他们给你264个地址(即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

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: Cannot assign requested address

我想在同一端口但不同的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测试只是为了简化问题描述。

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

这种假设是错误的。前缀长度与IPv4网络掩码具有相同的含义。它决定哪些地址在您的本地网络上,而不是哪些地址属于您的本地主机。

这就是您所需要的:

ip route add local 2a01:2e8:d2c:e24c::/64 dev lo

信用:我可以将一个(大(地址块绑定到一个接口吗?

重新迭代并扩展Sander的答案:

您必须将每个单独的IP地址绑定到nic,即网络接口卡,然后它才会考虑向上发送流量。

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

在一个系统上可以分配多少IP地址是有实际限制的,远低于专栏文章所要求的2^64。单独存储地址将比任何系统的内存都要多。

与具有127.0.0.0/8、2^24环回地址的IPV4不同,IPV6仅定义一个地址0::1/128。

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

相关内容

  • 没有找到相关文章

最新更新