IPv6与路由

 

介绍了使用IPv6需要的基础知识:地址,分配方式,邻居发现协议,指出了校园网下IPv6配置的困难,对配置方法的思路做了汇总和分析,最后还给出了临时接入的方法

介绍了使用IPv6需要的基础知识:地址,分配方式,邻居发现协议,指出了校园网下IPv6配置的困难,对配置方法的思路做了汇总和分析,最后还给出了临时接入的方法

前言

来到大学之前看到关于学校网络一句这样的话:

学校的规矩很扯淡,大一没有校园网账号,没法上网查资料,但是宿舍的网线插口只要连上电脑就有IPv6地址,操作一下就可以校园网免流量上网

嗯,知识改变命运

初入大学,当时听学长说六维空间开放注册,从小对PT憧憬的我自然是很激动啦,学长说无线网络不能访问IPv6,只有靠学校的有线校园网才行,可是当时又没有校园网账号,连电脑都是借的,突发奇想到图书馆拔掉了查询台的网线,但是直到半年后我才知道,学校图书馆的内网和校园网都是分离的,短短几个小时的开放注册时间在几次尝试无果之后就错过了

第一次接触到IPv6,只留下了一堆问题,于是开始遍历学校的信息处网站,论坛;看了些文章,有了一些了解,不过还是处于一知半解的状态;幸运的是,从家里带到学校的Newifi mini,是一台获得了OpenWrt官方支持的路由器,后面经过学长推荐又刷入了LEDE,自己动手实现了宿舍的IPv6网络的无线覆盖,而网络折腾之路也就此开始

回到正题,IPv4的地址早已枯竭,公网IP难求,平时所获得的IPv4连接已经通过了层层NAT(Network Address Transfer),这对点对点传输是极为不利的,而IPv6完全有能力为每个设备分配一个公网IP,轻松实现端到端的连接

近些年IPv6的普及速度加快,不仅仅是各地的宽带陆续向家庭用户分配IPv6地址,连4G网络也可以分配到IPv6地址了,而教育网作为试验田,早在2003年就建设了纯IPv6的CERNET2:

  • 与国际学术互联网高速互联
  • 部分学校开放了IPv6的PT站
  • 对IPv6不限流不限速

为什么路由器不能让局域网接入IPv6呢?

首先就是现在大部分的路由器本身不支持IPv6,尽管工信部于4月发文《关于开展2019年IPv6网络就绪专项行动的通知》,但路由器厂商并没有多少动静,据悉,网件,华硕,linksys之类的高端路由器很早就支持IPv6了,而华为和TPlink,小米的部分路由器近来又陆续有固件的推送,也实现了原生IPv6的支持,其他的路由器只能靠刷机等方式获得IPv6支持

其次,即使刷机或者换设备,各个学校和地方的IPv6接入方法和认证方法千差万别,网上的教程是不一定管用的,往往需要在校内找成功的案例

以上两点就导致了IPv6配置上的困难,要搞清楚这个问题,需要一点计算机网络的基础知识

参考:本文带有一定的综述性质,部分参考了:

  • Koolshare论坛的帖子:多种无PD的情况下给内网配置IPv6的方法
  • 网络上可以找到的关于IPv6配置方面对原理写的最详细的一篇,主要针对的是使用merlin固件的路由器
  • 基于MAC地址的锐捷认证
  • 文章比较长,实践的话对基础有一定的要求(精简版的梅林没成功路过)

  • 如何在路由器后获取 IPv6 地址
  • 来自中山大学,采用SLAAC
  • 提供了OpenWrt,极路由以及华硕 Merlin/Padavan 固件的配置方法
  • 认证方式不明,不能用桥接(应该也是基于MAC)

  • 校园网IPv6 x 华硕 AC86U
  • 有源码分析的一篇 梅林+桥接 的文章
  • 在普通的桥接的基础上,路由器本身也可以获得IPv6地址

IPv6基础

IPv6地址

地址类型

IPv6里面有三种地址类型:

  • Unicast: 单播,终端访问互联网最常用的地址,唯一标识一个网络接口
  • Anycast: 任播,一类特殊的IP地址,多个网络接口(不同的设备)都配上相同的地址,往这个地址发送数据的时候,路由器会只发往其中的一个接口,一般发往最近的那一个
  • Multicast: 多播,代表一类unicast的集合,往这个地址发送数据的时候,会将数据发给属于这个多播组的每个unicast地址,部分地址已经被用于某些协议,如ff0X::101对应NTP服务器(授时)

