RouterOS 的 DHCPv6-PD (前缀委派)设定

写在前面

前段时间看到有网友提到 RouterOS 不支持 IPv6。
于是就有了这篇文章的动机。
据目前的情况看,最新的 long-term 6.48.7 已经支持 DHCPv6-PD Client/Server,RouterOS 7.10.1 已经支持 SLAAC/DHCPv6-PD Client/Server,做到基本的 拨号 -> 通过 DHCPv6-PD 拿IPv6地址块 -> 给下面的 LAN 分 /64地址,是完全 OK 的。
本篇也就是介绍DHCPv6-PD over PPPoE ,并且给下游接口的设备分地址的步骤。

  1. 虽然本篇已经尽力解释相关概念,但仍然建议先学习 IPv6 相关知识,弄清楚 ISP 一般是如何给用户分配 IPv6 地址的。
  2. ISP/家庭 路由器均使用 RouterOS 7模拟。

环境介绍

此次仍然是通过 Lab 完成。

1
2
3
4
5
Topology:  

+------------+         (ether1) +-------------+ (ether2)
| ISP 漏油器  +------------------+ 家庭漏油器    +-----LAN
+------------+                  +-------------+

ISP 路由器会开DHCPv6 Server给用户端分/56,用户端会给自己的下游LAN分/64,并开启路由通告。
ISP 路由器拥有的地址块为 2001:da8:100::/48 ,其本地环回地址为 2001:da8:1919:810::1
ISP 对用户侧通过 DHCPv6 一次只分一个 /56 地址块,用户侧路由器给 LAN 接口分一个 /64 子网 ,并且路由器的 LAN 接口自己占用这个 /64 子网中的 xxxx::1/64 地址,用于对 LAN 的设备广播 64bit 前缀,让 LAN 内的设备通过 SLAAC 方式自行配置 IPv6 地址。
并且在用户侧 LAN 也开启 DHCPv6-PD 的服务器,向用户侧的下游 DHCPv6 Client 分最大 /60 的地址块。

正文

Step 1: 配置 DHCPv6 Client over PPPoE

我们先看 PPPoE Client 有没有起来:

1
2
3
4
5
6
7
[admin@MikroTik] > interface/pppoe-client/print 
Flags: X - disabled, I - invalid; R - running 
 0  R name="pppoe-out2" max-mtu=auto max-mru=auto mrru=disabled 
      interface=ether1 user="user" password="123456" profile=default 
      keepalive-timeout=10 service-name="" ac-name="" add-default-route=yes 
      default-route-distance=1 dial-on-demand=no use-peer-dns=no 
      allow=pap,chap,mschap1,mschap2 

起来之后我们为其添加一个 DHCPv6 PD 的 DHCPv6 客户端。
此处默认只有一个上游,直接勾选添加默认路由即可。
如果需要向下分的话, pool-prefix-length 指定的向下分的最大的子网大小。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
[admin@MikroTik] > ipv6 dhcp-client/add interface=pppoe-out2 add-default-route=y
es request=prefix pool-name=dhcpv6_pd pool-prefix-length=60
[admin@MikroTik] > ipv6 dhcp-client/print 
Columns: INTERFACE, STATUS, REQUEST, PREFIX
# INTERFACE   STATUS  REQUEST  PREFIX                            
0 pppoe-out2  bound   prefix   2001:da8:100:100::/56, 2d23h59m51s
[admin@MikroTik] > ipv6 route/p
Flags: D - DYNAMIC; A - ACTIVE; c, d, v, y - BGP-MPLS-VPN; + - ECMP
Columns: DST-ADDRESS, GATEWAY, DISTANCE
     DST-ADDRESS            GATEWAY                 DISTANCE
