News:本站已支持双栈访问,纯IPv6环境下可能存在部分元素无法加载问题,正在修复中

给云服务器添加TunnelBroker隧道提供IPv6访问

帆尼玛 254 0 条

众所周知,今年工信部牵头发布了一个关于推进IPv6部署的一个什么文件,全国各大运营商都在抓紧时间推进IPv6部署。为了响应国家政策,在运营商还没搞定的情况下,我们可以自己现行利用6in4隧道为网站和其他服务提供IPv6访问。

准备工作

检查VPS是否开启IPv6

有一部分服务商提供的镜像是关闭了IPv6功能的,可以尝试ip addr命令,观察eth(venet等 视虚拟化环境而定)适配器是否有inet6项目

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq state UP group default qlen 1000
    link/ether fa:16:3e:e9:25:da brd ff:ff:ff:ff:ff:ff
    inet 115.47.*.*/22 brd 115.47.*.* scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fee9:25da/64 scope link
       valid_lft forever preferred_lft forever

如本站所在机器,适配器eth0下有inet6项目,一般说明IPv6功能是开启的。

准备配置IPv6隧道

首先需要知晓和记录自己VPS所使用的公网IP,并保证地址可以从公网ping通。这是因为我们准备使用的TunnelBroker会用ICMP探测主机是否存活,若不通则会拒绝建立隧道,若出现无法ping通,请检查防火墙、安全组等功能是否屏蔽ICMP数据包。

然后访问HE.net提供的隧道服务官网:https://www.tunnelbroker.net 点击左侧的Register注册一个TunnelBroker账号,并登陆。登陆后在左侧选择“Creat Regular Tunnel”,根据需要选择访问速度最快的服务器,在唯一可以填写信息的地方填写VPS的公网IP,点击最下方的“Creat Tunnel”就完成了。

在Tunnel的详情界面,可以看到以下内容:

其中有以下几项需要用到:

  • Server IPv4 Address 服务端IPv4地址(用于通过IPv4连接隧道)
  • Server IPv6 Address 服务端IPv6地址(用于IPv6网关地址)
  • Client IPv4 Address 本地IPv4地址(用于让服务器允许连接)
  • Client IPv6 Address 本地IPv6地址(作为本地IPv6地址使用)

下方还有两个项目,Routed /64Routed /48,这两项是申请带有路由的IPv6地址块(地址前缀),以允许连接隧道的设备向下级设备分配全局唯一IPv6地址或分配子网前缀。

若你是独立服务器运行虚拟机、VPS作为VPN服务端、设备作为软路由等功能,下级网络有地址需求,但没有下级路由的情况下,可使用/64地址向下级设备分配/128地址。

若下级还有路由或其他分配设备,可用/48地址向下级设备分配大于/64的地址,使多层设备可以实现不同子网分配。¹

配置

官方配置

在Tunnel页面有一个选项卡为Example Configuration,可以提供HE.net针对不同系统提供的参考配置命令。一般来说对于Centos等系统,可以直接采用推荐的linux-route2类型命令直接配置。例:

modprobe ipv6
ip tunnel add he-ipv6 mode sit remote 64.62.134.130 local 115.47.*.* ttl 255
ip link set he-ipv6 up
ip addr add 2001:470:66:*::2/64 dev he-ipv6
ip route add ::/0 dev he-ipv6
ip -f inet6 addr

但这种配置方法会存在重启后配置丢失的问题,在查阅相关资料后,可以知道he.net提供的隧道其实是6in4隧道,隧道两端sit设备采用相反的配置即可生效。

重启不丢失的配置

已经知道了大概的原理,就可以开始着手进行配置了。6in4的本地适配器我们这里使用sit1,在Centos7环境下举例。

设定IPv6设备和网关

/etc/sysconfig/文件夹内,编辑network文件,加入(或修改为)以下内容,启用IPv6和设置默认设备

NETWORKING_IPV6=yes
IPV6_DEFAULTDEV="sit1"

以上内容是用来启用IPv6,并设置IPv6的默认设备为sit1

/etc/sysconfig/network-scripts文件夹内,编辑现有的网卡配置文件(如网卡为eth0,则编辑ifcfg-eth0),加入(或修改为)以下内容

IPV6ADDR=服务端IPv6地址

以上内容用来设定IPv6网关地址

/etc/sysconfig/network-scripts文件夹内,新建文件ifcfg-sit1并编辑,写入以下内容:

DEVICE=sit1
ONBOOT=yes
BOOTPROTO=none
IPV6INIT=yes
IPv6TUNNELIPV4=服务端IPv4地址
IPV6TUNNELIPV4LOCAL=本地IPv4地址
IPV6ADDR=本地IPV6地址

此处要特别注意,若本地IPv4地址为内网地址(如腾讯云),请在此处配置文件里面应填写内网地址,不要直接写公网地址。

配置文件写完后,执行service network restart重启网络服务,此时Tunnel应能够正常工作,且重启后不会丢配置。
可以通过ping6命令测试网络是否连通:

[root@instance_76a551 ~]# ping6 ipv6.baidu.com
PING ipv6.baidu.com(2400:da00:2::29 (2400:da00:2::29)) 56 data bytes
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=1 ttl=47 time=355 ms
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=2 ttl=47 time=356 ms
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=3 ttl=47 time=356 ms
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=4 ttl=47 time=355 ms
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=5 ttl=47 time=356 ms
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=6 ttl=47 time=356 ms
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=7 ttl=47 time=355 ms
64 bytes from 2400:da00:2::29 (2400:da00:2::29): icmp_seq=8 ttl=47 time=371 ms
^C
--- ipv6.baidu.com ping statistics ---
9 packets transmitted, 8 received, 11% packet loss, time 8008ms
rtt min/avg/max/mdev = 355.465/358.044/371.920/5.258 ms

但需要注意的是,隧道在一段时间没有活动的情况下,会自动断开,建议运行一个cron一段时间进行一个ping6以保持隧道连通。

额外内容:为Nginx提供IPv6访问

nginx的配置文件中,一般可以看到监听相关配置,修改为类似如下格式:

{
    listen 80;
    listen [::]:80;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name imfan.net www.imfan.net;
    ……

重新载入nginx配置后,nginx此时会同时监听IPv4和IPv6的80/443端口。若依然访问不通,可检查ip6table相关配置,是否放行相关端口。

额外内容:增加DNS解析

IPv6地址在DNS中利用AAAA记录进行指定,为域名添加地址为“本地IPV6地址”的记录即可支持IPv6解析。
需要注意的是,AAAA记录可以和A记录并存,实现双栈访问,但不能与CNAME并存,这需要CDN用户注意。

¹ 主要用于路由器等设备为下级设备提供IPv6接入、分配IP使用

与本文相关的文章

发表我的评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址