包括上述的基本类型,还有一些特殊地址,如下:

类型 前缀 IPv6 表示方法
Unspecified 00…00 (128 位) ::/128
Loopback 00…01 (128 位) ::1/128
Multicast 11111111 FF00::/8
Link-Local unicast 1111111010 FE80::/10
Unique local address 1111110 FC00::/7
Global Unicast 所有其它  
  • 全0的地址 ::/128 为未定义地址
  • 除了最后一位是 1 ,其它都是 0 的地址 ::1/128 为本地环回地址,同IPv4的127.0.0.1
  • FF00::/8 这个网段的地址都是多播地址
  • FE80::/10 为 Link-Local 的单播地址,这类地址不能穿过路由器
  • FC00::/7 为本地的单播地址,可以在局域网内路由
  • 全局的单播地址目前只有 2000::/3 开头的可以被申请使用,其它的都被预留了

单播地址构成

IPv6要求所有的单播(unicast)地址的子网必须是64位的,即下面这种格式:

64 bits 64 bits
subnet ID interface ID

IPv6隐私扩展

当一个设备使用SLAAC配置其IPv6时,它会使用网络前缀和网卡的MAC地址构造地址,这会引起安全问题:计算机的MAC地址可以轻松通过其IPv6地址推算出。为了解决这个问题,提出了“IPv6隐私扩展”标准(RFC 4941)。使用这个隐私扩展,内核会从原本的IPv6地址计算生成一个“临时地址”。在连接远程服务器时,系统会优先选择这个地址以隐藏原来的地址

如Windows的使用ipconfig命令可以看到一条“临时IPv6地址”,在日常的主动发起的对外连接,如访问IPv6测试网站,显示的就是该IP

地址分配方式

一处细节:

root@D2:~# ip addr | grep dd80
    inet6 dd80::2276:93ff:fe4b:230/64 scope global noprefixroute
    inet6 dd80::10/128 scope global noprefixroute

有的地址是/64,有的是/128,这两个地址前者来自于SLAAC,后者来自与DHCPv6

SLAAC

IPV6除了显著增加了地址空间外,另一个最显著的特征就是它的即插即用性,支持SLAAC:Stateless Auto Configuration(无状态自动分配),IPv6主机使用邻居发现协议(NDP)对自身进行自动配置,不用借助DHCP服务器

一种基本的情形就是本地的链路地址(Link-Local,fe80::/10):系统启动后,会为每个网卡生成一个Link-Local的IP地址:fe80:: + INTERFACE_ID,该地址于本地有效,只能用于本地的通信,其中包括了到IPv6网关的通信

对于平时通信使用的IPv6地址的生成方式和上面类似:设备接入网络后,系统会通过广播的方式寻找网络中的路由器(RS,后面有说明),路由器会返回或者定期广播(RA)子网前缀,系统将子网前缀和接口ID组合起来,就构成了一个唯一的IP地址,这个IP地址可以通过路由器路由

PPPoE的SLAAC地址由来

PPPoE拨号在发起连接的时候采用的MAC地址和设备网卡的地址可能没有关联,如linux使用的pppd工具建立PPPoE连接的时候采用的随机MAC,Windows经过测试应该和拨号的账号有关,故每次拨号所获得的IPv6地址的后缀也可能不一样

DHCPv6

当然IP地址也可以由DHCPv6服务器来分配,这种方式分配叫做有状态分配(Stateful Auto Configuration),使用DHCP服务器可以向下级设备分配任意的地址,其中DHCP唯一标识符(DUID)用于客户端从DHCPv6服务器获得IP地址,服务器将DUID与其数据库进行比较,并将配置数据(地址、租期、DNS服务器,等等)发送给客户端

DHCP-PD

对上面的两种地址分配方式,如果下级设备是PC之类的终端,分配到一个地址就够了,但是下级设备是路由器就需要被分配一个地址段才可以继续向下分配公网地址,因此,DHCPv6除了可以分配单个地址之外,还可以做前缀下发(PD,Prefix delegation):DHCP-PD会分配一个地址范围(比如一次分一个/60),这样路由器就可以知道这个范围可以自行分配而不用担心冲突

注意区分PD与前缀,PD从内容上来说是前缀,但是前缀不一定是PD,比如64位的前缀

