0x01 前言

我身处广东深圳,用着深圳电信的网络,因为工作和学习的需要,我申请了公网IPv4的IP。在目前的情况来看,电信的策略是IPv4与IPv6是互斥的,不能同时拥有,而我向电信客户咨询后也印证了这一点。

IPv6已经在国际中推广好几年,而近期我国也在大力推广,成效非常明显,可惜的是我一直没有在家庭宽带中尝试使用IPv6。为了不被时代抛弃,我决定开始学习IPv6的相关知识,而学习的最好途径是实践。

为了达成通过实践的形式学习IPv6的目的,我通过HE(Hurricane Electric Internet Services)提供的IPv6隧道在本地的pfsense中完成部署,从而实现IPv6协议的接入,并且进行一系列的内网配置与安全测试,从而找到适合企业部署IPv6的实践方式。

0x02 概念

IPv6的深层次知识不在这里探讨,因为本文主要描述HE IPv6隧道配置的方法。

首先需要知道的是IPv6的地址和IPv4有相似之处,它们都有一些特别的IP段,比如IPv4常见的局域网IP段:192.168.0.0/16、10.0.0.0/8和172.16.0.0/12等。而今天这篇文章所涉及到的IPv6隧道也有个特殊的网段:

  • Teredo隧道:2001::/32

每个IPv6地址由7个冒号“:”分为8组,每组用4位十六进制的字符表示,也就是IPv6最长支持128位。地址的可用数据说有沙子那么多,但是我不知道具体沙子数量的数目,不过我知道IPv6一共有2的128次方个。

而IPv6的地址是可以缩写的,比如在实际配置的时候会遇到一个HE的DNS服务器地址:

  • 2001:470:20::2

从上面的简单概念可以知道IPv6共有8组,如果一个组存在开头为0的字符,那么可以将第一个非0数之前的所有0都隐藏;如果同一组全是0,则可以该组全隐藏。下面是HE DNS的完整地址:

  • 2001:0470:0020:0000:0000:0000:0000:0002

Teredo是一个IPv6与IPv4的转换机制,它可以将IPv6的数据封装在IPv4数据包中,并通过UDP协议传输到Teredo中继器,Teredo中继器解包后,再将数据在IPv6网络中传输。

正因为我的家庭宽带没有原生的IPv6,所以需要采用这种方法获取IPv6的地址,而Teredo也有特定的IP段,也就是上面写到的:2001::/32。以后一看到2001开头的IP段就可以将其设想为非原生的IPv6网络,而这种网络在使用上可能会遇到一些问题。

0x03 准备

首先打开Hurricane Electric Free IPv6 Tunnel Broker的页面:

如果没有HE的账号密码,请自行注册,注册的时候注意填写真实信息并留有有效的电子邮箱,提交后需要通过邮件内的地址对电子邮箱进行确认以激活账户:

登入后即可点击Create Regular Tunnel创建隧道:

打开页面之后会自动ping所有服务器地址并自动选择一个延迟最低的节点,但你可以根据实际情况进行选择,不过所有隧道的速度都不太理想,基本在1Mbps以内。还有一点需要注意的是:一天内只能创建5次隧道,但可以建立多个账户,一个账户只能创建5个隧道:

上图中默认选择了洛杉矶节点,而在上面有个IPv4,这是我访问该页面时被识别到的IPv4地址。这里由两种情况:

  1. 如果你的隧道和你所处的网络同处一个出口IP,那么只需要将这个IPv4填写到IPv4 Endpoint (Your side)的框框中;
  2. 如果你的隧道和你现在访问该页面的出口IP不通,那么请填写隧道所用网络的出口IP地址。

而我只有一个出口IP,所以只需要将页面上显示的IPv4填写到框框即可:

如果同一出口IP已经存在HE的隧道,那么会出现如上图的提示;如果你的公网IP禁ping,请放行页面中提示的IPv4地址,该地址并未在上图显示,而这地址为HE的监控节点IP。

如果你没有公网IP或者没法为页面提示的IP放行ICMP协议,那么你用不了HE的IPv6隧道。

最后点击页面底部的Create Tunnel,稍等片刻后即可看到隧道的信息:

注意!上图中被抹去的信息都是敏感信息,请务必注意保密。在某些情况下,你的路由器或网络可能缺少IPv6的安全配置,一旦泄露很可能给你的网络和数据带来危害,甚至由泄露和被渗透的可能!

0x04 pfsense 网卡配置

首先新建GIF (Generic tunnel InterFace,通用隧道接口),通过interfaces > assign > GIFs打开相应的页面并点击ADD:

而后做出以下配置:

  • Parent Interface:公网IP所在的接口;
  • GIF Remote Address:填写Server IPv4 Address的值,此为HE隧道节点的IPv4地址;
  • GIF tunnel local address:填写Client IPv6 Address,此为本GIF接口的IPv6地址;
  • GIF tunnel remote address:填写Server IPv6 Address,此为HE隧道节点的IPv6地址;
  • GIF tunnel subnet:选择64,此为默认前缀;
  • Description:GIF接口描述,可选。

填写完成后即可点击Save保存。然后来到Interface Assignments将刚才新建的GIF接口创建成一个可以用的网卡,在Available network ports中选择刚才新建的GIF接口并点击ADD,最后点击SAVE即可:

