如何将网络接口绑定到整个 /48 IPv6 地址子网,而不必枚举每个单独的地址?

如何将网络接口绑定到整个 /48 IPv6 地址子网,而不必枚举每个单独的地址?

语境

我需要知道如何在我的服务器中设置一个完全 /48 IPv6 块来执行传出使用其中任何一个 IPv6 地址来处理请求,而无需单独设置每个地址。

我的 ISP 通过DHCP6服务器直接连接到他们的数据中心上的我的机器。

该机器运行Ubuntu Server 20.04。

我已经尝试过这个:

  • ip addr add 0000:000:00::/48 dev lo,与 IPv4 地址配合得很好,我已经获得了一个以这种方式用于传出请求的 /26 IPv4 块,但我不能使用 IPv6;

  • ip route add local 0000:000:00::/48 dev lo,我可以使用 在本地 ping 任何 IP ping6,但我无法将任何 TCP 套接字绑定到该 IP 并执行传出请求,我收到EADDRNOTAVAIL

问题

我是不是漏掉了什么?我该如何让它工作?

资源

Netplan 配置

network:
  version: 2
  renderer: networkd
  ethernets:
    enp132s0:
      dhcp4: yes
      dhcp6: yes
    enp6s0:
      dhcp4: yes
      dhcp6: yes

其他 Serverfault 问题

答案1

您的第二个 Server Fault 链接概述需要的内容。路由前缀到您,在该主机上进行本地路由,并允许套接字中的非本地 IP(也称为 IP_FREEBIND)。EADDRNOTAVAIL 表示第三步不完整。

通过从不同的 IPv6 网络 ping 其中的 IP 来确认您的路由前缀和本地路由有效。

/etc/sysctl.d/freebind.conf在 Linux 上,通过创建包含以下内容的命令来允许绑定到其他 IP:

net.ipv4.ip_nonlocal_bind = 1
net.ipv6.ip_nonlocal_bind = 1

应用程序应绑定到所需的 IP 地址。否则,如果没有提供,通常的源地址选择将选择分配给接口的一些本地 IP。也可以在每个套接字级别设置 IP_FREEBIND 选项。

请注意,即使没有这个路由前缀技巧,也可以为主机分配大量 IP 地址。在邻居发现成为问题之前,可能分配数千个 IP 地址。


IPv6 子网大小应为 /64。对下半部分接口 ID 进行标准化,对上半部分进行聚合以进行路由。作为路由器,此主机可能仍会路由到 /48,但只需要在回环路由上路由到自身时使用 /64。

IP 地址的数量并不重要,因为 2^64 实际上已经是无限的了。在 /48 中只使用一个或两个 /64 是完全没问题的,在地址规划中为其他事情留出空间。

相关内容