使用前注意:
- 这是一个非常早期的脚本,可能存在一些bug或者不适用的场景。
- 如果你不知道这个脚本的作用是什么,请不要使用。
- 使用该脚本需要中级或高级 RouterOS 知识,新手用户建议绕过。
使用说明:
以下内容需要在运行脚本之前手动配置一次:
# 创建 公网地址 的地址池,设置每个池的大小是 /60 (可根据实际情况修改)
/ipv6 dhcp-client
add add-default-route=yes interface=pppoe-telecom pool-name=pool6-telecom pool-prefix-length=60 request=prefix
# 创建 内网地址 的地址池,设置池的大小是 /60 (和公网地址池的大小要匹配)
# prefix-length 设置为 64 (SLAAC 分配时只能使用 64,剩下的地址可以给 dhcp-server 用)
/ipv6 pool
add name=pool6-bridge prefix=fd00:1111:2222:3300::/60 prefix-length=64
# 将 公网地址 分配到 vlan/bridge 接口上,并且不要广播地址
# 注意 地址的掩码是 /60 (和公网地址池的 pool-prefix-length 匹配)
/ipv6 address
add address=::/60 advertise=no eui-64=yes from-pool=pool6-telecom interface=bridge
# 将 内网地址 分配到 vlan/bridge 接口上
# 注意 地址的掩码是 /64 (和内网地址池的 prefix-length 匹配)
/ipv6 address
add address=::/64 eui-64=yes from-pool=pool6-bridge interface=bridge
# 可选: 创建内网 dhcp-server,并从 内网地址池 中分配 prefix
/ipv6 dhcp-server
add address-pool=pool6-bridge interface=bridge name=server1
现在已经完成了 公网 和 内网 的 地址池创建 及 接口地址分配。
接下来创建防火墙规则,这里使用 IPv6 的 NAT / NETMAP。
/ipv6 firewall nat
add action=netmap chain=srcnat comment="netmap for bridge" out-interface=pppoe-telecom src-address=fd00:1111:2222:3300::/60 to-address=240e:1111:2222:3300::/60
add action=netmap chain=dstnat dst-address=240e:1111:2222:3300::/60 in-interface=pppoe-telecom to-address=fd00:1111:2222:3300::/60
现在已经完成了必要的设置,只需将下面的脚本添加到 /system script
,修改脚本内的 内网/外网接口 名称,并在 /ipv6 dhcp-client
里添加以下触发脚本即可:
:delay 5000ms;
# 如果 bridge 上的公网 IPv6 地址不存在,那么添加回来
# 这是 RouterOS 的 bug,如果 pool 暂时不存在,地址条目会直接消失
:local ipv6Address [ /ipv6 address find interface=bridge from-pool=pool6-telecom ];
:local ipv6AddressSize [ :len $ipv6Address ];
if ($ipv6AddressSize = 0) \
do={
/ipv6 address
add address=::/60 advertise=no eui-64=yes from-pool=pool6-telecom interface=bridge
:log info ("IPv6: Add public address to bridge");
:delay 1000ms;
}
# 更新 NPTv6
/system script
run ipv6-nptv6