写在前面
前段时间看到有网友提到 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 ,并且给下游接口的设备分地址的步骤。
- 虽然本篇已经尽力解释相关概念,但仍然建议先学习 IPv6 相关知识,弄清楚 ISP 一般是如何给用户分配 IPv6 地址的。
- 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/64
的 advertise=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 的文档们
- PPPoE - RouterOS Documentation
- Manual:IPv6/DHCP Server - MikroTik Wiki
IPv6 RFC 们
- RFC8415 - Dynamic Host Configuration Protocol for IPv6 (DHCPv6)
- RFC3769 - Requirements for IPv6 Prefix Delegation
题外
- Is your ISP constantly changing the delegated IPv6 prefix on your CPE/router?
结语
想不到有什么好说的,就不说了w。
这篇的东西还是比较简单的。
目前也较为实用。
如果有问题和表述不明的地方请指出,非常感谢阅读本篇文章!