网际协议第六版 IPv6(Internet Protocol version 6)是最新的互联网协议,协议标准最早诞生于 1998 年 12 月。IPv6 的出现解决了 IPv4 地址枯竭的问题和提升网络传输效率,不过由于开始时期 IPv6 的标准复杂以及需要硬件软件同时支持,运营商和用户对升级 IPv6 积极性并不高。
2017年11月,中 央 、 国 务 院发布《推进互联网协议第六版(IPv6)规模部署行动计划》。2018年4月,工业 和 信息化 部关于贯彻落实《推进互联网协议第六版(IPv6)规模部署行动计划》的通知(工信 部 通信〔2018〕77号),对LTE网络IPv6端到端贯通、固定网络基础设施改造、应用基础设施改造、强化网络安全保障等重点任务作出部署。
2018年底一部分地区可以用上IPv6,到2020年,基本普及IPv6,到2025年,全面支持IPv6。
根据2019年7月发布的《中 国 IPv6发展状况》白皮书
主要有以下几点:
1.IPv6的地址空间更大。IPv4中规定IP地址长度为32,即有2^32-1个地址;而IPv6中IP地址的长度为128,即有2^128-1个地址。夸张点说就是,如果IPV6被广泛应用以后,全世界的每一粒沙子都会有相对应的一个IP地址。
2.IPv6的路由表更小。IPv6的地址分配一开始就遵循聚类(Aggregation)的原则,这使得路由器能在路由表中用一条记录(Entry)表示一片子网,大大减小了路由器中路由表的长度,提高了路由器转发数据包的速度。
3.IPv6的组播支持以及对流的支持增强。这使得网络上的多媒体应用有了长足发展的机会,为服务质量控制提供了良好的网络平台。
4.IPv6加入了对自动配置的支持。这是对DHCP协议的改进和扩展,使得网络(尤其是局域网)的管理更加方便和快捷。
5.IPv6具有更高的安全性。在使用IPv6网络中,用户可以对网络层的数据进行加密并对IP报文进行校验,这极大地增强了网络安全。
1、IPv6的报文头部固定长度是40字节,是IPv4报文头部长度的两倍,如果有扩展头,最多可达120字节,这意味着在IPv6网络中,每转发一个IPv6报文,都需要携带一个IPv6报文头。单位长度内可传递的数据就少了。所以在相同的网络环境中,IPv6的数据传输效率是下降的,要为IPv6多做一些预留才行,最好在IPv6部署的时候增加一定网络带宽。
2、兼容性问题。IPv6开发人员承认,IPv6的最大失误在于没有提供对IPv4的向后兼容性,IPv6与IPv4是完全不同的两张网络。虽然后来设计了IPv4和IPv6两网融合技术如采用双栈和隧道机制,但这样不仅部署起来网络变得异常复杂,还带来了更多安全隐患。
3、安全性问题。IPv4的网络安全问题就较多,但IPv6在被设计为标准时,安全问题还不那么突出,所以IPv6虽然增加了安全方面的考虑设计,但并不完善。同时,因为IPv6全新的网络协议设计又带来了新的安全问题,这些在设计之初并没有充分考虑到,这使得IPv6面临的安全威胁比IPv4时代还要严重。
IPv6在实际应用中还有“天窗”的问题,就是当网页包含其它网站内容的链接,即使采取双栈技术路线,但被引用的其它网站未升级,IPv6用户访问该网站时会出现响应缓慢,部分内容无法显示,部分功能无法使用等情况。IPv6地址过长,不好记忆,实际是根本无法很好地记忆。IPv6的地址是海量的,实际分配给我国的并不多,中国拥有占世界20%的人口,却只分到IPv6地址的2%,比IPv4时好些,但依然不充裕。
IPv6地址长度为128位,分成8段,每段4个字符,即X:X:X:X:X:X:X:X。直白的说,就是需要写32个字母,这个长度,在表示方法上,就需要好好的研究一下了:
1、冒分十六进制表示法
例如,一个IPV6的的IP为:0021:0D11:0000:0023:0008:0800:200C:417A,这种表示法中,每个X的前导0是可以省略的,即21:D11:0:23:8:800:200C:417A,这样无论在记忆IP地址录入IP都非常简便。
2、0位压缩表示法
有时候一个IPv6地址中问可能包含很长的一段0,可以把连续的一段0压缩为“::”。但为保证地址解析的唯一性,地址中”::”只能出现一次,例如:FF01:0:0:0:0:0:0:1101 → FF01::1101、0:0:0:0:0:0:0:1 → ::1、0:0:0:0:0:0:0:0 → ::
3、内嵌IPv4地址表示法
为了实现IPv4-IPv6互通,IPv4地址可以嵌入IPv6地址中,可以表示为:X:X:X:X:X:X:d.d.d.d,前96b采用冒分十六进制表示,而最后32b地址则使用IPv4的点分十进制表示,例如::192.168.200.2与::FFFF:192.168.200.2就是两个典型的例子,注意在前96b中,压缩0位的方法依旧适用。
注意:双冒号只能出现一次。
1、使用ifconfig指令,查看系统是否开启IPV6功能,如下:
[root@PTZJ217 shell]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:13:0B:DA
inet addr:10.120.152.217 Bcast:10.120.152.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe13:bda/64 Scope:Link
2、如未开启,则需修改/etc/sysctl.conf文件,在文件中将如下内容修改或者增加为“0”,然后执行sysctl -p命令
启用IPv6,之后再ifcofig查看,即可开启IPV6。
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
3、找到/etc/modprobe.d/disable_ipv6.conf配置文件,将如下信息改成“0”。
options ipv6 disable=0
4、找到/etc/sysconfig/network文件,将如下信息改成“yes”,然后重启service network restart。
NETWORKING_IPV6=YES
至此,设备就开启了IPV6功能。
5、配置IPV6地址,如图。
6、linux下添加默认路由。
ip -6 route add / via
ip -6 route add default via 2001:0db8:0:f101::1
route -A inet6 add / gw
route -A inet6 add default gw 2001:0db8:0:f101::1
7、查看路由
ip -6 route show
route -A 'inet6'
8、测试ipv6网络
ping6 fe80::215:5dff:fe01:203%eth0
9、配置ipv6,无需重启
ip -6 addr add 2001:0db8:0:f101::5/64 dev eth0 或者 ifconfig eth0 inet6 add 2001:0db8:0:f101::1/64
10、移除IPv6地址:(不要用这个命令移除不存在的地址,较老的内核会因为不支持而挂掉)
ip -6 addr del fec0::6:55/112 dev eth1 或者 ifconfig eth1 inet6 del feco::6:55/112
1、判断ip地址是ipv4还是ipv6方法
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class IpUtil {
private static String ipv4Regex = "^((25[0-5]|2[0-4]\\d|[0-1]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[0-1]?\\d\\d?)$";
private static String ipv6Regex = "^([\\da-fA-F]{1,4}:){6}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^::([\\da-fA-F]{1,4}:){0,4}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:):([\\da-fA-F]{1,4}:){0,3}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:){2}:([\\da-fA-F]{1,4}:){0,2}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:){3}:([\\da-fA-F]{1,4}:){0,1}((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:){4}:((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$|^([\\da-fA-F]{1,4}:){7}[\\da-fA-F]{1,4}$|^:((:[\\da-fA-F]{1,4}){1,6}|:)$|^[\\da-fA-F]{1,4}:((:[\\da-fA-F]{1,4}){1,5}|:)$|^([\\da-fA-F]{1,4}:){2}((:[\\da-fA-F]{1,4}){1,4}|:)$|^([\\da-fA-F]{1,4}:){3}((:[\\da-fA-F]{1,4}){1,3}|:)$|^([\\da-fA-F]{1,4}:){4}((:[\\da-fA-F]{1,4}){1,2}|:)$|^([\\da-fA-F]{1,4}:){5}:([\\da-fA-F]{1,4})?$|^([\\da-fA-F]{1,4}:){6}:$";
public static Boolean isIPv4Address(String ip){
Pattern pattern = Pattern.compile(ipv4Regex);
Matcher matcher = pattern.matcher(ip);
return matcher.matches();
}
public static Boolean isIPv6Address(String ip){
Pattern pattern = Pattern.compile(ipv6Regex);
Matcher matcher = pattern.matcher(ip);
return matcher.matches();
}
}
2、rest接口、activemq均是在原来的ip地址基础上加上[],如
String localIp = "[0:0:0:0:0:0:0:1]";
String ipAddress = InetAddress.getLocalHost().getHostAddress();
InetAddress inetAddress =InetAddress.getByName(ipAddress);
if(inetAddress instanceof Inet4Address){
localIp = "127.0.0.1";
}
3、jdbc支持ipv6的驱动
Mysql:
ipv4 Driver URL: jdbc:mysql://127.0.0.1:3306/database
ipv6 Driver URL: jdbc:mysql://address=(protocol=tcp)(host=fe80::a00:27ff:fec3:87c7)(port=3306)/database
连接localhost 的 URL:jdbc:mysql://address=(protocol=tcp)(host=::!)(port=3306)/database
驱动要求:jdbc连接驱动需要大于5.1.31以上,之前我没注意到这个问题,一直使用项目上统一的5.1.6,所以配置正确的情况下,tomcat启动后台会抛错,提示连接不到数据库端口,后来改为5.1.44解决报错问题。
Oracle:
ipv4 Driver URL: jdbc:oracle:thin:@//127.0.0.1:3306/orcl
ipv6 Driver URL: jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=[fe80::5cf:72])(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=fnstdb1)))
驱动要求:ojdbc14+
DB2:
ipv4 Driver URL:jdbc:db2://192.168.10.10:50000/sample
ipv6 Driver URL:jdbc:db2://[fec0:ffff:ffff:8000:20e:cff:fe50:39c8]:50000/sample
驱动要求:db2jcc4
SQLserver or sysbase:
ipv4 Driver URL: jdbc:jtds:sqlserver://127.0.0.1:1433/master
ipv6 Driver URL: jdbc:jtds:sqlserver://
驱动要求:jtds1.2.4
PostgreSQL:
ipv4 Driver URL:jdbc:postgresql://192.168.10.10:50000/sample
ipv6 Driver URL:jdbc:postgresql://[fec0:ffff:ffff:8000:20e:cff:fe50:39c8]:50000/sample
赋予mysql支持ipv6
create user 'ipv6test'@'2001:0db8:0:f101::5' IDENTIFIED BY '123456';
赋权所有的GRANT ALL PRIVILEGES ON *.* TO 'ipv6test'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
1、域名支持 AAAA 解析
AAAA 解析是将域名解析为 IPv6 地址。目前几乎主流的域名商和提供的 DNS 解析服务都支持 AAAA 解析。
2、服务器系统软件支持 IPv6
目前几乎所有的操作系统和服务器软件都支持 IPv6。在软件上几乎不存在问题。
3、主机运营商提供 IPv6 地址
目前网站 IPv6 改造最主要的还是需要主机运营商的支持,需要提供和分配 IPv6 的地址。
目前国内的云主机服务商(2018年)主要有以下几种实现方法:
主要是华为云和景安云,同时为主机服务器提供 IPv6 和 IPv4 双地址,主机可以直接和 IPv6 和 IPv4 网络进行通信。
华为云 IPv6 解决方案
国外大部分的服务器也是使用类似的方案。
百度云 IPv6 终结
优点是不需要改变主机原有结构,特备是对于 HTTP 服务器可以做到快速实现。缺点是服务器不能主动的进行 IPv6 通信,同时一些软件会有异常,如 HTTP 服务器日志记录根本不到 IPv6 地址
某网站一共使用了两台服务器,分别进行了网站 IPv6 支持改造,步骤如下:
某网站托管于百度云中,目前百度云为客户提供了名为 IPv6 终结功能,就是上述所说的 IPv6 转换服务。目前还在内测阶段。经过申请,说明了使用目的后,客服为网站分配了一个 IPv6 地址。详细的使用方法请参照IPv6终结者配置说明:IPv6终结功能
根据百度云IPv6 终结者服务说明,所有通过 IPv6 的流量,协议和目的端口不变,源地址转换为固定地址段内的IPv4地址(106.12.248.0/21)再转发到网站的服务器上。
对于 7 层 HTTP 应用,会加入 X-Forwarded-For 来标注真实的 IPv6 地址,不然在自己的服务器看来,都是来自 106.12.248.0/21 这些地址。
不过由于网站使用了 HTTPS, X-Forwarded-For 这个 http 头不能正常写入。所有 IPv6 来的流量在网站看来都是来自106.12.248.0/21 这个网段。最后只要将 DNS 的国内 AAAA 记录解析到这个地址即完成了网站 IPv6 的改造升级。
对于 vultr 服务器为网站提供加速。vultr 使用的技术是 IPv6 双栈,并且给了网站一个 /64 的子网,原则上为网站分配了2的64次方的 IP 地址,这些 ipv6 地址默认是可用的。
简单通过配置为网卡指定了上述子网中任意的 IPv6 地址后,只要将 DNS 配置海外访客的 AAAA 解析结果配置到这个 IPv6 地址即可完成网站 IPv6 改造。
需要注意的是 IPv6 防火墙和 IPv4 防火墙不同,需要单独配置,请一定要尽早配置,以免内部服务暴露在 IPv6 公网上。