路由器的官方固件默认支持Native模式也就是在有PD才能为子网配置IPv6,这里要特别提出的是:PD并非是路由器让下级设备获得公网IPv6地址的必要条件,比如CPE也是路由器,使用4G获得IPv6地址,一般手机都是不支持PD的,而连接CPE或者手机热点却可以接入IPv6网络,甚至桥接手机热点的路由器还可以继续分配公网地址,其实这里借助了NDP代理,下面会介绍

邻居发现协议

从地址到通信,就需要通过三层获取二层信息,对应于IPv4的ARP,IPv6借助于邻居发现协议(Neighbor Discovery Protocol,NDP)

NDP消息

NDP定义了5种ICMPv6报文类型或者叫NDP消息,简介如下:

  • 路由器请求(RS):由主机发起,用来请求路由器发送RA
  • 路由器通告(RA):由路由器发起,通告路由器的存在和链路的细节参数(默认路由地址、网络前缀,MTU,跳数限制等),周期性发送,也用于答RS
  • 邻居请求(NS):由节点主机发起,用来请求另一台主机的链路层地址,或实现地址冲突检测、邻居不可达检测
  • 邻居通告(NA):有节点发起用来响应NS,如果一个节点改变了他的链路层地址,那么它能够主动发送一个NA来通告这个新地址
  • 重定向(Redirect):当在本地链路上存在一个更好的到达目的网络的路由器时,路由器需要通告节点来进行相应配置改变

NDP代理

就上面可以知道,NDP消息中广播比较多,自然就会想到,广播能不能穿过路由器?这里可以使用IPv6网桥直接让包括NDP消息内的所有IPv6数据包穿透路由器,但是这可能会带来管理和安全的问题

如果只让NDP消息穿过路由器会带来一个问题:网关和终端之间还隔了一个路由器,RA下发的网关IP是链路本地地址,NS得到的网关MAC与终端不是邻接的,因此这个地址对终端来说就是不可达的,故网络不通

这个时候就需要路由器对NDP做代理:

  1. 将RA广播转发到下级设备,替换IPv6地址和MAC地址替换为LAN的地址
  2. 接收下级设备的NA将其转发到上级网关,只把MAC替换为WAN的MAC

这样一来,终端发出的数据包会先被送到路由器,路由器查路由表转发到上级网关;路收到发往终端的数据包会先被路由器收到,通过对应目的地址和MAC,转发到终端

校园网下配置

困难

校园网下为什么路由器配置IPv6这么麻烦?

无PD

按照IPv6的规范,路由器获得的应该是一个子网范围而不是单独的一个地址,在获得子网范围的情况下就可以通过有状态或者无状态分配的方式使得下级设备获得IPv6地址.但是教育网是早期的试验田,部分学校分配到的地址段并不是那么宽裕,所以直接给所有个人用户分配相同的64位前缀也是无可厚非了

那能不能把路由器当作交换机使用,让所有接入路由器的设备直接获得地址呢?没有认证的情况当然可以,但是现实是部分学校都是需要认证的,这个需要看具体的认证方式

认证

一些学校获得IPv6连接是需要认证的,具体的各种认证的方式,可以参考华为的配置IPv6接入认证

认证带来的就是限制或者叫做绑定,这部分是实践得出的推论:常见的有绑定MAC和绑定IP,普通运营商的IPv6往往也是通过PPPoE认证才能获得的,从一些可用的配置方法上来看,运营商的绑定方式更加灵活,PPPoE绑定MAC和64位的前缀,其中64位前缀前半部分是固定的,标识ISP和地理位置

  • 电信为240e::/20
  • 移动为2409:8000::/20
  • 联通为2408:8000::/20
  • 陕西联通2408:8001:b000::/36

后半部分是随机的(刚好够IPv4的32位),每次拨号都不一样,手机蜂窝网络的前缀也类似,所以手机可以通过开热点的方式让下级设备获得公网IP,同时不会影响到认证

实例

就文章开始所提到的:“宿舍的网线插口只要连上电脑就有IPv6地址”,是本校其他宿舍楼才有的待遇,本宿舍楼必须通过PPPoE拨号认证之后,才会进行IPv6的配置,此处涉及到PPPoE建立网络连接的过程,通过抓包得到的大致的过程是:

  1. 上下级设备先使用MAC完成PPPoE发现和CHAP认证
  2. 通过NCP中的IPCP完成PPP连接上的IPv4地址及DNS的协商
  3. 通过NCP中的IPv6CP交换和确认彼此的Interface-Identifier完成认证
  4. 上级设备通过ICMPv6的RA广播前缀(校园网下的64位前缀,即使下级设备不发出NS也会收到广播)
  5. 下级设备通过SLAAC自动生成地址(+通过DHCPv6请求DNS地址请求)

