IPv6 在实践中多使用 GUA 地址。对于多运营商环境,我们一般不会为客户端分配多个运营商的 IPv6 地址,需要给用户分配一个相对固定的地址,并通过出口网关类设备来调度用户使用哪家运营商出网。

在一些厂商中,这个功能被称为“前缀替换”,实际上这也是一种 NAT。RouteOS 没有明确的给出这个功能,但是可以通过 IPv6 Firewall 中的 netmap NAT 来实现这个功能。

配置如下:

1
2
3
4
5
6
7
8
9
/ipv6 pool
add name=pool_v6_local prefix=2a05:dfc1:7111:1a::/64 prefix-length=64
/ipv6 address
add address=::1 from-pool=pool_v6_local interface=br_main
/ipv6 firewall nat
add action=netmap chain=srcnat out-interface=pppoe-cmnet-out src-address=\
2a05:dfc1:7111:1a::/64 to-address=2409:0000:31b3:1cd0::/64
add action=netmap chain=srcnat dst-address=2409:0000:31b2:8e50::/64 \
in-interface=pppoe-cmnet-out to-address=2a05:dfc1:7111:1a::/64

如果你是家宽,或者动态 DHCPv6 获取前缀的用户,可以使用下面的配置,动态更新 NAT 策略。

请配置在 DHCPv6 Client Advanced 的 Script 中:

1
2
3
4
5
6
7
:log info "CMNET triggers DHCPv6 update";
:local cmnetDhcp6Prefix [/ipv6/pool/get [find name="pool_v6_cmnet"] prefix];
:log info "[DEBUG] CMNET obtains IPv6 prefix: $cmnetDhcp6Prefix";
:local cmnetPrefix [:pick "$cmnetDhcp6Prefix" 0 ([:len "$cmnetDhcp6Prefix"] - 3)]
/ipv6/firewall/nat/set dst-address="$cmnetPrefix/64" [find chain=dstnat action=netmap in-interface="pppoe-cmnet-out"];
/ipv6/firewall/nat/set to-address="$cmnetPrefix/64" [find chain=srcnat action=netmap out-interface="pppoe-cmnet-out"];
:log info "CMNET NETMAP update completed";

题外话:对于 AS209574 网络定义,以下两段地址为 GUA 私用,不对公网路由,如果你想尝试 GUA 地址的相关实验,可从这两段地址中任选。

1
2
2a05:dfc1:7111::/48
2a05:dfc1:7112::/48