保姆级指南:如何在Router OS上配置HE IPv6 Tunnelbroker以及原理详解

前情提要

公寓接的宽带,供应商可以给我静态公网IP,但是只能在ipv4和ipv6里面二选一。虽然有点儿奇怪,但是肯定是选了v4,但是一直没有v6是我心头事。这次的双旦假期终于有时间搞定这个了。

最简单方法就是使用由大善人Hurricane Electric提供的免费的IPv6隧穿服务。

有一说一,Mikrotik的官方文档里对于这一部分的配置写的实在是太差了。花费了一些时间才搞定一切。现在让我汇总一下配置过程,和其他指南不同,这个指南里我也尽量解释每一步都是在干什么,也算是自己重新复习本科网络知识了。

在HE tunnelbroker上注册

注册需要公网ipv4地址。 动态静态都可以。动态v4会在稍后的步骤中添加一个ros脚本来自动更新HE上注册的v4地址,不用担心。

首先访问:https://tunnelbroker.net/new_tunnel.php

先注册账号,然后创建新的隧道。创建隧道时选择最近的HE数据交换中心。国内就选香港节点,欧美就选最近的。比如我这里最近的就是斯德哥尔摩数据中心,

当你注册成功时,你应当能看到如下界面。

隧道信息图片

接下来的配置需要用IPv6 Tunnel Endpoints中的4个端点IP以及一个可被路由的掩码长度为/64网段前缀,请先笔记好:

  • Server IPv4 Address: 下文简称 s_ipv4
  • Server IPv6 Address: 下文简称 s_ipv6
  • Client IPv4 Address: 下文简称 c_ipv4
  • Client IPv6 Address: 下文简称 c_ipv6
  • Routed /64: 下文简称 r_ipv6_prefix

什么是 Tunnel Broker (隧道代理):

关键技术和协议:

  • 6in4 协议:用于封装和解封装 IPv6 数据包。
  • IP-in-IP 封装:把一个协议(IPv6)包裹在另一个协议(IPv4)里。
  • 协议字段(Protocol Field):通过标识协议类型(值为 41)来识别数据包是 6in4 隧道流量。

简单来说就是,(当配置完成后)路由器会使用Protocol 41来包装你LAN中所有的ipv6请求进ipv4数据包。然后数据包会发送给tunnel broker。Tunnel broker会帮你解包成v6包并继续发送至互联网中。反过来接收包也是一样的。由于Source address和Destination address总是被包装的,所以数据包本身不会被更改地址信息,这就让数据包总能被送达到正确的地方。

然而有些ISP会介入阻拦过滤掉“IP协议41”的数据包传送,这就导致实际上在某些网络中,隧道建立也无法联通。

flowchart LR
    A[Tunnel User]-- 6in4 package ---B[Tunnel Broker]
    B-- ipv6 package ---C[IPv6 Internet]

RouterOS配置

接下来的所有配置我将通过winbox的GUI配置并截图展示。

添加新的6to4类型接口

首先在interface中新建一个“6to4 tunnel”类型的接口。

新建接口类型

这里并不是写错了,ROS中并没有名为6in4的接口类型,但是实际上在ROS,这个类型的接口的包会标记为协议41,我们只要明确这一点就行。

这一步的目的是创建一个新的网络接口,让局域网的数据包有一个“门”能去往互联网,而我们的v6网络的提供方是以隧道的方式提供的。

然后按照这个配置完成接口创建:

  • Enabled:勾选✅
  • Comments:备注随便写,自己以后能知道这个接口是干啥的就行
  • MTU:1280
  • Local Address:c_ipv4地址
  • Remote Address:s_ipv4地址
  • 其他的默认

接口配置

添加路由

有了接口,我们得让局域网的数据包都知道这个接口在哪儿,让所有的v6的数据包都能去往通往HE网关的门,这就是路由。

