docker nginx网站 ipv6改造方案和步骤

  • 整体概况
  • 改造原因
  • ipv6和ipv4基础知识
  • 部署详情
  • 改造方案
  • 具体实施
  • 实施步骤
  • 结束语


整体概况

改造原因

最近公司在做ipv6的系统改造,从网络到程序都需要制作ipv4和ipv6的支持。一、保证用户可以在仅支持ipv6的网络下进行正常访问。二、为以后全面扩展ipv6实施做基础工作。因为ipv6将全面取代ipv4.

ipv6和ipv4基础知识

  1. IPv4可提供4,294,967,296个地址,IPv6将原来的32位地址空间增du大到128位,数目是2的128次方。能够对地球上每平dao方米提供6×1023个网络地址,在可预见的将来是不会耗尽的。
  2. IPv4 使用地址解析通讯协议 (ARP) IPv6使用用多点传播 Neighbor Solicitation消息取代地址解析通讯协议 (ARP) 。
  3. IPv4 中路由器不能识别用于服务质量的QoS 处理的payload。IPv6中路由器使用 Flow Label 字段可以识别用于服务质量的 QoS 处理的 payload
  4. IPv4的回路地址为: 127.0.0.1, IPv6的回路地址为 :
    000:0000:0000:0000:0000:0000:0000:0001 可以简写为 ::1。
  5. 在IPv4中,动态主机配置协议( Dynamic Host
    ConfigurationProtocol,DHCP)实现了主机IP地址及其相关配置的自动设置。一个DHCP服务器拥有一个IP地址池,主机从DHCP服务器租借IP地址并获得有关的配置信息(如缺省网关、DNS服务器等),由此达到自动设置主机IP地址的目的。IPv6继承了IPv4的这种自动配置服务,并将其称为全状态自动配置(stateful autoconfiguration)
  6. Pv4使用 Internet 群组管理通讯协议 (IGMP) 管理本机子网络群组成员身份,IPv6使用 Multicast Listener Discovery (MLD) 消息取代 IGMP
  7. 内置的安全性。IPSec由IETF开发是确保秘密、完整、真实的信息穿越公共IP网的一种工业标准。IPsec不再是IP协议的补充部分,在IPv6中IPsec是IPv6自身所具有的功能。IPv4选择性支持IPSec,IPv6自动支持IPSec
  8. 更好的QoS支持。QoS是网络的一种安全机制,通常情况下不需要QoS,但是对关键应用和多媒体应用就十分必要。当网络过载或拥塞时,QoS 能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。在IPv6 的包头中定义了如何处理与识别传输, IPv6 包头中使用 Flow Label 来识别传输,可使路由器标识和特殊处理属于一个流量的封包。流量是指来源和目的之间的一系列封包,因为是在 IPv6包头中识别传输,所以即使透过 IPSec 加密的封包 payload,仍可实现对 QoS 的支持


部署详情

应用层:
现在部署的网站用docker启动nginx容器,使用服务器800端口映射nginx内部80端口,供外部访问
网络层:
1.外网ip(v4)映射内网ip(v4),让用户通过ip访问
2.域名映射到外网ip(v4)地址,让用户通过域名进行访问
以上也是最常见的一套网站部署方案。现需要加一个ipv6地址供用户访问

改造方案

刚开始总觉得ipv4升到ipv6 这一块应该是网络层更新就好了,查阅资料后发现不管网络层需要新增ipv6,启动的服务应用层也需要做配置,就那docker来说。默认是不启动ipv6映射带容器内部的,需要自己手动配置,具体操作见下文。
因此改造要分两步走
1.申请外网ipv6地址、和内网ipv6地址。若公司网络之前只支持ipv4的就需要联系三大网络运营商拉专线,
2.之前的域名进行再加一个外网ipv6的指向地址。一个域名是可以同时指向不同类型的ip的
3.应用程序开启ipv6的支持。

具体实施

实施步骤

