拓扑

完整拓扑
完整拓扑

配置完成后,拓扑可看成如下图所示

简化后的拓扑
简化后的拓扑

拓扑及拓扑里的IP是示意图,并不与下面的配置一一对应

CentOS 7 启用IPv6

没有开启IPv6时的网卡信息

[[email protected]_abc ~]$ ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:3e:0c:ad:cf brd ff:ff:ff:ff:ff:ff
    inet 172.18.144.xxx/20 brd 172.18.1xx.xxx scope global dynamic eth0
       valid_lft 29204146sec preferred_lft 29204146sec

没有看到IPv6的地址。如果开启了IPv6,至少能看到lo接口显示inet6的地址::1,eth0也会有一个以FE80开头的链路本地地址
查看/etc/modprobe.d/disable_ipv6.conf

[[email protected]_abc ~]# cat /etc/modprobe.d/disable_ipv6.conf
alias net-pf-10 off
options ipv6 disable=1

修改为下面的值

[[email protected]_abc ~]# vim /etc/modprobe.d/disable_ipv6.conf
alias net-pf-10 off
options ipv6 disable=0

查看/etc/sysconfig/network

[[email protected]_abc ~]# cat /etc/sysconfig/network
# Created by anaconda
NETWORKING_IPV6=no
  ERNTP=no

修改为下面的值

[[email protected]_abc ~]# vim /etc/sysconfig/network
# Created by anaconda
NETWORKING_IPV6=yes
  ERNTP=no

查看/etc/sysctl.conf

[[email protected]_abc ~]# cat /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

修改为下面的值

[[email protected]_abc ~]# vim /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0

重启

[[email protected]_abc ~]# sysctl -p

he.net IPv6隧道

申请步骤省略
阿里云ECS的网络似乎还没支持IPv6,至少安装的Linux系统没开启IPv6。那要如何获取IPv6地址呢?网卡启用IPv6后,就自动获取一个以FE80开头的链路本地地址,但正如这个地址的名称一样,这个地址只在网卡所在的链路上可用,无法连接公网。使用he.net的IPv6隧道,可以使用主机获取一个公网地址,这样就可以接入公网了。
he.net的隧道应该是6in4隧道,即通过ECS的公网IPv4地址与he.net的公网IPv4地址建立一个隧道,然后给这个隧道配置IPv6公网地址,网关指向he.net就可以通过IPv6连接公网了。
ECS上的网站监听IPv6的80端口,就可以通过IPv6网络访问你的网站。

配置IPv6隧道接口

申请IPv6隧道后,在ECS(CentOS 7)新建一个IPv6 Tunnel接口,本例中隧道接口名称为“he-ipv6”。

[[email protected]_abc ~]$ vim /etc/sysconfig/network-scripts/ifcfg-he-ipv6
NAME="he-ipv6"
DEVICE=he-ipv6
NAME="he-ipv6"
DEVICE=he-ipv6
ONBOOT=yes
USERCTL=yes
BOOTPROTO=none
PEERDNS=no
IPV6INIT=yes
IPV6_AUTOTUNNEL=yes
IPV6ADDR="2001:470:1f04:295::2/64"  #隧道在本端的IPv6地址,即ECS这边的隧道接口地址
IPV6_ROUTER=yes
IPV6_AUTOCONF=no
IPV6_CONTROL_RADVD=yes
IPV6TUNNELIPV4=72.52.104.74         #he.net公网IPv4地址
IPV6TUNNELIPV4LOCAL=172.18.144.xxx  #ECS接口地址,这是一个私有地址
PHYSDEV=eth0
TYPE=sit
DEVICETYPE=sit
NM_CONTROLLED=no
IPV6_DEFAULTGW=2001:470:1f04:295::1 #隧道在he.net的IPv6地址
IPV6_DEFAULTDEV=he-ipv6

这里有一点要特别注意,因为ECS系统里的接口IP是一个私有IP,这不能在公网直接访问,在公网访问的是ECS对应的公网IP。但配置隧道接口时,使用的是ECS系统的接口IP,即eth0上面的IP。而申请IPv6隧道时,本端地址写的是ECS的公网IP。如果你的主机是有公网IPv4地址的,”IPV6TUNNELIPV4LOCAL” 就配置为公网IPv4地址,申请隧道时也是使用这个公网IPv4地址。

启用隧道接口

[[email protected]_abc ~]# ifup he-ipv6

可选地,可以修改原来的eth0接口,开启IPv6功能