IPv6 > Routes 中添加新的路由规则:

  • Enabled:✅
  • Comment:备注,不说了
  • Gateway:s_ipv6地址
  • 其余按照截图中填写

路由规则

添加客户端(路由器)的ipv6地址

现在接口和路由已经添加了,但是路由器还不知道自己的ipv6地址应该是什么呢,现在我们来添加它。

IPv6 > Addresses 中添加地址:

  • Enabled:✅
  • Comment:备注,不说了
  • Address:c_ipv6地址
  • Interface:选择你刚刚创建的接口名字
  • 其余按照截图中填写

客户端地址

添加v6防火墙规则

ROS默认的就行,但是问题是ros有个很傻逼的地方在于,如果你是低版本升级上来的,这些默认规则不会更新。

因此我推荐将目前的默认规则全部删除后然后重新添加官方的路由规则.

防火墙规则

添加地址列表

地址列表是用来稍后辅佐防火墙规则使用的,会影响特定的规则针对那些地址影响。

由于数目众多,我们打开一个新的终端输入如下指令(复制请用copy按钮,防止复制了行号):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
/ipv6/firewall/address-list/

add address=::1/128 comment="defconf: RFC6890 lo" list=bad_ipv6
add address=::ffff:0:0/96 comment="defconf: RFC6890 IPv4 mapped" list=bad_ipv6
add address=2001::/23 comment="defconf: RFC6890" list=bad_ipv6
add address=2001:db8::/32 comment="defconf: RFC6890 documentation" list=bad_ipv6
add address=2001:10::/28 comment="defconf: RFC6890 orchid" list=bad_ipv6
add address=::/96 comment="defconf: ipv4 compat" list=bad_ipv6

add address=100::/64 comment="defconf: RFC6890 Discard-only" list=not_global_ipv6
add address=2001::/32 comment="defconf: RFC6890 TEREDO" list=not_global_ipv6
add address=2001:2::/48 comment="defconf: RFC6890 Benchmark" list=not_global_ipv6
add address=fc00::/7 comment="defconf: RFC6890 Unique-Local" list=not_global_ipv6

add address=::/128 comment="defconf: unspecified" list=bad_dst_ipv6

add address=::/128 comment="defconf: unspecified" list=bad_src_ipv6
add address=ff00::/8  comment="defconf: multicast" list=bad_src_ipv6

添加防火墙规则

接下来就可以添加防火墙规则了。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
/ipv6/firewall/raw/

add action=accept chain=prerouting comment="defconf: enable for transparent firewall" disabled=yes
add action=accept chain=prerouting comment="defconf: RFC4291, section 2.7.1" src-address=::/128 dst-address=ff02:0:0:0:0:1:ff00::/104 icmp-options=135 protocol=icmpv6
add action=drop chain=prerouting comment="defconf: drop bogon IP's" src-address-list=bad_ipv6
add action=drop chain=prerouting comment="defconf: drop bogon IP's" dst-address-list=bad_ipv6
add action=drop chain=prerouting comment="defconf: drop packets with bad SRC ipv6" src-address-list=bad_src_ipv6
add action=drop chain=prerouting comment="defconf: drop packets with bad dst ipv6" dst-address-list=bad_dst_ipv6
add action=drop chain=prerouting comment="defconf: drop non global from WAN" src-address-list=not_global_ipv6 in-interface-list=WAN
add action=jump chain=prerouting comment="defconf: jump to ICMPv6 chain" jump-target=icmp6 protocol=icmpv6
add action=accept chain=prerouting comment="defconf: accept local multicast scope" dst-address=ff02::/16
add action=drop chain=prerouting comment="defconf: drop other multicast destinations" dst-address=ff00::/8
add action=accept chain=prerouting comment="defconf: accept everything else from WAN" in-interface-list=WAN
add action=accept chain=prerouting comment="defconf: accept everything else from LAN" in-interface-list=LAN
add action=drop chain=prerouting comment="defconf: drop the rest"

恭喜

截至目前,现在你的路由器就可以访问ipv6网络了。