以SLAAC分配地址的前缀是64位的,后64位来自于PPPoE时的MAC,这部分往往是随机的,之后上级设备在与该下级设备通信的过程中只会接收来自该MAC的数据包,若收到的数据包的源MAC未被认证就不会被接收,这就告别了使用下面方法中的桥接的可能

另外在IPv6CP的过程中,接口ID被提交,地址也被固定下来了,同IPv4的IPCP一样,上级设备也只接收来自IPv6地址的数据包(不然在该前缀下地址可以取任意地址),这样又告别了任何源IP地址为非认证的IP的可能(中继和划分子网)

至于地址:输入命令ifconfig得到的输出中找到PPPoE获取的地址:

root@D2:~# ifconfig   
pppoe-wan
...
inet6 addr: fe80::dcb8:cd0d:422:c123/10 Scope:Link
inet6 addr: 2001:xxxx:xxxx:xxxx:dcb8:cd0d:422:c123/64 Scope:Global
...

第一个地址其实是WAN口的本地IPv6地址,可以看到后64位dcb8:cd0d:422:c123是由网卡的MAC经过转换而来的,第二个就是认证之后得到的一个地址,可以看到后64位是一样的,可以判断这是由SLAAC分配而来的,而2001开头就表明了这是一个全局的单播IPv6地址

接着查看IPv6的路由表:

root@D2:~# ip -6 r
default from 2001:xxxx:xxxx:xxxx::/64 via fe80::96db:daff:fe3e:8fcf dev pppoe-wan

这里的fe80::96db:daff:fe3e:8fcf就是上级设备接口的IPv6地址了,该条目指定了路由器的IPv6数据包的去向:来自2001:xxxx:xxxx:xxxx::/64的数据包走pppoe-wan默认发送到fe80::96db:daff:fe3e:8fcf,因为有规定子网前缀必须为64位(和PD无关),一般不能以此再向下划分子网

而有PD的IPv6路由表是什么样呢?以家里的宽带为例

root@D2:~# ip -6 r                                                                       
default from 2409:xxxx:xxxx:xxxx::/64 via fe80::466a:2eff:fe56:25 dev pppoe-wan proto static metric 512 pref medium
default from 2409:xxxx:xxxx:xxxx::/60 via fe80::466a:2eff:fe56:25 dev pppoe-wan proto static metric 512 pref medium

多了一条/60的条目,源于DHCP-PD,在给定的前缀范围内可以向下分配,路由器会转发所有来自该地址段的数据包到上级网关

无PD情况下内网配置IPv6

经过一代代人的探索,方法非常多,而适用于某个学校只有那么一两种,可以用“路由器/路由器系统 + 校园网/学校名称 + IPv6”搜索或者直接去问学长

就从配置的角度来说,当然是希望在能用的基础上尽可能的好用,比如IPv6 NAT适用性最佳,但是下级设备无法获得公网IP,故又会去尝试中继,桥接之类的方法,而在尝试之后,可以推出大致的认证和绑定的方式,进而放弃一些无意义的尝试

就IPv6转发部分,归结到原理,方法可以分为以下几类,各有优缺,比较如下(下面的标题按照实现原理来划分,各个厂商的命名可能有区别):

中继(Relay)

把WAN的IPv6数据包改MAC代理到LAN里面来,再把LAN的数据包改MAC代理到WAN去

在华硕(梅林)固件上的IPv6 Passthrough模式是基于6relayd实现(据说稳定性一般),而OpenWrt使用odhcpd的Relay模式(NDP代理和RA中继,以及DHCPv6中继)

优势:

  • 使用灵活,上能骗交换机下能骗客户端,几乎可以用于一切情况
  • 若是上级使用SLAAC,则路由下也仍然是SLAAC(如手机热点)客户端兼容性好,Android也能用
  • 可以用于IPv6需要认证的网络(部分认证的情况)
  • 配置比较简单

劣势:

  • 打破了内外网的分隔,外网IPv6一旦出现NS风暴一类的问题,内网也要遭殃
  • 客户端地址分散,路由难以管理自己下面的IPv6客户端

桥接(Brige)

在WAN和LAN之间架一个只允许IPv6数据包通过的桥,IPv6数据包通过网桥直接穿透了路由器,所以也可以叫穿透

优势:

  • 无论是上级SLAAC还是DHCPv6,都能一起解决,无需担心监听端口被占用
  • 配置相当简单

