我想为 Debian 6 主机分配任意数量的 IPv6 地址,但我看到以下设置,并想知道设置更高的后果是什么,或者这种设置方法是否会通过影响系统性能来限制。
net.ipv6.conf.eth0.max_addresses=16
如果您需要为一个接口分配更多地址,Linode 和其他一些网站建议将其设置为 32,但为什么要设置为 32?如果我愿意,我可以分配 64、128、5000 个 IPv6 地址吗?我这样做是为了在一定程度上避免基于名称的 Web 服务托管,以便我可以将每个站点绑定到不同 IP 地址的端口 80。
我可以/应该吗net.ipv6.conf.eth0.max_addresses=3000
?为什么或为什么不?
答案1
由于效率和时间复杂度。这基本上与我们应该保持路由表简短的原因相同(但在不同的层面上),因为对于收到的每个数据包,系统都需要遍历整个路由表以查找匹配项,以了解如何路由该数据包。这导致路由表长度的平均和最坏情况查找时间为 O(n)。
接口地址有同样的问题,含义也类似。接口可能必须检查每秒通过电缆的数千个数据包,以确定哪些数据包是发往该主机的。简单的方法是:对于每个到达的数据包,将其目标地址与分配给该接口的每个地址范围进行比较。请注意,这是另一个顺序任务,每个数据包都需要 O(n),这意味着:这会花费处理时间,如果您必须每秒处理数千个数据包,则处理时间可能会很长。
还有一个问题:随着您向本地链路添加越来越多的地址,每个新地址都会增加链路中所有其他主机在其邻居 (ARP) 表中所需的内存。这不是一个大问题(ARP 代理也是如此),但仍然会对整个本地网络的性能产生一些影响,您应该注意。
这使得为单个主机分配大量地址不是一个好主意。非常保守的限制(例如 16 或 32)就足够了,同时也提醒管理员这些成本。
如果您需要将大量地址路由到一台机器,则应创建一个子网。在一个子网内选择连续的地址,并将整个子网路由到该机器。然后使用某种形式的内部路由或一些 iptables/route 技巧来完成机器内的所有工作。这基本上就是我们在一台物理服务器上托管大量虚拟机时所做的工作。