通过上面的整改方案大致可以分为以下走

一、内网ip访问

1.网络资源申请 (一个内网ipv6 一个外网ipv6)

2.域名添加ipv6映射

3.服务器本地网络配置

经过1 2两步后我们得到了ipv6内网地址,然后我们需要将ip和网关在服务器上配置一下,目前服务器为linux,配置部署如下

①修改/etc/sysconfig/network-scripts/ifcfg-ens数字 (根据服务器的网口数)

docker设置ipv6 docker开启ipv6_外网


②重启网络

执行命令 service network restart

docker设置ipv6 docker开启ipv6_docker_02


重启好了测试一下内网ipv6是否可以访问

执行ping -6 ipv6地址

docker设置ipv6 docker开启ipv6_docker设置ipv6_03


可以ping通说明ipv6内网地址可以访问

二、内网程序访问

程序基于docker部署的,docker本身对ipv6是支持的,但是需要手动进行配置

目前只做到所有的容器都指定到服务器申请的内网ipv6上。没有对每个容器单独分ipv6地址

①修改/etc/docker/daemon.json文件

添加

"ipv6": true,
 "fixed-cidr-v6": "内网ipv6地址/64",

docker设置ipv6 docker开启ipv6_外网_04


②重启docker

执行systemctl reload docker ③有些服务可能没有自动启动 用docker ps查看一下,没启动的话用docker start容器名启动一下

docker设置ipv6 docker开启ipv6_docker_05


④验证容器内部是否支持ipv6

执行docker inspect 容器名

docker设置ipv6 docker开启ipv6_外网_06


⑤验证内网服务是否支持ipv6

使用curl "http://\[内网ip\]:800"

注意地址加 " " 和 [] 前加\进行转义

docker设置ipv6 docker开启ipv6_内网_07


因为是网站,curl后可以看到html信息说明内网的ipv6访问已经通了

三、程序的外网ipv6访问

内网已经通了,应该问题不大了

先测试一下外网通不通,测试工具分享一下,因为现在办公网络还不支持ipv6。

ipv6测试验证

测一下外网ip如下就是不通的

docker设置ipv6 docker开启ipv6_docker_08


具体原因就是ipv6的防火墙没关,ipv4和ipv6的防火墙需要分别关

关闭具体步骤如下

  1. Linux7.x系统关闭防火墙iptables命令如下:
    查看防火墙的状态:firewall-cmd --state或者使用iptables -L

关闭防火墙:systemctl stop firewalld.service,但是开机之后还会启动防火墙

systemctl disable firewalld.service #禁止firewall开机启动

查看防火墙配置:cat /etc/sysconfig/iptables-config

  1. Linux6.x系统关闭防火墙iptables命令如下:
    查看防火墙的状态:service iptables status 或者使用iptables -L

关闭防火墙:service iptables stop ,但是开机之后还会启动防火墙

chkconfig iptables off #禁止firewall开机启动

查看防火墙配置:cat /etc/sysconfig/iptables

  1. 介绍如何使用在Ubuntu16.04中开启和关闭防火墙
    开启防火墙 :ufw enable

关闭防火墙: ufw disable

备注说明:

  1. iptables在Linux6和7系统,开启或者关闭命令和配置文件名都发生变化
  2. ipv6的防火墙,将对应的命令进行修改比如,将iptables改成ip6tables就是开启或者关闭ipv6的防火墙
    关闭之后再测一下 链接通畅。外网地址测一下
  3. docker设置ipv6 docker开启ipv6_docker设置ipv6_09


  4. docker设置ipv6 docker开启ipv6_docker设置ipv6_10

结束语

整体改造的难度不大,但是对整个网络架构和部署架构要有一定的了解,对linux的基本命令操作要有一定了解。再改造前查了很多资料,但是都觉得不是很详细,也就零零散散的找了一些资料,出现问题接着查资料,然后再尝试。做完之后对整个服务链路有进一步的认识。