为你的局域网设备分配ipv6公网地址

那么你会发现,诶?我已经创建了隧道,为什么我的电脑,手机还是不能通过ipv6访问网站呢?

这是因为你的设备还被分配可路由的公网v6地址啊。你或许能发现,我的路由器有给我分配ipv6地址啊,但是一切以fe80作为前缀的地址都是路由器给你分配的本地地址,这仅仅是用来在支持ipv6功能的路由器上满足主机间相互通讯的需求。

内网ipv6地址

IPv4 链路本地单播地址从地址块 169.254.0.0/16(169.254.0.0 至 169.254.255.255)分配。在 IPv6 中,单播链路本地地址从块 fe80::/10 分配。

接下来我们就来配置路由器让你的设备能获取到公网ipv6地址。

添加新的地址

首先我们先将tunnel broker中分配给我们的公网地址网段,也就是一开始的r_ipv6_prefix,添加进路由器。

也只有这个网段才可以被添加,因为这个tunnel broker允许被路由的地址段。其他不在这个段内的地址是不会被broker所路由的,也就无法访问互联网。

IPv6 > Addresses 中添加地址:

  • Enabled:✅
  • Comment:备注,不说了
  • Address:r_ipv6_prefix
  • Interface:⚠️注意⚠️,根据配置不同,这里应当选择你的局域网接口,默认情况下这里会是bridge。如果不确定,你可以去翻找 IPv4 > Addresses192.168.xx.0 所链接的接口名,填写相同的就可以了。
  • Advertise: ✅ 一定要勾选上,这样才能将网段中的地址分配给设备。

添加v6字网地址段

修改 ipv6 ND 配置

什么是 ND ?

ND 是 Neighbor Discovery Protocol(邻居发现协议)的简称,这是 IPv6 中非常重要的一个协议。ND 协议主要用于在 IPv6 网络中管理设备间的通信,类似于 IPv4 中的 ARP(地址解析协议),但功能更强大。下面是 ND 的简单解释:

  • 地址解析:把一个设备的 IPv6 地址转换为它的链路层地址(如 MAC 地址)。
  • 自动配置:帮助设备自动获取 IPv6 地址和网络参数(如路由器地址)。
  • 路由发现:查找和学习网络中的路由器。
  • 邻居可达性检测:检查一个邻居设备是否仍然在线。
  • 重复地址检测(DAD):确保网络中没有设备使用重复的 IPv6 地址。

你会发现,即使我们没有DHCPv6并未开启,但所有的设备一开始也会获得一个本地地址,这并不是DHCP机制分配的,而是ND起作用了。

正因如此,我们才需要将新添加的网段的Advertise属性打开。这样ND便会根据网内的设备的MAC来分配一个可用的地址并且记录在表。

Advertise 表示“通告”或“广播”,设备通过发送特定的 ND 消息(如 Router Advertisement 或 Neighbor Advertisement),告诉其他设备它的存在或者提供网络配置信息。

我们点开IPv6 > ND > Interfaces,这里应该已经有一个默认的设置,接口为bridge。如果没有或者你在上一步添加地址中所设定的接口为其他,那么请创建一个新的。

为了能让我们的设备能正常访问ipv6网址,我们需要设定好DNS,更改如下设置:

  • DNS Servers:DNS服务器,我们可以使用Cloudflare的或者其他的。都可。
  • Advertise DNS:✅
  • 其他配置查看截图。

ND设置

测试能否通过ipv6访问

重新连接路由器,断网重连,重启网口都行,让ND给你分配新的v6地址。

打开 https://ipv6-test.com/,如果能正常显示你的ipv6地址,那么恭喜你,你已经成功了。

ipv6测试

动态更新HE上的公网ipv4端口地址(可选)

我自己没有尝试过,因为我不需要😁。但是有人分享了几个ros脚本可以完成这一切。请看这篇文章的Tunnel update script的章节以及后文

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计