[[email protected]_abc ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
BOOT=yes
IPV6INIT=yes
IPV6_AUTOCONF=yes

查看IP地址

[[email protected]_abc ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:3e:0c:ad:cf brd ff:ff:ff:ff:ff:ff
    inet 172.18.144.xxx/20 brd 172.18.159.255 scope global dynamic eth0
       valid_lft 29173107sec preferred_lft 29173107sec
    inet6 fe80::216:3eff:fe0c:adcf/64 scope link
       valid_lft forever preferred_lft forever
3: sit0@NONE:  mtu 1480 qdisc noop state DOWN qlen 1
    link/sit 0.0.0.0 brd 0.0.0.0
4: he-ipv6@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN qlen 1
    link/sit 172.18.144.xxx peer 72.52.104.74
    inet6 fe80::ac12:90b1/128 scope link
       valid_lft forever preferred_lft forever

lo接口和eth0接口已经看到有自动配置的IPv6地址,但这些地址不是全局地址
重启网络服务或重启系统后,查看IP地址

[[email protected]_abc ~]$ ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:16:3e:0c:ad:cf brd ff:ff:ff:ff:ff:ff
    inet 172.18.144.xxx/20 brd 172.18.159.255 scope global dynamic eth0
       valid_lft 31535963sec preferred_lft 31535963sec
    inet6 fe80::216:3eff:fe0c:adcf/64 scope link
       valid_lft forever preferred_lft forever
3: [email protected]:  mtu 1480 qdisc noop state DOWN qlen 1
    link/sit 0.0.0.0 brd 0.0.0.0
4: [email protected]: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN qlen 1
    link/sit 172.18.144.xxx peer 72.52.104.74
    inet6 2001:470:1f04:295::2/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::ac12:90b1/128 scope link
       valid_lft forever preferred_lft forever

重启系统后,可以看到隧道接口”he-ipv6″的公网IPv6地址,2001开头的那个地址是一个可聚合全球单播地址,即公网地址。

查看路由

查看IPv4路由

[[email protected]_arben ~]$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.18.159.xxx  0.0.0.0         UG    0      0        0 eth0

查看IPv6路由

[[email protected]_arben ~]$ route -6 -n
::/0            2001:470:1f04:295::1       UG   1   1   948 he-ipv6
可以看到ipv6默认路由的下一跳地址是隧道另一端的地址

测试

[[email protected]_abc ~]# ping6 google.com
PING google.com(hkg12s13-in-x0e.1e100.net (2404:6800:4005:808::200e)) 56 data bytes
64 bytes from hkg12s13-in-x0e.1e100.net (2404:6800:4005:808::200e): icmp_seq=1 ttl=54 time=332 ms
64 bytes from hkg12s13-in-x0e.1e100.net (2404:6800:4005:808::200e): icmp_seq=2 ttl=54 time=332 ms

使用ping6命令,而不是ping命令。

配置阿里云管理平台的安全组规则

从ECS向外ping是可以通的,但是从外向内ping却不通。有可能ECS的安全组规则没有开放ICMPv6等IPv6的相关协议(本来就有一个规则是允许所有ICMP的,但似乎对IPv6没生效)。在安全组规则设置中,似乎没有针对三层协议的设置,只能设置四层端口。可以配置为全部开放,再使用ECS系统自身的防火墙来保障安全。

在阿里云管理平台设置入站规则
在阿里云管理平台设置入站规则

从其它IPv6主机ping阿里云ECS主机

[[email protected] ~]$ ping6 2001:470:1f04:295::2
PING 2001:470:1f04:295::2(2001:470:1f04:295::2) 56 data bytes
64 bytes from 2001:470:1f04:295::2: icmp_seq=1 ttl=59 time=176 ms
64 bytes from 2001:470:1f04:295::2: icmp_seq=2 ttl=59 time=177 ms
64 bytes from 2001:470:1f04:295::2: icmp_seq=3 ttl=59 time=179 ms

配置Nginx,监听IPv6地址的80端口

[[email protected]_arben ~]# cat /etc/nginx/conf.d/abc.conf
server {
    listen         80 default_server;
    listen         [::]:80 default_server;

域名解析

同时还要在DNS管理平台做AAAA解析。A记录是IPv4,AAAA记录是IPv6。

建立AAAA解析
建立AAAA解析
[[email protected] ~]$ telnet 2001:470:1f04:295::2 80
Trying 2001:470:1f04:295::2...
Connected to 2001:470:1f04:295::2.
Escape character is '^]'.
^]
telnet>

因为没有其它IPv6主机测试Web,可以通过其它网站进行测试

在IPv6测试网站测试的结果
在IPv6测试网站测试的结果

补充:
由于最近家里的电信宽带分配了IPv6地址,因此可以直接测试
查询DNS

[email protected]:/mnt/e/work$ nslookup
> blog.nongpeng.cn
Server:         119.29.29.29
Address:        119.29.29.29#53
Non-authoritative answer:
Name:   blog.nongpeng.cn
Address: 120.77.157.65
Name:   blog.nongpeng.cn
Address: 2001:470:1f04:295::2
>

查看页面

直接使用IPv6地址访问网站
直接使用IPv6地址访问网站

参考资料

CentOS 7 配置IPv6隧道接口的方法 https://www.linode.com/docs/networking/set-up-an-ipv6-tunnel-on-your-linode/
IPv6 网站测试 http://ipv6-test.com/validate.php]]>

One Responses

发表评论

电子邮件地址不会被公开。 必填项已用*标注