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地址。这里由两种情况:
- 如果你的隧道和你所处的网络同处一个出口IP,那么只需要将这个IPv4填写到IPv4 Endpoint (Your side)的框框中;
- 如果你的隧道和你现在访问该页面的出口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的。这里可以通过浏览器访问:
- IPv4:https://ipv4.ngx.hk
- IPv6:https://ipv6.ngx.hk
以下是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的用户尝鲜或者像我一样用于学习与测试。为了维护良好的网络环境,请不要滥用。