RPI集群的无线到以太网岛:IPv6,NDP代理,MDNS反射器

2021-04-28 11:26:05

最初,当我组装Homelab raspberry PI群时时,一切都与以太网电缆直接连接到我的Wi-Fi路由器。这是一个很好的工作,但这种“一堆董事会”在我们小平坦的中心的沙发后面击败了我一点。

去年我决定重新组织群集,将其转变为无线到有线岛屿,我可以在公寓内的任何地方搬迁,而不进行任何特殊的电缆管理,同时保持额外的小工具。经过多个试验和错误后,最终设置如下所示:

不同的颜色轮廓轮廓两个逻辑子网之间的连接 - 稍后更多。在这里,我们在架构上(上到底):

路由器设置为私有IPv4地址192.168.10.1和全球单播IPv6地址(GUA)前缀2001:DB8:ABC:123 ::/64,ISP指定给我们(当然,这不是真实的前缀,但我将在下面的所有示例中使用这个)。

从一开始就是值得提及的,路由器(Sagemcom F @ ST)在它允许配置的内容中非常有限。例如。根据互联网,我的ISP - 沃达丰德国 - 提供/ 60或/ 62个私人客户的IPv6前缀。有了这个,我打算将我的家庭网络划分为两个/ 64个子网:一个用于主页的子网,另一个用于我们在家中使用的其他Wi-Fi设备。它字测试路由器设置固定/ 64,而无需任何方式来更改它。同样,我无法设置任何自定义路由或配置路由器的内置DHCP提供的DNS服务器提供了家庭网络 - 配置被供应商😑锁定

PI-31连接到WLAN0接口的WLAN0接口,我配置了静态IPv4地址192.168.10.31和全球IPv6地址2001:DB8:ABC:123 :: YYY / 64,它本身自动配置,谢谢SLAAC。

Gateway管理独立本地网络,并在无线和以太网之间路由流量。其ETH0接口具有静态IPv4地址192.168.20.1和唯一的本地IPv6地址(ULA)FD2F :: 1/64 - 这是群集的局域网。

PI-31运行DNSMASQ以向集群提供管理服务:DHCP,路由器广告(RA)和DNS。

PI-41..pi-44(4倍覆盆子PI 4,2GB) - 群集的“工人”节点。

每个PI-4X连接到网关认为网络交换机。网关上的DHCP服务器分配静态IPv4地址192.168.20.4x / 24,并提供Ula Prefix FD2F :: / 64,该ula prefix fd2f ::/ 64,它用于自动配置其IPv6地址和默认路由。