DAd+ ::/0                   fe80::f0:d9%pppoe-out2         1
DAv+ ::/0                   pppoe-out2                     1
DAd  2001:da8:100:100::/56                                 1
DAc  fe80::%ether1/64       ether1                         0
DAc  fe80::%pppoe-out2/64   pppoe-out2                     0
[admin@MikroTik] > ipv6 pool/print
Flags: D - DYNAMIC
Columns: NAME, PREFIX, PREFIX-LENGTH, EXPIRES-AFTER
#   NAME       PREFIX                  PREFIX-LENGTH  EXPIRES-AFTER
0 D dhcpv6_pd  2001:da8:100:100::/56             60  2d23h52m18s 

Tips: 如果需要一个比较固定的 IPv6 地址池的话,可以选择在获取完前缀之后给 DHCPv6 Client 增加一个 prefix-hinting 选项,值就填写你获得的地址池的 ip/cidr 格式,保存即可。之后基本上就不会变动了。不过这个可能取决于 ISP,有可能不会生效。

可以看到DHCPv6客户端添加完成,并且成功分到了一个 /56 的子网。

Step 2: 为下游接口添加 IPv6 地址

此处为何要给下游接口添加一个 IPv6 地址呢?
这个步骤的目的则是向下游接口广播一个64bit前缀,之后让下游接口的设备通过 SLAAC 方式获得地址。

1
2
3
4
5
6
7
8
9
[admin@MikroTik] > ipv6 address/add from-pool=dhcpv6_pd interface=ether2 address=::1/64
[admin@MikroTik] > ipv6 address/print 
Flags: D - DYNAMIC; G, L - LINK-LOCAL
Columns: ADDRESS, FROM-POOL, INTERFACE, ADVERTISE
#    ADDRESS                     FROM-POOL  INTERFACE   ADVERTISE
0 DL fe80::5054:ff:fe51:eb9b/64             ether1      no       
1 DL fe80::3/64                             pppoe-out2  no       
2 DL fe80::5054:ff:fe5a:c4a3/64             ether2      no       
3  G 2001:da8:100:100::1/64      dhcpv6_pd  ether2      yes

此处可以看到我们对下游接口已经从前缀委派得到的地址池中,选择了一个 /64 的子网安排在了 ether2 接口,也就是 LAN 接口了。

Q & A: 看到 2001:da8:100:100::1/64advertise=yes 了吗,这个的用处就是向 LAN 通告前 64bit 前缀的,这样 LAN 内的设备才能通过 SLAAC 获取地址。

我们可以从ether2 接的一个 Linux 虚拟机看到已经通过 SLAAC 分配了 IPv6 地址。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
root@MiniPC:~# ip a show dev br1
25: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 76:b5:37:fe:f5:65 brd ff:ff:ff:ff:ff:ff
    inet6 2001:da8:100:100:74b5:37ff:fefe:f565/64 scope global dynamic mngtmpaddr 
       valid_lft 2591780sec preferred_lft 604580sec
    inet6 fe80::74b5:37ff:fefe:f565/64 scope link 
       valid_lft forever preferred_lft forever
root@MiniPC:~# traceroute 2001:da8:1919:810::1
traceroute to 2001:da8:1919:810::1 (2001:da8:1919:810::1), 30 hops max, 80 byte packets
 1  2001:da8:100:100::1 (2001:da8:100:100::1)  0.492 ms  0.402 ms  0.337 ms
 2  2001:da8:1919:810::1 (2001:da8:1919:810::1)  1.040 ms  1.746 ms  1.687 ms

至此我们就已经可以正常使用 IPv6 上网了。
如果有将 ISP 分到的前缀再委派一次给下游的需求,可以选择继续下一步。

Step 3: 为下游接口配置 DHCPv6-PD 服务器(可选)

这一步添加一个名称为 dhcpv6_pd_home 的 DHCPv6 服务器,并且地址池从我们从 ISP 拿到的 dhcpv6_pd 池子里面选。

1
2
3
4
5
6
[admin@MikroTik] > ipv6/dhcp-server/add interface=ether2 address-pool=dhcpv6_pd 
name=dhcpv6_pd_home
[admin@MikroTik] > ipv6 dhcp-server/print 
Columns: NAME, INTERFACE, ADDRESS-POOL, PREFERENCE, LEASE-TIME
# NAME            INTERFACE  ADDRESS-POOL  PREFERENCE  LEASE-TIME
0 dhcpv6_pd_home  ether2     dhcpv6_pd            255  3d  

