IPV6使用记录——服务端到用户端【学习笔记】

在ipv6逐渐普及的今天,让网站或者其他的东西支持ipv6我觉得是一种趋势,也是必然。

国内运营商对ipv6尚且还是观望谨慎的态度(例如阿里云,需要申请审核才能使用ipv6,无疑这对一般用户来说是很难的),而国外的运营商就不这样了,大多都是大把大把的撒ipv6地址。也是,ipv4寸土寸金的今天,价格高涨可用资源减少各种NAT乱七八糟的,已经让ipv4不忍直视了,误伤的概率也增高,所以在条件可以的情况下使用ipv6是必要的。

如你所见,目前mikifuns.com已经全站支持IPV6了(实际上的,是CDN-服务器双向的支持了)

然而UpYun目前暂且不支持IPV6(没普及开),所以国内用户还是不能体验到IPV6的成功了….

注意:本文内容在网站搬迁后可能出现了排版错乱,请务必结合相关链接来摸索操作。

了解IPv6

当然,现在很多地区尚未完全普及ipv6,大多数浏览器妥协默认是ipv4优先,因而你在访问我的网站时,可能还是ipv4。如果想知道你是否已经真正的启用了ipv6,最简单的办法即是通过ipv6.mikifuns.com(服务器另有他用已经关闭了看看能否访问。这是一个简单的页面,但是纯ipv6.

访问ipv6网站,这是一个多向的过程,大概像这张图:

是的,这些环节一个也不能落下。

所以要想详细知道自己在ipv6的道路上哪里绊倒了,可以访问https://test-ipv6.com来了解更多。所以说,我们想要畅游ipv6海洋,客户端,运营商,DNS和服务商四者紧密关联缺一不可。如何真正用上ipv6呢?

  • 客户端

客户端很明显,你家中的路由器要有意识地为你分配ipv6地址。如果这一关都过不去,洗洗睡吧。哦对了,有的朋友可能为了优化以前把Internet协议版本6给关了,这个要开启哦!

  • 运营商端

没啥说的,运营商不给你ipv6你也没招。中国声称要在2025年全面普及ipv6,虽然现在感觉不到但是的确覆盖面比较广了(相关资料),所以关于这件事只能等待。耐心。

  • DNS

这是个天坑!

我相信很多人看到过这个提示:

你的 DNS 服务器(可能由运营商提供)没有接入或没有配置 IPv6,将来这可能会妨碍你访问纯 IPv6 网站。

这就是因为你的dns不支持ipv6.对此有两个解决方案:

1.直接使用可以解析ipv6的DNS,例如1.1.1.1或者8.8.8.8

2.单独再为ipv6配置dns。还记得Internet协议版本6吗?没错,它可以配置ipv6的dns,例如2001:4860:4860::8888。

  • 服务端

接下来是重点。

获取IPv6

服务器端对ipv6的支持尤为重要。现在多数服务器(尤其境内)是不支持ipv6的。境外也仅仅是DigitalOcean或者Vultr这种级别的才会默认提供ipv6。因而如何配置ipv6显得异常重要。然而,相关的配置并没有一个简单的教程,所以摸索十分费劲。这里与大家分享我的经验。

此处使用的VPS是buyvm购买的。

首先,访问vps面板后台,转到网络部分,到IPV6处为vps分配一个ipv6地址

随机生成也好,特意设计也罢,总之得分配一个。记住它,然后去查看网关等信息:

提示,BuyVM的wiki中网关并不适用所有机器,所以还是得以面板后台的为准啊…..当初这里卡了好久。

这里要改下,那个VIRTIO对ipv6莫名的不友好,如果最终你发现怎么按步骤来都还是不行,就改这里吧。

这样我们获得了Address Gateway 和 Bitmask(netmask)。

启用IPv6(Linux)

接下来我们讲解如何启用IPv6。请注意,我们的实验环境是Debian9与Ubuntu16.04,其他系统的操作方法来自阿里云的这篇文章,仅供参考请尝试进行。

CentOS 6 操作步骤

  1. 远程连接实例。
  2. 运行 vi /etc/modprobe.d/disable_ipv6.conf,将 options ipv6 disable=1 修改为 options ipv6 disable=0后保存退出。
  3. 运行 vi /etc/sysconfig/network,将 NETWORKING_IPV6=no 修改为 NETWORKING_IPV6=yes 后保存退出。
  4. 运行以下命令:
    modprobe ipv6 -r modprobe ipv6
  5. 运行 lsmod | grep ipv6,当返回以下内容时,表明 IPv6 模块已经成功加载:
    ipv6                  xxxxx  8  
    !说明
    第三列参数值不能为 0,否则您需要重新设置 IPv6 服务。
  6. 运行 vi /etc/sysctl.conf 做如下修改:
    #net.ipv6.conf.all.disable_ipv6 = 1
    #net.ipv6.conf.default.disable_ipv6 = 1
    #net.ipv6.conf.lo.disable_ipv6 = 1
    net.ipv6.conf.all.disable_ipv6 = 0
    net.ipv6.conf.default.disable_ipv6 = 0
    net.ipv6.conf.lo.disable_ipv6 = 0 
  7. 运行 sysctl -p 使配置生效。

CentOS 7 操作步骤

  1. 远程连接实例。
  2. 运行 vi /etc/modprobe.d/disable_ipv6.conf,将 options ipv6 disable=1 修改为 options ipv6 disable=0后保存退出。
  3. 运行 vi /etc/sysconfig/network,将 NETWORKING_IPV6=no 修改为 NETWORKING_IPV6=yes 后保存退出。
  4. 运行 vi /etc/sysctl.conf 做如下修改:
    #net.ipv6.conf.all.disable_ipv6 = 1
    #net.ipv6.conf.default.disable_ipv6 = 1
    #net.ipv6.conf.lo.disable_ipv6 = 1
    
    net.ipv6.conf.all.disable_ipv6 = 0
    net.ipv6.conf.default.disable_ipv6 = 0
    net.ipv6.conf.lo.disable_ipv6 = 0
  5. 运行 sysctl -p 使配置生效。

CoreOS 14 或 17 操作步骤

  1. 远程连接实例。
  2. 运行 vi /usr/share/oem/grub.cfg,删除 ipv6.disable=1 后保存退出。
  3. 重启实例。

Debian 8 或 9 操作步骤

  1. 远程连接实例。
  2. 运行 vi /etc/default/grub,删除 ipv6.disable=1 后保存退出。
  3. 运行 vi /boot/grub/grub.cfg,删除 ipv6.disable=1 后保存退出。
  4. 重启实例。
  5. 运行 vi /etc/sysctl.conf 做如下修改:
    #net.ipv6.conf.all.disable_ipv6 = 1
    #net.ipv6.conf.default.disable_ipv6 = 1
    #net.ipv6.conf.lo.disable_ipv6 = 1
    
    net.ipv6.conf.all.disable_ipv6 = 0
    net.ipv6.conf.default.disable_ipv6 = 0
    net.ipv6.conf.lo.disable_ipv6 = 0
  6. 运行 sysctl -p 使配置生效。

FreeBSD 11 操作步骤

  1. 远程连接实例。
  2. 运行 vi /etc/rc.conf,添加 ipv6_activate_all_interfaces="YES" 后保存退出。
  3. 运行 /etc/netstart restart 重启网络。

OpenSUSE 42 操作步骤

  1. 远程连接实例。
  2. 运行 vi /etc/sysctl.conf 做如下修改:
    #net.ipv6.conf.all.disable_ipv6 = 1
    #net.ipv6.conf.default.disable_ipv6 = 1
    #net.ipv6.conf.lo.disable_ipv6 = 1
    
    net.ipv6.conf.all.disable_ipv6 = 0
    net.ipv6.conf.default.disable_ipv6 = 0
    net.ipv6.conf.lo.disable_ipv6 = 0
  3. 运行 sysctl -p 使配置生效。

SUSE 11 或 12 操作步骤

  1. 远程连接实例。
  2. 运行 vi /etc/modprobe.d/50-ipv6.conf,删除 install ipv6 /bin/true 后保存退出。
  3. 运行 vi /etc/sysctl.conf 做如下修改:
    #net.ipv6.conf.all.disable_ipv6 = 1
    #net.ipv6.conf.default.disable_ipv6 = 1
    #net.ipv6.conf.lo.disable_ipv6 = 1
    
    net.ipv6.conf.all.disable_ipv6 = 0
    net.ipv6.conf.default.disable_ipv6 = 0
    net.ipv6.conf.lo.disable_ipv6 = 0
  4. 运行 sysctl -p 使配置生效。

Ubuntu 14 或 16 操作步骤

  1. 远程连接实例。
  2. 运行 vi /etc/sysctl.conf 做如下修改:
    #net.ipv6.conf.all.disable_ipv6 = 1
    #net.ipv6.conf.default.disable_ipv6 = 1
    #net.ipv6.conf.lo.disable_ipv6 = 1
    
    net.ipv6.conf.all.disable_ipv6 = 0
    net.ipv6.conf.default.disable_ipv6 = 0
    net.ipv6.conf.lo.disable_ipv6 = 0
  3. 运行 sysctl -p 使配置生效。

手动配置 IPv6 地址

CentOS 6/7 和 Red Hat 6/7 操作步骤

  1. 远程连接实例。
  2. 运行vi /etc/sysconfig/network-scripts/ifcfg-eth0打开网卡配置文件,eth0为网卡标识符,您需要修改成实际的标识符。在文件中根据实际信息添加以下配置:
    • 单 IPv6 地址:
      IPV6INIT=yes
      IPV6ADDR=<IPv6地址>/<子网前缀长度>
      IPV6_DEFAULTGW=<IPv6网关>
    • 多 IPv6 地址:
      IPV6INIT=yes
      IPV6ADDR=<IPv6地址>/<子网前缀长度>
      IPV6ADDR_SECONDARIES="<IPv6地址1>/<子网前缀长度> <IPv6地址2>/<子网前缀长度>"
      IPV6_DEFAULTGW=<IPv6网关>
      !说明 为区分单个 IPv6 与多个 IPv6 地址,请在 IPV6ADDR_SECONDARIES 参数中使用列表格式表达多地址格式,使用半角引号(")包含地址,并用空格隔开。
  3. 重启网络服务:运行 service network restart 或 systemctl restart network

Debian/8/9 和 Ubuntu 14/16 操作步骤

  1. 远程连接实例。
  2. 运行 vi /etc/network/interfaces 打开网卡配置文件,eth0 为网卡标识符,您需要修改成实际的标识符。在文件中根据实际信息添加以下配置:
    • 单 IPv6 地址:
      auto eth0
      iface eth0 inet6 static
      address <IPv6地址>
      netmask <子网前缀长度>
      gateway <IPv6网关>
    • 多 IPv6 地址:
      auto eth0
      iface eth0 inet6 static
      address <IPv6地址>
      netmask <子网前缀长度>
      gateway <IPv6网关>
      
      auto eth0:0
      iface eth0:0 inet6 static
      address <IPv6地址1>
      netmask <子网前缀长度>
      gateway <IPv6网关>
      
      auto eth0:1
      iface eth0:1 inet6 static
      address <IPv6地址2>
      netmask <子网前缀长度>
      gateway <IPv6网关>
      !说明 为区分单个 IPv6 与多个 IPv6 地址,您只需在同一网卡标识符的基础上重复添加地址信息即可。
  3. 重启网络服务:运行 service network restart 或 systemctl restart networking

OpenSUSE 42 和 SUSE Linux 11/12 操作步骤

  1. 远程连接实例。
  2. 运行 vi /etc/sysconfig/network/ifcfg-eth0 打开网卡配置文件,eth0 为网卡标识符,您需要修改成实际的标识符。在文件中根据实际信息添加以下配置:
    • 单 IPv6 地址:
      IPADDR_0=<IPv6地址>
      PREFIXLEN_0=<子网前缀长度>
    • 多 IPv6 地址:
      IPADDR_0=<IPv6地址>
      PREFIXLEN_0=<子网前缀长度>
      
      IPADDR_1=<IPv6地址1>
      PREFIXLEN_1=<子网前缀长度>
      
      IPADDR_2=<IPv6地址2>
      PREFIXLEN_2=<子网前缀长度>
      !说明 为区分单个 IPv6 与多个 IPv6 地址,请使用不用的 IPADDR_N 和 PREFIXLEN_N 重复添加地址信息。
  3. 运行 vi /etc/sysconfig/network/routes 打开路由配置文件,添加配置项:
    default <IPv6网关> - -
  4. 重启网络服务:运行 service network restart 或 systemctl restart networking

CoreOS 14/17 操作步骤

  1. 远程连接实例。
  2. 运行 vi /etc/systemd/network/10-eth0.network 打开网卡配置文件,eth0 为网卡标识符,您需要修改成实际的标识符。在文件中根据实际信息添加以下配置:
    • 单 IPv6 地址:
      [Address]
      Address=<IPv6地址>/<子网前缀长度>
      [Route]
      Destination=::/0
      Gateway=<IPv6网关>
    • 多 IPv6 地址:
      [Address]
      Address=<IPv6地址1>/<子网前缀长度>
      [Address]
      Address=<IPv6地址2>/<子网前缀长度>
      [Route]
      Destination=::/0
      Gateway=<IPv6网关>
      说明 为区分单个 IPv6 与多个 IPv6 地址,您只需在同一网卡标识符的基础上重复添加地址信息即可。
  3. 重启网络服务:运行 systemctr restart systemd-networkd

FreeBSD 11 操作步骤

  1. 远程连接实例。
  2. 运行 vi /etc/rc.conf 打开网卡配置文件,vtnet0 为网卡标识符,您需要修改成实际的标识符。在文件中根据实际信息添加以下配置:
    • 单 IPv6 地址:
      ipv6_ifconfig_vtnet0="<IPv6地址>"
      ipv6_defaultrouter="<IPv6网关>"
    • 多 IPv6 地址:
      ipv6_ifconfig_vtnet0="<IPv6地址1>"
      ipv6_ifconfig_vtnet0="<IPv6地址2>"
      ipv6_defaultrouter="<IPv6网关>"
      说明 为区分单个 IPv6 与多个 IPv6 地址,您只需在同一网卡标识符的基础上重复添加地址信息即可。
  3. 重启网络服务:运行 /etc/netstart restart

其他系统没试过,但是Debian的话配置起来非常的简单。可以一试。

顺带一提,Ubuntu18开始使用了新的network管理方式,那个的配置文件就真的让人迷惑了。不推荐尝试。

这样,系统层面支持了ipv6。试试 ping6 ipv6.google.com 看看什么效果吧!

Web服务启用IPv6

当然,这样网站还是不支持ipv6的访问:web服务也需要启用对IPv6的支持。

Nginx

Nginx 需要编译IPv6模块:

注:这里以lnmp安装的nginx为例,具体情况具体分析,目录会有所不同请不要一味复制,动动脑。

执行 /usr/local/nginx/sbin/nginx -V 看看是否有–with-ipv6,有的话就不用再编译了,没有的话是需要编译: 

开始编译前请记住arguments:后面的东西,当初我编译时候就跳坑里了,因为make会把以前的编译覆盖掉。

获取nginx的安装包解压

cd /path/to/nginx-src-code/
./configure (此处接之前你记住的一长串后) --with-http_ssl_module --with-ipv6

例如 ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-ipv6如果编译没有错误,然后执行:make

这里有个坑,如果nginx没启动的话是不能make,因为不启动nginx就不会生成一个log,但make需要这个log。所以一直围绕log报错就去看看nginx是否启动。

如果你是首次安装,就直接make install吧。

编译完,在objs目录下有一个nginx执行文件,先备份下原来老的nginx文件,执行:mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old,再把新objs下的nginx cp到sbin下,执行:cp objs/nginx /usr/local/nginx/sbin/nginx

执行 /usr/local/nginx/sbin/nginx -t测试下,显示没有问题再执行:make upgrade

最后执行:/usr/local/nginx/sbin/nginx -V 看一下,IPv6模块已经编译进去了。

然后我们去启用ipv6. 首先kill关闭nginx进程:修改Nginx所有虚拟主机的配置,尤其这个/usr/local/nginx/conf/nginx.conf 要修改,listen 80;下面添加一行:listen [::]:80 ipv6only=on;

实际上我发现vhost下的网站单独是否开启没特别大影响,但是这个主的conf一定要改。当然,如果你发现单改这个conf没用,就也把vhost的单独conf也改了吧。单改注意,除了80,如果你有https(443)的话也要改:listen [::]:443 ssl;有的情况后面还有http2一类的参数,直接照搬上面的ipv4的设置就好。

修改好后,一定要/usr/local/nginx/sbin/nginx -t测试下配置是否正确,没问题就启动nginx,然后访问下http://[xxxx:xxxx:xxxx::xxxx] 你自己的ip看看效果吧。别忘了[],这是浏览器认识到你输入的是ipv6的唯一方式。

Apache

Apache的配置方法看起来更简单。直接去修改httpd.conf,让它监听ipv6就好:例如新增行

Listen [2607:f0d0:1002:11::4]:80

我猜想,实际上你也可以用 Listen [::1]:80(443)来达到监听全部ipv6地址的方法使Apache不单单监听一个ip。(现在想想,是不是可以让不同的网站使用不同的ipv6接应访问?可以一试。)

具体,请务必浏览此文档学习下,或许能在你遇到问题时解决你的困惑。

最后,别忘了重启Apache。

享受IPv6给你带来的便利吧!成就感满满!

发表评论

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

*

code