Shell's Home

Aug 5, 2015 - 1 minute read - Comments

ipv6试用手记

ipv6地址

概要

挑简单的讲吧。

ipv6地址总计128位,分为8个段,每个段16位。hex表示的话,每段最多有四位。在写出ipv6地址的时候,用:分割。所以一个经典的地址写出来是这个样子的:

aaaa:bbbb:cccc:dddd:eeee:ffff:gggg:hhhh

这里有两个缩写。一,如果一个数字的开始有连续的0,可以忽略。好比0001和1是一样的。二,如果有多个连续的段是0,可以缩写为::,但是只能缩写一次(这样才能确定一个唯一的地址)。例如以下是一个缩写过的地址。

aaaa:b:c:d::1

这个地址等同于

aaaa:000b:000c:000d:0000:0000:0000:0001

ipv6地址分类

::/128 未定义 ::1128 回环地址(127.0.0.1) fe80::/10 局部地址 ::ffff:0:0/96 ipv4映射地址 ff00::/8 广播地址(其实更小,不过我的路由表里就是这样写的,全保留给他了)

更多地址请去看wikipedia。

EUI-64地址

简单来说就是通过mac地址的48位,扩充到64位,作为ipv6地址的最后64位。

ipv6地址分配和基本网络设定

ipv6下有两种ip自动分配方案。通常都建议无状态的方案。

dhcp

一种还是经典的dhcp,这种方案分配出来的地址比较紧凑连续,空间利用率高。坏处是ip地址并不唯一固定。在多数情况下dhcp都会尽力分配和上次一样的ip下来。但是在地址池比较满和系统缓存被清理的情况下,并没有保证。

在interfaces里,dhcp的写法大致如下:

iface ethX inet6 dhcp

slaac

另一个是嫌地址太大的slacc。基本原理就是给一个组织(例如家里)分配一个/64的段,然后用EUI-64(似乎是)给里面的所有设备分ip。所以这样分出来的ip完全一致。

在interfaces里,slaac的写法大致如下:

iface ethX inet6 auto

dns

ipv6里进行配置还需要注意一点,你的DNS需要支持AAAA记录。不然拿着网址查出一个ipv4记录来就很尴尬,还得退化到ipv4去访问。这和直接使用ipv4没什么区别,反而更糟。

实际上,大部分DNS都支持AAAA记录,只是程序会不会默认去查而已。

另一个问题是,如果你的DNS服务器地址是ipv4的,也会使得你无法完全脱离ipv4网络。因此需要一个有ipv6地址的DNS。一般你的ipv6链路供应商会提供一个ipv6的DNS。

firewall

slaac使用icmpv6,所以需要在防火墙上打开icmpv6协议的进入。

tunnel breaker

he提供一个6to4的tunnel,但是需要你有静态ip地址。(其实凭心而论这真不是一个太高的要求,很多VPS供应商完全可以直接搞一个48的段给自己的机房分64的段)作为普通用户,没有静态地址怎么办?那就只有用vps先接到tunnel,然后再tunnel回家了。

tunnel to he

很容易,配一根6to4的tunnel就好。tunnel breaker的网站上还很贴心的提供了不同系统下的详细配置。

这里特别提一下。HE很贴心的提供了两段地址。一段ipv6是你和HE的隧道地址。另一段地址也会路由给你,这才是你内部应当使用的ip地址群。所以原则上说,你可以在隧道中使用(本来应当在)你和HE之间使用的地址的部分。

tunnel to yourself

先随便打一根二层的隧道。

二层的理由是,如果使用三层隧道,那么隧道本身就需要察知ip。于是ipv6的支持就变成隧道的事了。而二层的隧道并不需要知道上面跑什么协议。

最简单的当然是gre隧道。但是gre隧道需要在远端确定本地ip地址,这和直接打一根tunnel回家没什么区别。

我用的方法是用任何一种二层或三层vpn打到vps上,然后上面再跑gre。这样一举解决了加密和静态地址的问题,顺便还解决了ipv6兼容性的问题。当然,代价也很高。由于是在vpn里套gre,所以头部很大,mtu就要开的比较小。

另一个玩法是用ipsec的tunnel模式打通两个网段,于是gre也可以直接通到vps上(甚至可以直接打ipv6 tunnel)。然而ipsec的tunnel模式需要知道双端ip地址,所以其实还是没有什么用。

顺便吐槽一下routeros的ipsec,实在是太废物了。

当然,也可以用支持ipv6的三层隧道。PPTP都有ipv6支持。当然,我看了一眼,要把ipv6 tunnel回来还是有点问题的。

无论怎么配置,这根隧道要用你和HE之间tunnel的部分地址。例如你和HE的tunnel是这个样子:

a:b:c:d::164 <-> a:b:c:d::264

那么你可以将原来的/64改为/112,然后配置这么个tunnel地址:

a:b:c:d::1:1112 <-> a:b:c:d::1:2112

route

在vps上,需要将routed addresses指向内部的路由器。路由器需要将default路由指向vps。default指过去后其他细节就不用管了。

MTU

由于在两层隧道内跑的ipv6,因此mtu记得调整一下,否则有性能问题。

firewall

防火墙是个大头,所以要单独提出来说。

原则上说,ipv6的所有地址都是外部可达的。因此如果你将路由器上的forward关闭,那就没有使用ipv6的意义了。然而,如果forward打开的话,那么每一台都真实的暴露在公网上了。因此每台必须都配置防火墙,否则就可能有安全问题。

例如通常内网会打开ssh,并且不会打开防扫描,或者做安全加固。如果打开了ipv6,又没有在路由器上关闭forward,那么就会造成这个端口对全世界开放。虽然原则上说,没有人会扫描ipv6(因为一个家里的地址比全世界的ipv4还大)。但是这并不安全。因为会有人从你对外的访问地址看出你的内部机器ip。

所以我的建议是,关闭forward,只对特定地址打开。而这些地址上,都需要保证配置了ipv6防火墙。这样即使不慎接入了一个设备,没有开防火墙。也不会造成安全隐患。当然,缺陷就是,随着接入设备的增多,你的地址列表增加很快。

reference

程序员交友选择题 关于vpn的一些话

comments powered by Disqus