Tips: 这一步一定要在 CLI 里面做,不要偷懒选择用 WebFig/WinBox 点点点,否则可能不会起作用,即使东西看起来一模一样…..
引用群友的一句话, bugtik 只看 CLI 就好。不要看 GUI,因为可能会存在 bug…

PPPoE 下 IPv6 PMTUD 问题的解决

因为 PPPoE 的原因, MTU 会比一般少 8ytes 。 IPv6 中 PMTUD 主要由 ICMPv6 实现的,有些站点又蠢又坏会把 ICMPv6 的包全部丢掉,你的包出去到服务器那边没有问题,但是从服务器那边回来 PMTUD 有概率会直接爆炸。即使 PMTUD 工作,但一些网站可能因为地理位置较远,仍然会存在卡顿。这种情况下你可以选择在出去的时候就把 MSS/MTU 调小就OK了。
因为路由通告可以直接调整默认路由的 MTU ,客户端设备不需要其他配置,这里就演示更改路由通告参数的方法。
可以先在 LAN 上客户机查看路由状态:

1
2
3
4
root@MiniPC:~# ip -6 r show dev br1
2001:da8:100:100::/64 proto kernel metric 256 expires 2591919sec pref medium
fe80::/64 proto kernel metric 256 pref medium
default via fe80::5054:ff:fe5a:c4a3 proto ra metric 1024 expires 1719sec pref medium

然后我们在客户侧的路由器调整路由通告设定。

1
2
3
4
5
6
7
8
9
[admin@MikroTik] > ipv6 nd/print
Flags: X - disabled, I - invalid; * - default 
 0  * interface=all ra-interval=3m20s-10m ra-delay=3s mtu=unspecified 
      reachable-time=unspecified retransmit-interval=unspecified 
      ra-lifetime=30m ra-preference=medium hop-limit=unspecified 
      advertise-mac-address=yes advertise-dns=yes 
      managed-address-configuration=no other-configuration=no dns="" 
      pref64=""
[admin@MikroTik] > ipv6 nd/edit number=0 value-name=mtu

unspecified 改为 1492 之后 ctrl+o 保存退出。

1
2
3
4
5
6
7
8
[admin@MikroTik] > ipv6 nd/print 
Flags: X - disabled, I - invalid; * - default 
 0  * interface=all ra-interval=3m20s-10m ra-delay=3s mtu=1492 
      reachable-time=unspecified retransmit-interval=unspecified 
      ra-lifetime=30m ra-preference=medium hop-limit=unspecified 
      advertise-mac-address=yes advertise-dns=yes 
      managed-address-configuration=no other-configuration=no dns="" 
      pref64=""

可以看到修改完毕。

1
2
3
4
root@MiniPC:~# ip -6 r show dev br1
2001:da8:100:100::/64 proto kernel metric 256 expires 2591854sec pref medium
fe80::/64 proto kernel metric 256 pref medium
default via fe80::5054:ff:fe5a:c4a3 proto ra metric 1024 expires 1654sec mtu 1492 pref medium

对比上面,我们也可以观察到 LAN 下机器的默认路由 mtu 为 1492 了。

参考资料

RouterOS 的文档们

  1. PPPoE - RouterOS Documentation
  2. Manual:IPv6/DHCP Server - MikroTik Wiki

IPv6 RFC 们

  1. RFC8415 - Dynamic Host Configuration Protocol for IPv6 (DHCPv6)
  2. RFC3769 - Requirements for IPv6 Prefix Delegation

题外

  1. Is your ISP constantly changing the delegated IPv6 prefix on your CPE/router?

结语

想不到有什么好说的,就不说了w。
这篇的东西还是比较简单的。
目前也较为实用。
如果有问题和表述不明的地方请指出,非常感谢阅读本篇文章!

Built with Hugo
Theme Stack designed by Jimmy