在我的路由器上运行后radvd
,我的客户端 PC 就像网络上的每个人所说的那样“自动”获得 IPv6 地址。我是否可以使用radvd
其 RA 中发布的相同前缀,并让同一 Ubuntu 客户端在其他接口上使用此前缀充当路由器(通过运行radvd
)?如果可以,请解释执行此操作的最佳方法。
答案1
不可以。这不是功能不足的问题,而是 IPv6 协议规范的限制。
原因如下:
你提到的“自动”是年代泰特大号埃斯A地址A优托C配置(SLAAC),SLAAC 的规范规定,它使用 64 位网络掩码(这意味着地址的前 64 位(16 个十六进制字符)必须相同,地址才会被视为在同一个块中并在此网络段上使用)。
根据定义,路由器是位于至少 2 个不同网段上的机器。事实上,路由器的名称源于它在两个网段之间路由流量这一事实。
(我在这里提到的“段”是直接连接在一起的一组交换机(没有中间路由器)以及连接到这些交换机的 PC 和其他“死胡同”设备。)
当联网机器(PC、服务器等)想要向某个地址发送流量时,它必须确定它想要到达的地址是否可直接到达(在同一网段上)或不可直接到达(不在同一网段上,因此必须通过路由器才能到达正确的网段)。为此,计算机会查看配置的网络掩码。网络掩码只是告诉计算机,如果它想要到达的地址的前 X 位与计算机自己的地址相同,则该地址位于同一网段上,计算机应直接联系该地址(使用 ICMPv6 邻居发现协议)。如果前 X 位不相同,则该地址是另一个地址块的一部分,并且位于不同的网段上,需要通过路由器发送流量才能到达正确的网段。
对于 Ubuntu 计算机的一个接口上正在发生的 SLAAC,协议规范将网络掩码定义为 64 位。无法声明该 /64 网络掩码块的较小部分并将其用于另一个接口和具有 SLAAC 的段,原因有二。首先,SLAAC 需要 64 位网络掩码。如果您要从 64 位网络掩码块中分割出一个较小的块,则较小的块本质上不是 64 位网络掩码块,因为较大的网络掩码意味着较小的块。(例如,65 位网络掩码块的大小是 64 位网络掩码块的一半)。其次,网络上当前具有使用 SLAAC 公布的 64 位网络掩码块的所有其他计算机都在等待全部的块可在该段上直接访问,而不必经过路由器才能到达该块的一部分。
现在,有一种方法可以解决这个问题,但不能让您的 Ubuntu 机器充当路由器。您可以将 Ubuntu 机器上的端口配置为交换机,透明地在端口之间传递流量而无需对其进行修改。这样做时,您的机器将获得一个新接口,其作用就像连接到此虚拟交换机上的第三个端口一样。这将允许您为 Ubuntu 机器获取所需的任何配置(包括 SLAAC)并为其提供网络访问权限,同时仍允许流量在机器上的两个物理接口之间不受影响地流动。这使得您的机器及其物理接口上的两个网络都成为同一网段(因为您的机器正在执行交换机的工作)。
为此,您需要设置一个网桥。您需要安装该bridge-utils
软件包。然后您需要从当前物理接口中删除所有地址/配置。然后您需要执行以下操作:
brctl addbr br0
brctl addif br0 intefacename1
brctl addif br0 intefacename2
ifconfig br0 up
ifconfig intefacename1 up
ifconfig intefacename2 up
然后将物理接口上所需的任何配置添加到新接口 br0。您可能需要查看https://wiki.debian.org/BridgeNetworkConnections和https://wiki.debian.org/NetworkConfiguration#Bridging了解更多详细信息(尤其是如何使 /etc/network/interfaces 中的配置在重启后应用)。