随着radvd在我的路由器上运行,我的客户端PC就像每个人在网上所说的“自动”获得一个IPv6地址。有没有办法使用radvd在其RA中发布的相同前缀,并使同一个Ubuntu客户端充当路由器(通过在其他接口上运行radvd)?如果是的话,请解释一下最好的方法。
发布于 2016-04-24 18:53:38
不,你不能。这不是缺少特性问题,而是IPv6协议规范的局限性。
原因如下:
您所引用的“自动”是StateLess Address AutoConfiguration (SLAAC)。SLAAC规范说,它使用64位网络掩码(这意味着地址的前64位(16个十六进制字符)必须是相同的地址,以便在同一块中考虑地址并在此网段上使用)。
根据定义,路由器是至少位于两个不同网段上的机器。事实上,路由器从它在两个段之间路由流量这一事实中获得了它的名称。
(这里我指的“段”是直接连接(没有中间路由器)的交换机(Es)的集合,PC和其他连接到这些交换机的“死胡同”设备的集合。)
当网络机器(PC、服务器等)想要向地址发送通信量时,它必须确定它要到达的地址是否可以直接访问(在同一段上)(而不是在同一段上,因此必须通过路由器才能到达正确的段)。为此,计算机会查看配置的网络掩码。网络掩码简单地告诉计算机,如果它要到达的地址与计算机自己的地址具有相同的第一个X位,那么该地址位于同一段,计算机应该直接联系该地址(使用ICMPv6邻居发现协议)。如果第一个X位不是共同的,那么该地址是另一个地址块的一部分,并且位于另一个不同的段上,这就需要通过路由器发送流量才能到达正确的段。
对于发生在Ubuntu机器的一个接口上的SLAAC,协议规范将网络掩码定义为64位。由于两个原因,没有一种方法可以将该/64网络掩码块中的一小部分用于另一个接口和与SLAAC的段中。首先,SLAAC需要64位网络掩码。如果要从64位网络掩码块中雕刻出一个较小的块,那么较小的块本质上就不是64位网络掩码块,因为更大的网罩意味着更小的块。(例如,65位网络掩码块的大小是64位网罩块的一半)。第二,网络上的所有其他机器目前都有用SLAAC广告的64位网络掩码块,它们都期望整个块可以在该段中直接到达,并且不期望通过路由器才能到达该块的一部分。
现在,有一种方法可以绕过这一点,但不是通过您的Ubuntu机器作为路由器。您可以将Ubuntu计算机上的端口配置为一个交换机,在不修改端口的情况下透明地在端口之间传递通信。在这样做时,您的机器将获得一个新的接口,它的行为就像连接到这个虚拟交换机上的第三个端口一样。这将允许您获得您需要的任何配置(包括SLAAC)到您的Ubuntu机器,并给予它网络访问权,同时仍然允许在您的机器上的两个物理接口之间不受影响地进行通信。这使得你的机器和它的物理接口上的两个网络都变成了同一个部分(因为你的机器正在做一个开关的工作)。
要做到这一点,您将需要建立一座桥。您将希望安装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/网络/接口中的重新引导)。
https://askubuntu.com/questions/756822
复制相似问题