如何为 Linux IPv6 路由器配置 radvd 以连接上游 dsl 网关

如何为 Linux IPv6 路由器配置 radvd 以连接上游 dsl 网关

我正在尝试让我的家用 Linux 路由器也支持家庭网络上的 ipv6。

我有一个 NVG599 DSL 路由器,充当公共互联网的网关,然后我的 Linux 路由器有两个接口:eth0 通向家庭网络,eth1 通向 DSL 路由器。

家庭网络 <----eth0-----> LinuxRouter <------eth1------>DSLrouter -->>>>>

DSL 路由器配置了来自我的 ISP 的 /64 网络前缀(假设为 2001:0:0:1234::/64),DSL 路由器的 ipv6 全局地址为 2001:0:0:1234::1。我已使用 radvd 设置 Linux 路由器,以将相同的 /64 网络前缀通告给家庭 LAN 的 eth0,并且我确实看到 LAN 上的主机能够自动配置其 IP 地址。该通告还将 Linux 路由器列为 ::/0 的默认路由器,并设置了转发,以便它将数据包发送到 DSL 路由器。

我遇到的问题是,DSL 路由器在从互联网接收入站数据包时,会在 eth1 上发送邻居请求数据包,而这些邻居请求不会从 Linux 路由器上的 eth1 -> eth0 传递。我认为发生这种情况是因为 DSL 路由器认为它直接连接到家庭网络(99% 的家庭网络通常都是这样,中间没有 Linux 路由器)。

花了两天时间试图弄清楚,但到目前为止我还是找不到答案。我希望有某种方法可以使用 radvd 向 DSL 路由器发送路由器广告,告诉它通过 Linux 路由器路由所有 /64 前缀的数据包。目前,Linux 路由器发送的路由器广告配置为 /64 前缀,并向 DSL 路由器发送:

interface eth1
{
    AdvSendAdvert on;
    MinRtrAdvInterval 3;
    MaxRtrAdvInterval 10;
    route 2001:0:0:1234::/64 {
    };

};

我认为这足以让 DSL 路由器将所有数据包转发到网络,但我仍然看到邻居请求。

我看到 DSL 路由器具有 IP 直通设置,可以设置“默认服务器”,但这些设置似乎仅适用于 IPv4。假设 DSL 路由器不遵守我的 RA,我想我可以在 Linux 路由器上使用“xorb”设置 ipv6 多播转发,但想知道是否还有其他选择。

答案1

我遇到的问题是,当 DSL 路由器从互联网获取入站数据包时,它会在 eth1 上发送邻居请求数据包,而这些邻居请求并没有从 Linux 路由器上的 eth1 -> eth0 传递。

这是正常的。邻居请求的工作方式与 ARP 查询类似 - 它们将 IP 地址转换为 MAC 地址,因此它们只在同一个广播域内有意义。这使得没有意义以便路由器转发它们。

(尽管在某些情况下路由器可以代理人它们,如最后所述,但是...将其留给计划 C。)

我认为发生这种情况是因为 DSL 路由器认为它直接连接到家庭网络(99% 的家庭网络通常都是这样,中间没有 Linux 路由器)。

是的,你永远不会告诉否则。

所以你现在的情况是相同的IP 子网被两个不同的网络使用,并且您希望 Linux 路由器作为桥梁工作......这几乎与路由器完全相反。

(如果令人困惑的部分是 IPv6,请从 IPv4 角度考虑整个设置,因为两者中的路由大致相同,并且 ND 基本等同于 ARP。因此,如果您不会在 v4 中使用相同的 192.168.1.0 子网...)


你最好的做法是获得第二/64,并使用用于 Linux 路由器的 eth1 网络。(如果 DSL 路由器通过 DHCPv6-PD 获取其前缀,则可能可以诱使它请求第二个前缀。)但不同之处在于,第二个 /64 不会直接用于接口,而是路由指向Linux路由器的地址。

例如:

  • DSL 路由器的 WAN 接口上有 2001:db8:0:0:a:b:c:d。
  • DSL 路由器从 ISP 获取 2001:db8:10:0::/64,在 LAN 接口上自行分配 2001:db8:10:0::1/64,并为其发送路由器通告。
  • Linux 路由器根据 RA 在 eth1 上自动配置 2001:db8:10:0:x:y:z:t。
  • Linux 路由器以某种方式从 ISP 获取 2001:db8:10:1::/64,在 eth0 接口上自行分配 2001:db8:10:1::1/64,radvd 为此发送路由器通告 –不是对于第一个子网。
  • DSL 路由器需要一条类似“2001:db8:10:1::/64 via 2001:db8:10:0:x:y:z:t”的路由,以便第二个子网的所有流量都转发到 Linux 路由器。

(抱歉,例子不太清楚。)

有时 ISP 会将整个 /60 甚至 /56 委托给您,并将其全部路由到 DSL 路由器。在这种情况下,您只需设置第二个子网,而无需任何 DHCPV6-PD 魔法。但实际上我无法在这里提供一个好的“通用”答案,因为它既依赖于 ISP,又依赖于 CPE。


如果无法获得第二个 /64 前缀,其他可能的选择是:

  • 将Linux系统变成纯粹的桥梁,不带任何路由功能。

  • 使用其他来源获取额外的 /64,例如隧道提供商(或 6to4)。现有的隧道服务将比下面描述的黑客更可靠地工作(除了一些额外的延迟)。

  • 让 DSL 路由器仅获取 /64,但不将其配置为 LAN。(取决于路由器的灵活性。)相反,再次通过 Linux 系统的 eth0 链路本地地址为该 /64 设置路由,并同样通过 DSL 路由器的 LAN 链路本地地址在 Linux 系统上为 ::/0 设置路由。因此,/64 将仅在第二个子网中使用,而第一个子网根本不会有任何公共前缀。

  • 继续使用当前设置,但安装“ndppd”以执行邻居发现代理。(不,多播转发不会执行此操作,因为 ND 数据包通常具有链路本地源地址。)请小心使用此功能,因为它会使事情变得非常混乱。

  • 对第二个 LAN 使用私有 (ULA) 地址,并在 Linux 路由器上启用 1 对多 NAT(伪装)...在此过程中会失去 IPv6 的大部分实用性。(是的,官方的 NAT 在 IPv6 中并不存在,但这并没有阻止 Linux netfilter/iptables 屈服并实现它。)

相关内容