据我所知,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"的第二实例;路由器";。这些规则将把目标地址重写为一个地址/端口。