最后还需要配置IPv6的默认网关,通过System > Routing > Gateways进入网关的配置页面,将Default gateway IPv6选为刚才新建的网卡,最后单击Save:

然后来到Status > Gateways检查下连接情况:

因为网络质量不太好,所以延迟较高,丢包率在10%左右。

最后可以到Diagnostics > Ping页面中做ping测试:

如果有响应则说明配置成功,如果没响应,可能是配置错误或网络不通。

0x05 防火墙

在部署DHCPv6服务器为客户机分配IPv6的IP前,需要先检查防火墙配置。因为IPv6的特性,每个IP都是一个公网IP,防火墙的两侧均可以互联而不像IPv4需要NAT。这很重要!

因为我的IPv6是用于测试环境,所以不对出站流量做控制,只针对入站流量,在这里需要禁止主动传入的流量。打开Firewall > Rules > HEV6页面,这个HEV6是上面设置的IPv6的网卡:

默认情况下会如上图所示,规则为空。这种情况则表明所有主动传入的流量均被丢弃。因为这个网卡为IPv6的默认网关,所以流量都会经过它,这类似WAN。如果这个网卡的防火墙里由其他规则,请自行甄别,严控主动传入的流量。

为了能让通过DHCP服务获取IPv6的设备联网,还需要指定网卡的防火墙放行IPv6流量,因为默认是丢弃的。在我的环境中,我在名为GAME的网卡里配置了固定的IPv6 IP,这部分将在下一节讲解。首先需要放行IPv6流量:

详细的配置如下:

0x06 DHCPv6

配置DHCPv6服务之前需要设置一个网关,这个网关可以在现有的网卡里配置一个固定的IPv6地址而不需要重新建立。

在我的环境中,我选择在GAME网卡中添加,而这个IPv6是有网段限制的,这可以在HE的页面中找到,请留意Routed IPv6 Prefixes的部分,其中Routed /64有个IPv6的地址,而Routed /48为可选项,需要的时候可以点击Assign /48获取。

打开GAME网卡的配置页面,并将IPv6 Configuration Type设置为Static IPv6,并在Static IPv6 Configuration中的IPv6 address设置为Routed /64的IP地址。这里需要注意的是:Routed /64的IPv6是一个段,这个段是属于我们自己的,而网卡需要一个特定的IP地址作为网关而不是一个IP段,因此需要在后面加上一个1或者其他符合IPv6的数字。最后选择的前缀需要和HE页面中一致:

保存后即完成网关的配置。

然后来到GAME网卡的DHCPv6配置页面:

  • Services > DHCPv6 Server & RA > GAME > DHCPv6 Server

首先勾选Enable DHCPv6 server on interface GAME选项以启用该端口的DHCPv6服务;

注意Available Range中标注的可用DHCPv6 IP范围,这个范围的开始值需要手动配置,需要避开网关IP,终止IP则可以填写最大值。将IP分别填写到Range中即可;

Prefix Delegation Size为前缀,可以根据实际情况随意选择,

DNS Servers在HE页面中有一个通用的:2001:470:20::2,建议将网关的IP也填写上去。

先点击Save,然后来到Router Advertisements,将Router mode设置为Managed模式:

保存后即可完成所有配置。接下来就是接入虚拟机或者实体机进行测试。

0x07 测试

我的测试步骤很简单,分别用centos7与windows 2016进行,将两台虚拟机接入相应的虚拟交换机即可,以下为windows 2016的相关信息,centos7与之类似:

进入系统后,打开powershell并使用ipconfig命令检查IP信息:

下图是路由信息:

下图是centos7的IPv6信息:

下图为centos7的路由信息:

我有两个域名可以返回访客的IP地址,分别支持IPv4和IPv6,主要为DDNS脚本获取本机IP的。这里可以通过浏览器访问:

以下是windows 2016的测试结果:

以下是centos7的测试结果:

还可以在windows 2016上访问以下网站以便检测IPv6的服务是否正常:

0x08 DDNS

回想下在申请HE隧道的时候我们需要填写本地IPv4的公网IP,这里有个问题:我们家用的宽带大部分会在固定的间隔强制重新连接,这也就意味着IP可能会发生变化。而这个变化会导致HE校验失败,因为HE不知道你的IP变了,最终导致IPv6隧道不可用。

为此,HE提供了API,让我们通过调用API的形式更新自身的IPv4 IP。

首先回到HE的页面,在IPv6 Tunnel标签中找到Tunnel ID并记下来:

然后来到Advanced标签,将Update Key记下来:

注意!这里有个MTU,建议将该值设为与你PPPoE的值一致或者保持默认的1480。如果做出了更改,请务必在GIFs端口中修改。

记下必要的信息后,来到pfsense的Services > Dynamic DNS > Dynamic DNS Clients页面,新建一个Dynamic DNS Clients:

  • Service Type:HE.net Tunnelbroker;
  • Interface to monitor:选择公网IP所在的网卡;
  • Hostname:填写Tunnel ID;
  • Username:填写HE的用户名;
  • Password:填写Update Key

确认信息后单击Save即可。

0x09 结语

HE的这个服务是完全免费的,主要让没有原生IPv6 IP的用户尝鲜或者像我一样用于学习与测试。为了维护良好的网络环境,请不要滥用。