劣势:

  • 不能用于IPv6要认证的网络,因为MAC地址直接暴露给上级了
  • 客户端地址分散,路由难以管理自己下面的IPv6客户端
  • 打破了内外网的分隔,外网IPv6一旦出现NS风暴一类的问题,内网也要遭殃

IPv6 NAT

优势:

  • 路由有能用的IPv6的话,客户端就一定能用
  • 可以在内网使用SLAAC分配地址,让Android支持
  • 可以用于IPv6需要认证的网络

劣势:

  • 下级设备无法获得公网IP,对于PT而言是极大的劣势,自己建站什么的也很麻烦
  • 官方Linux内核3.9以上才添加支持,梅林用的内核版本(2.6)没有IPv6 NAT功能
  • 对部分基于Linux的路由器,通过MASQUERADE设置的NAT的类型为Symmetry,连接性较差(改善手段有限但安全性高)

子网划分

基于Ndppd+Radvd,在64位的子网里,强行划一个更小的子网,这种方法可以找到的材料比较少,配置繁琐,用的人也少

优势:

  • 下级设备可以获取公网IP
  • 地址分配可以自己控制,可以方便地为自己的子网添加防火墙规则等
  • 可以用于IPv6需要认证的网络

劣势:

  • 需要上级设备能对未知的IPv6地址发出NS
  • Android迄今为止都不支持DHCPv6,故需要root后用Tasker之类的软件在WiFi连上后手动添加IPv6地址方可使用
  • 有时候路由自带的防火墙规则会画蛇添足,要想办法阻止路由系统添加IPv6的防火墙规则

以上方法也有在OpenWrt路由器上面的实现,最常用的三种可以参考OpenWRT IPv6 三种配置方式以及文首的参考,考虑到省事,个人还是用的IPv6 NAT,其他的方法在本校于原理层面就不适用,故没有做过多的尝试

认证问题

主要是为了“方便”学生使用,部分学校使用了网页认证或者客户端认证的方法,相较于传统的PPPoE,优势在于统一了单个设备的各种使用情况,但是对使用路由器来说并不方便,对此人民群众总是有办法的

MentoHUST

MentoHUST是由华中科技大学首先是在Linux系统下开发出来,而后扩展到支持Windows、Linux、Mac OS下的锐捷认证的程序(附带支持赛尔认证),部分路由器也有相应的插件和脚本

登陆脚本

这里就是把浏览器的网页认证过程中的请求过程换用脚本来实现,先使用Chrome或者Wireshare之类的软件分析认证登陆的流程,再编写脚本,最后添加到启动项或者计划任务来实现自动认证

接入IPv6的方法

什么情况下IPv6是刚需呢?

在学校接触过了教育网的PT,深感其便利性,然而大部分教育网PT都是限制IPv6注册,登陆以及下载,比如:

北邮人,目前最大的教育网PT,国内运营商IPv6不能登陆,但是国外的IPv6部分可以

北洋园,天津大学校外仅支持IPv6注册,限制使用教育网邮箱,因为可以使用IPv4登陆和下载,是离校的首选

另外,连接仅支持IPv6访问的网站,比如在外访问家里使用DDNS的NAS

代理

需要一台拥有公网IPv4地址的IPv4/IPv6双栈的服务器

手机热点

截至2019年,我所到的地方的4G网络都支持了IPv6,看地址的格式应该是SLAAC得到的,并且手机开热点的时候,下级设备又可以获得地址(还是SLAAC),这是最简单的临时使用IPv6的方法

如果要长期使用(比如放假回家),考虑到流量限制,用手机4G提供IPv6接入(宽带提供IPv4),使用OpenWrt路由器无线中继或者USB共享手机的网络,之后再设置IPv6 Relay

最关键是在连接收集的接口上建立一个DHCPv6 Client(暂命名wwan_6),在新建该接口时,找到OpenWrt无线桥接自动生成的接口(一般默认wwan),指定为物理接口(以往我都是填写的@wwan),之后设置IPv6的中继模式

# cat /etc/config/dhcp
config dhcp wwan_6
    option dhcpv6 relay
    option ra relay
    option ndp relay
    option master 1
 
config dhcp lan
    option dhcpv6 relay
    option ra relay
    option ndp relay

可能需要关闭IPv6防火墙,删除ULA前缀,最后再指定宽带作为IPv4的默认网关即可

LuCI界面的设置参考 CPE/4G模块下的二级路由,与本节桥接手机热点作为二级路由的情况一致