为了向群集的LAN到Internet的访问,网关设置NAT(IP伪装和IPv4路由)。有关如何配置Raspberry Pi(例如“的文章(例如,将Raspberry PI设置为路由无线接入点") - 我将跳过这部分。

我无法直接从我的笔记本电脑连接到PI-4X主机,这些计算机在主要的家庭网络上。也就是说,如果我想SSH到PI-41,我要么必须使用PI-31作为跳跃主机:

或者,我需要在系统路由表中定义静态路由。在MacOS上,我用以下命令确实如此:

正如我上面提到的那样,我的路由器不会让我配置静态路由,所以我必须在所有设备上都在我需要访问PI-4x主机的位置。

其次,MDN不起作用,即使每个RPI-Host运行Avahi-守护程序也是如此。也就是说,在上面的SSH示例中,我必须使用主机的IP地址而不是简单的SSH PI-41.local。

最后,IPv6 Internet无法从群集中工作。我可以在网关上设置Natv6,以相同的方式为IPv4地址设置它,但感觉很无聊:)

Wi-Fi路由器给出了我们/ 64 Gua前缀。我将其划分为较小的子网:DB8:ABC:123:40 ::/ 76,并将IP从此子网提供给PI-4x主机。 SLAAC不是小于/ 64的子网的选项,因此我必须静态地将来自所选前缀的全局IPv6地址分配给每个工人主机。

观察到每个主机的eth0有三个IPv6地址(我省略了PI-43和Bi-44的输出,为简洁起见):

pi @ pi-41:$ ip -6 addr显示eth02:eth0:<广播,多播,向上,下_up> MTU 1500状态UP QLEN 1000 INET6 FD2F:4A6D:83E5:1:DEB0:7EE0:4D1:B11A / 642️⃣范围全球动态{inet6 2001:DB8:ABC:123:41 :: 1/803️⃣范围全球范围全球范围noprefixroute {inet6 fe80 :: f388:8cca:fb1d:c8ec / 641️⃣范围链接{in} pi @ pi-42:ip -6 addr显示eth02:eth0:<广播,多播,向上,下_up> MTU 1500状态UP QLEN 1000 INET6 FD2F:4A6D:83E5:1:840:35D7:76D:9B43 / 642️⃣范围全球动态{inet6 2001:DB8:ABC:123:42 :: 1/803️⃣范围全球范围noprefixroute {inet6 fe80 :: 3152:8C62:A0E6:C206 / 641️⃣范围链接{}

我手动配置的全局地址2001:DB8:ABC:123:4x :: 1/80,其中x是数字,与PI-4x中的X匹配(我设置了带/ 80前缀的地址,但是这里不重要)。

当PI-4X主机自动配置其ULA地址时,它还使用网关的链接本地地址设置默认的IPv6路由:

pi @ pi-31:$ ip -6 addr显示eth02:eth0:<广播,多播,向上,下_up> MTU 1500状态UP QLEN 1000···INET6 FE80 :: B139:44C0:F524:EED5 / 641️⃣范围LINKPI @ PI-41:$ IP -6路由显示DefaultDefault通过FE80 :: B139:44C0:F524:EED 5 2 Hive ETH0 PROTO RA METRIC 202 MTU 1500 Pref Medium

以上,PI-31的链路本地地址FE80 ::/641‖设置为PI-41上的默认路由2️⃣ - 所有其他PI-4x主机都是相同的。这允许路由IPv6流量,其目标地址与任何其他路由规则不匹配,尽管PI-31网关。

但是,如果PI-4X主机尝试ping外部IPv6地址,例如, ping -6 ya.ru,没有一个数据包会回到它。即使主机具有全局IPv6地址,Wi-Fi路由器也接收来自WAN的Ping的响应,不知道在哪里路由数据包。当路由器执行“邻居发现”(ND)时,它将组播数据包发送给所有本地设备,询问数据包目的地的IPv6地址的所有者的MAC地址。由于PI-4x主机没有直接连接到Wi-Fi路由器,因此它们不会收到多播,并且无法响应ND(在IPv6中的邻居发现的解释非常有用,当我时正试图在这个主题周围包装。

要解决此问题,请在NDPPD的帮助下配置了PI-31网关上的NDP代理

NDPPD是一个守护程序,该守护程序在两个或多个接口之间代理​​某些IPv6 NDP消息。

/etc/ndppd.conf中的配置使PI-31通过WLAN0直接连接到Wi-Fi路由器,以回答2001年所有地址的邻居征集请求:DB8:ABC:123:40 :: / 76子网:

我还在PI-31上设置了静态路由,因此它将所有流量路由到2001:DB8:ABC:123:40 ::/ 76到eth0,将流量转发到相应的PI-4x主机:

PI @ PI-31:〜$ IP -6路线SHOW2001:DB8:ABC:123:40 ::/ 76 DEV ETH0 METRIC 100 Pref Medium2001:DB8:ABC:123 :: / 64 Dev WLAN0 Proto RA公式303 MTU 1500 PREF中等的···

我已经将路线放入/etc/dhcpcd.exit-hook上的pi-31,因此在重新启动之间持续存在。

使用NDP代理和路线到位,PI-4X主机最终可以ping IPv6 Internet:

PI @ PI-42:$ ping -6 ya.ruping ya.ru(ya.ru(2a02:6b8 :: 2:242))56 ya.ru的数据BYTES64字节(2a02:6b8 :: 2:242): ICMP_SEQ = 1 TTL = 52时间= 54.1 MS64字节从YA.RU(2A02:6B8 :: 2:242):ICMP_SEQ = 2 TTL = 52次= 57.4 ms

作为额外的副作用,因为来自Wi-Fi路由器的IPv6流量被正确地路由到Homelab群集,我不再需要在SSH到PI-4x主机时使用跳跃主机 - 我可以使用主机的全局IPv6地址:

Avahi-Dahi-守护程序可以将主机上的所有本地网络接口反映到框中的所有本地网络接口。我所要做的就是在/etc/avahi/avahi-daemon.con上指定enable-reflector = yes .PI-31网关上的CONF。有关可用旋钮的更多详细信息,请参阅Man Avahi-Daemon.conf。

现在我可以使用MDNS从主家庭网络中访问任何PI-4x主机,就像我们在同一LAN上一样:

$ ping6 pi-41.Localping6(56 = 40 + 8 + 8个字节)2001:DB8:ABC:123:99B9:6677:751B:DC75 - > 2001:DB8:ABC:123:41 :: 116字节从2001年起:DB8:ABC:123:41 :: 1,ICMP_SEQ = 0 HLIM = 63时间= 5.536 MS16字节从2001年起:DB8:ABC:123:41 :: 1,ICMP_SEQ = 1 HLIM = 63次= 4.003 ms $ ssh [email protected]登录:Sun 4月25日17:48:54 2021起从2001年起:DB8:ABC:123:99B9:6677:751B:DC75PI @ PI @ PI -41:〜$ 当然,这仅通过IPv6工作。 设置PI-31网关上的ARP代理可能会为IPv4修复它,但这可能是另一天的故事。 我对结果非常满意。 解决概述的问题是使整个重组过程有趣的原因。 我不得不深入研究一堆新事物,虽然我相信有能力做得更好的方法。 在Twitter和黑客新闻上讨论这笔记。