CentOS新版本均正常开启了IPv6,如果没有开启,可以按以下方式开启:
开启服务器的IPV6服务
# 打开配置文件
[root@CentOS ~]# vi /etc/sysctl.conf
# 修改为下面的状态
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
#生效IPv6配置
[root@CentOS ~]# sysctl -p
配置网卡
[root@CentOS ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
#设置IPv6地址
IPV6INIT="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy" 见附1《IPV6详解:Stable Privacy Address》
IPV6ADDR=2001:250:4000:2000::53
IPV6_DEFAULTGW=2001:250:4000:2000::1
[root@CentOS7-1 ~]# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
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: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:55:f1:11 brd ff:ff:ff:ff:ff:ff
inet 192.168.8.200/24 brd 192.168.8.255 scope global noprefixroute enp0s3
valid_lft forever preferred_lft forever
inet6 2003:250:4000:2000::53/64 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe55:f111/64 scope link noprefixroute
valid_lft forever preferred_lft forever
网卡配置文件参数描述
DEVICE:网卡名称
HWADDR:物理mac地址
TYPE:网络类型
UUID:网卡唯一标识
ONBOOT:开机或者重启是否重启网卡
NM_CONTROLLED:是否受network程序管理
BOOTPROTO:网卡获取ip地址方式:none dhcp static
IPADDR:设置ip
DATEWAY:设置网关
NETMASK:子网掩码
USERCTL:普通用户是否可以控制网卡
DNS:域名解析服务
附1:IPV6详解 Stable Privacy Address
参考资料:RFC7217
本文主要介绍下Stable Privacy Address,目前在kernel-4.4版本已经引入并且可以使用,默认情况下是关闭的。但是这种类型的地址有一些好处。
两种常用地址类型
1.全球单播地址Global Unicast Address
这个地址类似IPV4的公网地址,和全球网络上的IPV6服务器进行通信就会使用该类型的地址,全球独一无二。地址格式主要包括以下几部分:48bit的Global Routing prefix 和16 bit 的subnet ID 还有64 bits的Interface ID,一般情况下对于无状态地址分配来讲,48+16的subnet id 合称为prefix。
2.链路本地地址
这个地址主要是使用在本地链路进行通信,一个比较小的范围,类似于局域网内,这些地址发的包是不可以被路由器转发的,通常会是一些ICMPv6的封包,这个地址前16bit都是FE80接下来48位设置为全0,后面跟一个interface id(64bit), 也可以按照如下格式进行理解
以上两种地址是IPV6系统中最常用的两类地址,可以看到一个比较重要的共同部分那就是64bit的Interface ID, 本文着重来说明一种Interface ID的生成方法
Stable Privacy Address 引入
一般情况下,比较常用的生成interface id的方法有EUI-64,以及在Privacy Extensions for Stateless Address Autoconfiguration in IPv6" [RFC4941]中提及的随机生成的。
对于EUI-64的方法,比较传统,不过有一下缺点:
1. 由于所得的接口标识符是恒定的,产生的IPV6地址可以在多个网络中被追踪从而影响用户的隐私
2. 由于在接口中嵌入底层的链路层地址 标识符将导致特定的地址模式,这种模式可能被攻击者利用,以减少搜索空间时执行地址扫描攻击[ ipv6-recon ]。
3. 在接口中嵌入底层硬件地址,标识符泄漏可能引入攻击
4. 硬件地址的改变将导致地址的改变
既然目前的传统的方案有弊端,也会有一些新的方法会出现,这种就是要介绍的更加stable的地址,重点是interface id的生成方法,那设计这种方法的目标:
1. 在相同的子网中,分配得到一样的prefix,interface id 保持稳定不变 , 可以说一个prefix 一个interface id, 在相同的子网,相同的prefix下,会生成相同的interface id
2. 配置为不同的prefix , interface id 必须改变, 这意味着,给出两个由本文档中指定的方法产生的地址必须很难让攻击者知道地址是否已由同一主机产生。
3. 对外面的设备或者攻击者来说,预测生成什么样的标示符是非常困难的
4. 依赖于具体的实现方法,interface id 与 HW mac没什么关系.
5. 这种方法仅是基于硬件产生inteface id 方法的一种替代方法,也就是,这个文档没有反对或者淘汰过其他的interface id生成方法,他可以适用于所有的SLAAC配置的稳定(即非临时)IPv6地址 ,包括全局,链路本地,和独特的本地IPv6地址。
如何计算Interface id
在RFC7217中提供了一个算法 :RID = F(Prefix, Net_Iface, Network_ID, DAD_Counter, secret_key)
从公式来看这个interface id的输出与 prefix,net_iface, network_id, dad_counter, secret_key有关系,先来介绍下这个变量的意义
1. prefix : 地址前缀,RA 携带的prefix 或者link-local单播的prefix
2. net_iface: 一般情况下使用MAC地址表示net_iface
3. network_id: 一些网络特定的数据,确定接口依附于这个子网,在Linux kernel系统中并没有使用这个选项
4. dad_counter:用来解决DAD冲突的计数器,它必须被初始化为0,新地址冲突就会递增
5. secret_key: 一个攻击者不知道的秘钥 ,秘密密钥应该至少有128位 它必须被初始化为一个伪随机数
6. F伪随机函数,必须不能被外面计算出来,也必须非常难逆转,拒绝获取secret_key, 及时给予output的样板和输入的参数,F()应该产生一个至少64bit的输出,也就是说F是计算interface id的算法,在Linux kernel中使用的是基于SHA-1算法,这个算法的详细信息可以参考文章:IPv6详解:SHA1算法实现及详解
解决DAD冲突检查
如果因执行DAD[ rfc4862 ],主机发现生成的地址是一个重复的地址,它应该尝试使用新的地址来解决冲突:
1.dad_counter递增1
2.使用新的dad_counter作为参数,产生新的interface id, 继续进行DAD验证
主机在尝试新地址之前应该引入0-idgen_delay的延迟,避免多个主机同时进行同步更新,此过程可能会重复多次,直到解决冲突的解决。主机应该至少尝试idgen_retries次,主机必须限制尝试(而不是无限期地尝试一个新的暂定地址,直到冲突解决)暂定地址的数量。
RFC也规定了2个常量:
idgen_retries:默认为3。
idgen_delay:默认为1秒。
安全性
这种方法 与其他方法相比 有如下优点:
1 .能够避免基于IPV6 地址的 主机追踪 ,当主机从一个网络移动的另外一个网络中,prefix或者network id 发生了变化,interface id 也会发生变化
2. 因为接口标识符是比较难预测的,所以会大大削弱 利用推测标识符的地址扫描技术的攻击
3. 产生的IPv6地址,独立于底层硬件(如果网卡被换,IPV6地址不变)需要使用一个合适net_iface
4. 防止通过嵌入硬件地址的接口标识符所产生的信息泄漏
5.不会相互影响,不会影响使用其他prefix配置的地址的安全性和私有性
附2:IPv6网卡配置选项
# Uses following information from "/etc/sysconfig/network":
# IPV6_DEFAULTDEV=: controls default route (optional)
# IPV6_DEFAULTGW=
: controls default route (optional)
#
# Uses following information from "/etc/sysconfig/network-scripts/ifcfg-$1":
# IPV6INIT=yes|no: controls IPv6 configuration for this interface
# IPV6ADDR=[/]: specify primary static IPv6 address
# IPV6ADDR_SECONDARIES="[/] ..." (optional)
# IPV6_ROUTER=yes|no: controls IPv6 autoconfiguration (no: multi-homed interface without routing)
# IPV6_AUTOCONF=yes|no: controls IPv6 autoconfiguration
# defaults:
# IPV6FORWARDING=yes: IPV6_AUTOCONF=no, IPV6_ROUTER=yes
# IPV6FORWARDING=no: IPV6_AUTOCONF=yes
# IPV6_MTU=: controls IPv6 MTU for this link (optional)
# IPV6_PRIVACY="rfc3041": control IPv6 privacy (optional)
# This script only supports "rfc3041" (if kernel supports it)
#
# Optional for 6to4 tunneling (hardwired name of tunnel device is "tun6to4"):
# IPV6TO4INIT=yes|no: controls 6to4 tunneling setup
# IPV6TO4_RELAY=: IPv4 address of the remote 6to4 relay (default: 192.88.99.1)
# IPV6TO4_MTU=: controls IPv6 MTU for the 6to4 link (optional, default is MTU of interface - 20)
# IPV6TO4_IPV4ADDR=: overwrite local IPv4 address (optional)
# IPV6TO4_ROUTING="-/ ...": information to setup additional interfaces
# Example: IPV6TO4_ROUTING="eth0-:f101::1/64 eth1-:f102::1/64"
#
# Optional for 6to4 tunneling to trigger radvd:
# IPV6_CONTROL_RADVD=yes|no: controls radvd triggering (optional)
# IPV6_RADVD_PIDFILE=: PID file of radvd for sending signals, default is "/var/run/radvd/radvd.pid" (optional)
# IPV6_RADVD_TRIGGER_ACTION=startstop|reload|restart|SIGHUP: how to trigger radvd (optional, default is SIGHUP)
#
# Required version of radvd to use 6to4 prefix recalculation
# 0.6.2p3 or newer supporting option "Base6to4Interface"
# Required version of radvd to use dynamic ppp links
# 0.7.0 + fixes or newer
PEERDNS="yes" #是否指定DNS。如果使用DHCP协议,默认为yes。
PEERROUTES="yes" #是否把这个eth设置为默认路由。如果使用DHCP协议,默认为yes。
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"