据我了解,IPv6地址是以块为单位分配的。每台机器都会得到一个IPv6地址范围,该范围内的任何IPv6地址都会指向它。
从这一行来看 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地址,我想利用相同的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 Hetzner
实际上,我正在尝试在主机的不同IPv6地址上运行多个映射到80端口的nginx docker容器。这时我遇到了问题。遇到的问题是 nc -l
测试只是为了简化问题的描述。
我的结论是所有IPv6地址前缀为2a01:2e8:d2c:e24c的IPv6地址都会指向我的机器。
这个假设是错误的。前缀长度与IPv4网罩的意义相同。它决定了哪些地址在你的本地网络上,而不是哪些地址属于你的本地主机。