IPv6 Neighbor Discovery
RouterOS 通过 RADVD 支持 IPv6 Neighbor Discovery 和无状态地址自动配置,遵循 RFC 4861 和 RFC 4862。它使主机能够通过 Router Advertisement 自动配置 IPv6 地址,地址状态包括 tentative、preferred、deprecated 和 invalid。Neighbor Discovery 取代了 IPv4 的 ARP 等协议,便于路由器发现。
IPv6 Neighbor Discovery
RouterOS 通过 Router Advertisement Daemon (RADVD) 支持 IPv6 Neighbor Discovery 和无状态地址自动配置。
标准
RFC 4861- Neighbor Discovery for IP version 6 (IPv6)。RFC 4862- IPv6 Stateless Address Autoconfiguration
节点描述
节点是实现 IPv6 的设备。在 IPv6 网络中,节点分为两种类型:
- 路由器(Routers) —— 转发并非明确发给自身的 IPv6 数据包的节点。
- 主机(Hosts) —— 所有不是路由器的节点。
路由器和主机是 RFC 4861 中定义的不同分类,但单个设备可以同时承担这两种角色:转发数据包(路由器)和接收发往自身的流量(主机)。
无状态地址自动配置
有几种自动配置类型:
- 无状态(stateless) —— 通过接收 Router Advertisement 消息完成地址配置。这些消息包含无状态地址前缀,并要求主机不使用有状态地址配置协议。
- 有状态(stateful) —— 通过使用有状态地址配置协议(DHCPv6)完成地址配置。如果 RA 消息不包含地址前缀,则使用有状态协议。
- 两者(both) —— RA 消息包含无状态地址前缀,并要求主机使用有状态地址配置协议。
IPv6 可以在不使用 DHCP 等有状态配置协议的情况下自动配置自身(示例)。
信息
地址自动配置只能在支持组播的接口上执行。 这个过程称为无状态地址自动配置,因为路由器不管理状态。它是一种简单、健壮且有效的方法。
RouterOS 使用 RADVD 定期向同一链路上的所有节点通告有关该链路的信息。该信息由 ICMPv6 "router advertisement" 数据包承载,包含以下字段:
- IPv6 子网前缀。
- 默认路由器的链路本地地址。
- 其他可选参数包括:链路 MTU、默认跳数限制和路由器生存期。
主机使用该通告来配置全局 IPv6 地址和默认路由器。全局 IPv6 地址由所通告的子网前缀和 EUI-64 接口标识符生成。
你可以通过发送 ICMPv6 router solicitation 数据包来请求通告。在 Linux 上,rtsol 工具会发送 router solicitation。移动节点应定期发送 router solicitation。
地址状态
当自动配置地址被分配后,它可以处于以下状态之一:
tentative(暂定) —— 在此状态下,主机验证该地址是否唯一。验证通过重复地址检测进行。preferred(首选) —— 在此状态下,地址被验证为唯一,节点可以向首选地址发送单播流量,也可以从首选地址接收单播流量。首选状态的持续时间包含在 RA 消息中。deprecated(已弃用) —— 地址仍然有效,但不用于新连接。invalid(无效) —— 节点不能再发送或接收单播流量。地址在有效生存期到期后进入无效状态。
下图展示了状态与生存期之间的关系:
%%{init: {"sequence": {"mirrorActors": false, "messageAlign": "left"}}}%%
sequenceDiagram
participant Tentative
participant Preferred
participant Deprecated
participant Invalid
Tentative->>Preferred: Preferred lifetime
Tentative->>Deprecated: Valid lifetime
Neighbor discovery
Neighbor Discovery (ND) 使用消息和过程来确定相邻节点之间的关系。与 IPv4 相比,ND 取代了地址解析协议(ARP)、ICMP Router Discovery 和 ICMP Redirect,同时提供额外功能。
主机使用 ND 来:
- 发现相邻路由器。
- 发现地址、地址前缀和其他配置参数。
路由器使用 ND 来:
- 通告自身的存在、主机配置参数和 on-link 前缀。
- 告知主机到达特定目的地的更优下一跳地址。
节点使用 ND 来:
- 解析正在转发 IPv6 数据包的相邻节点的链路层地址,并判断该地址何时发生变化。
- 判断能否向邻居发送 IPv6 数据包以及从邻居接收 IPv6 数据包。
RFC 4861 定义了五种 ND 消息类型:Router Solicitation (RS)、Router Advertisement (RA)、Neighbor Solicitation (NS)、Neighbor Advertisement (NA) 和 Redirect。把接口添加到 /ipv6/nd 只会激活路由器侧的消息:
- Router Solicitation (RS) —— 路由器监听主机发送的 RS,并以 Router Advertisement 回复。
- Router Advertisement (RA) —— 路由器发送周期性未经请求的 RA,同时也会响应收到的任何 RS。RA 的内容(前缀、标志位图、生存期、MTU、定时器值)来自每接口的
/ipv6/nd设置以及任何/ipv6/nd/prefix条目。 - Neighbor Solicitation (NS) —— 当路由器在该接口上收到针对自身任一地址(链路本地、SLAAC 或静态)的 NS 时,会以 Neighbor Advertisement 回复。这也涵盖了路由器自身地址的重复地址检测(DAD)。
- Neighbor Advertisement (NA) —— 响应 NS 时发送(如上所述)。除非显式启用,否则不会发送未经请求的 NA。
终端设备之间的主机到主机 NS/NA 由主机协议栈自动处理,不受 /ipv6/nd 菜单控制。Redirect 生成是可选的,默认禁用(redirect=no)。
示例
无状态自动配置示例
[admin@MikroTik] > ipv6 address print
Flags: X - disabled, I - invalid, D - dynamic, G - global, L - link-local
# ADDRESS INTERFACE ADVERTISE
0 G 2001:db8::1/64 ether1 yes
在此示例中,advertise 标志被启用,表示已添加一个动态的 /ipv6/nd/prefix 条目。
[admin@MikroTik] > /ipv6/nd/prefix/print
Flags: X - disabled, I - invalid, D - dynamic
0 D prefix=2001:db8::/64 interface=ether1 on-link=yes autonomous=yes
valid-lifetime=4w2d preferred-lifetime=1w
在直接连接到路由器的主机上,我们看到添加了一个地址。该地址由前缀部分(前 64 位,取自前缀通告)和主机部分(后 64 位,由本地 MAC 地址自动生成)组成:
atis@atis-desktop:~$ ip -6 addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 2001:db8::21a:4dff:fe56:1f4d/64 scope global dynamic
valid_lft 2588363sec preferred_lft 601163sec
inet6 fe80::21a:4dff:fe56:1f4d/64 scope link
valid_lft forever preferred_lft forever
主机已从路由器收到 2001:db8::/64 前缀,并用它配置了一个地址。
你也可以使用 RADVD 分发 DNS 服务器信息:
[admin@MikroTik] > /ipv6/nd/set [find where interface=all] dns=2001:db8::2 advertise-dns=yes
或者分发路由器自己的 LL IPv6 地址作为 DNS 服务器,并用路由器本身作为 DNS 缓存:
[admin@MikroTik] > /ipv6/nd/set [find where interface=all] advertise-dns=self
如果你通告特定的服务器,那么每个 RA 还会包含路由器自身的 LL 地址作为 DNS 服务器,但被标记为已过期的服务器。这是必要的,用于在之前使用过该服务器时使其失效(如果你在 self 和 yes 选项之间更改了设置)。任何正确处理 RA DNS 的客户端都会忽略这个服务器,或者如果它原本就是路由器自身,则使现有服务器失效。
你需要支持 Router Advertisement DNS 的客户端软件才能使用所通告的 DNS 信息。
在 Ubuntu/Debian Linux 发行版上,你可以安装 rdnssd 包,它能够接收所通告的 DNS 地址。
mrz@bumba:/$ sudo apt-get install rdnssd
mrz@bumba:/$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 2001:db8::2
mrz@bumba:/$ ping6 www.mikrotik.com
PING www.mikrotik.com(2a02:610:7501:1000::2) 56 data bytes
64 bytes from 2a02:610:7501:1000::2: icmp_seq=1 ttl=61 time=2.11 ms
64 bytes from 2a02:610:7501:1000::2: icmp_seq=2 ttl=61 time=1.33 ms
^C
--- www.mikrotik.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 1.334/1.725/2.117/0.393 ms
mrz@bumba:/$