Linux基础——IPV6配置
一、原理
1、IPv6地址自动配置
IPv6中相关的协议有两个,NDP和DHCPv6,通常情况下需要两个协议的配合才能完成IPv6主机地址的自动配置。 - NDP:全称邻居发现协议(Neighbor Discovery Protocol),是IPv6协议体系中最重要的一个基础协议,它实现了地址解析、验证邻居是否可达、重复地址检测、路由器发现/前缀发现、地址自动配置和重定向等功能。 - DHCPv6:DHCP协议的IPv6版本,类似于IPv4的DHCP协议。 因为存在以上两个协议,所以IPv6地址的配置分为三种模式: - SLAAC:全称无状态地址自动配置(Stateless Auto Address Configuration),利用NDP下发网关和子网前缀等信息,主机根据子网前缀自动生成IPv6地址;没有DHCPv6。 - DHCPv6Stateless:利用NDP下发网关和子网前缀等信息,主机根据子网前缀自动生成IPv6地址;利用DHCPv6配置DNSserver和域名等其他信息。 - DHCPv6Stateful:利用NDP下发网关和子网前缀等信息;利用DHCPv6配置IPv6地址、DNS server和域名等其他信息。
2、IPV6三种模式的对比如下表所示
3、IPV6三种模式的优缺点
比如SLAAC虽然最简单,但是要求掩码长度必须为64,地址浪费严重,另外也不支持下发DNS sever和域名等应用层信息;
DHCPv6 Stateful最灵活,可以对IP地址精确控制,但是需要部署DHCPv6 server,比较复杂。
注意:客户端通过自己接口的link-local地址向组播地址FF02::2发送IPV6地址请求,DHCP服务器收到客户端IPV6请求报文记录(duid和ipv6地址捆绑),DHCP服务端回复客户端IPV6地址、网关、租约信息、server duid;
服务器通过RA报文通告IPV6地址、网关、路由条目、
FF02::1 all nodes 在本地链路范围的所有节点 FF02::2 all routers 在本地链路范围的所有路由器 FF02::5 all ospf routers FF02::9 all rip routers 所有运行RIP的路由器 FF02::A all eigrp routers 所有运行eigrp的路由器 FF05::2 在一个站点范围内的所有路由器
4、Linux系统默认接口标准IEEE EUI-64
注意:比如Windows默认就采用随机生成方式产生接口标志符。 IEEEEUI-64 路由器下发的RA报文只携带子网前缀,没有具体的IP地址。在Stateless和SLAAC模式下,主机需要根据前缀信息自动构造IPv6地址,一种常见的构造方式成为EUI-64。 EUI-64格式地址由地址前缀和接口标识两部分组成,前缀固定为64位,接口标识符64位。IEEEEUI-64规定了这种情况下64位接口标识符的构造方式。 IEEE EUI-64规定接口标识符由MAC地址构造,而MAC地址只有48位,因此在MAC地址的中间位置(从高位开始的第24位后)插入十六进制数FFFE,二进制表示为1111111111111110。 为了确保从MAC地址得到的接口标识符是唯一的,还要将MAC地址的Universal/Local 位(从高位开始的第7位)设置为“1”,最后得到的这组数就作为EUI-64格式的接口标识符。
5、IPV6服务端和客户端的DUID标识
DUID(DHCP Unique Identifier)是唯一标识一台 DHCPv6设备(包括客户端、中继和服务器)的标识符,用于DHCPv6设备之间的相互验证。
i.DUID的组成结构:
- DUID type:DUID类型。取值为0x0002:
- Enterprise-number:企业编号;
- Identifier:标识号。
ii.DUID的生成方式
DHCPv6设备的标志符DUID(DHCP Unique IDentifier)
DHCPv6交互过程中,客户端、服务器都有一个唯一的标志符DUID,其主要用途用于DHCPv6交互过程中互相标志对方。服务器可以用Client DUID标志客户端,并可以将其用于本地的地址分配策略;客户端可以用Server DUID来标志服务器。DUID包括三种生成方式:
-
DUID-LLT(DUID Based on Link-layer Address Plus Time):基于时间和链路层地址生成DHCPv6设备DUID值。
-
DUID-EN(DUID Assigned by Vendor Based on Enterprise Number):基于IANA注册的企业号码生成DHCPv6设备DUID值。
-
DUID-LL(DUID Based on Link-layer Address):基于链路层地址生成DHCPv6设备DUID值。
-
参考:
# RFC章节:11. DHCP Unique Identifier (DUID)https://www.rfc-editor.org/rfc/rfc8415
# DHCPU请求流程
https://blog.csdn.net/Kuaisen/article/details/118675607
6、Linux的IPv6地址获取原理
配置的关键有两点:
i.是否接受RA报文;
ii.DHCP client的配置;
- 问题1:三层交换机是否回复NA报文
是否接收RA:
通过sysctl的accept_ra参数配置,其中0表示不接受RA;
1表示如果forwarding是关闭的就接受RA,如果forwarding是打开的则不接受RA(代表主机可能作为一个路由器);
2表示不论forwarding是打开还是关闭,都接受RA。
二、Client端IPV6无法激活
1、Client端Kernel配置及接收Server端的RA通告
无论是stateful、stateless还是slaac,都需要通过RA配置网关和MTU等,
accept_ra需要配置为1或者2。 编辑文件/etc/sysctl.conf,添加如下内容: net.ipv6.conf.all.autoconf=1 net.ipv6.conf.all.accept_ra=1 net.ipv6.conf.all.forwarding=0 net.ipv6.conf.default.autoconf=1 net.ipv6.conf.default.accept_ra=1 net.ipv6.conf.default.forwarding=0 net.ipv6.conf.eth0.autoconf=1 net.ipv6.conf.eth0.accept_ra=1 net.ipv6.conf.eth0.forwarding=0
2、Client端的/etc/sysconfig/network-scripts/网卡启用dhcpv6
DHCP client可以通过sysconfig脚本配置。比如要配置DHCPv6 Stateful时编辑配置文件/etc/sysconfig/network-scripts/ifcfg-eth0,内容如下: BOOTPROTO=dhcp DEVICE=eth0 IPV6INIT=yes IPV6_AUTOCONF=yes DHCPV6C=yes DHCPV6C_OPTIONS=-nw # 支持dhclient立即(nowait)变为daemon,而不是等待直到获取一个IPv6地址 ONBOOT=yes TYPE=Ethernet USERCTL=no 如果要配置DHCPv6 stateless模式,只需要将上面配置文件中的DHCPV6C_OPTIONS设置为"-S",指示dhclient只获取IPv6地址之外的其他信息。 如果要配置SLAAC模式,只需要将上面配置文件中的DHCPV6C设置为"no",表示关闭DHCPv6 client。
3、Client端手动发起IPV6 dhclient
4、Client端DHclient存在DHCPv6的BUG
问题描述:
CentOS 7发行版的dhclient有BUG,它将掩码长度固定为64,导致实际子网掩码长度不等于64的时候路由会出问题。
解决办法:
服务端DHCPv6下发的地址信息中只包含了IPv6地址,没有提供子网的掩码信息,实际的掩码/邻居信息是通过路由器的RA报文下发的,
dhclient正确的做法是设置IPv6地址的掩码为128,然后由路由器通过RA报文配置路由信息。
5、Client端查看是否开启ipv6
ifconfig 网卡名称 (base) [root@NewOSBC8 pam.d]# ifconfig eth0 | grep inet6 inet6 fe80::32b6:3c82:ba2:67c prefixlen 64 scopeid 0x20<link> 或 (base) [root@NewOSBC8 pam.d]# ip a show eth0 | grep inet6 inet6 fe80::32b6:3c82:ba2:67c/64 scope link noprefixroute
6、Client端kenel是否开启IPV6
找到配置sysctl.conf 文件,路径在:/etc/sysctl.conf ,找到如下配置: forwarding配置 sysctl -a | grep ipv6 | grep -i "\.forwarding"
如果已经存在,则直接修改,如果不存在,则新增。
disable配置
sysctl -a | grep ipv6 | grep -i "\.disable_ipv6"
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
启用配置sysctl -p
sysctl -p
7、Client端network.conf文件配置
# 检查主机网络是否关闭
路径在:/etc/sysconfig/network 找到如下配置:
NETWORKING_IPV6=no 将列出的配置更改为 yes
NETWORKING_IPV6=yes
8、Client端重启网络服务
# 重启网络服务
systemctl restart NetworkManager
# 如果无法生效,重启主机网络
nmcli networking off;nmcli networking on
# 再重启NetworkManager服务并检查状态
systemctl status NetworkManager
# 如果还有异常检查网卡link,绿色正常启动,白色非NM纳管(检查network-scripts网卡配置),橘色(获取IP中)、灰色(link异常)
nmcli connection show
nmcli device status
# 网卡接口ip新增并激活(自动生成/etc/sysconfig/network-scripts/ifcfg-eth0配置文件)
nmcli connection add type ethernet con-name "eth1" ifname eth1 ip4 192.168.xxx.xxx/24
# 网卡接口ip修改并激活
nmcli connection modify "eth0" ipv4.add 192.168.xxx.xxxx/24
# 查看网卡接口配置
nmcli device show eth0
# 查看网卡接口连接详情
nmcli connection show eth0
三、DHCPServer端检查及配置
1、DHCPServer检查/etc/dhcp/dhcpd6.conf配置问题
dhcpd -t -cf /etc/dhcp/dhcpd6.conf 参考:https://blog.csdn.net/weixin_51697917/article/details/129474178
四、配置文件添加IPV6地址
1、网卡配置模版
vi /etc/sysconfig/network-scripts/ifcfg-eth0 添加: ● 单IPv6地址: IPV6INIT=yes IPV6ADDR=<IPv6地址>/<子网前缀长度> IPV6_DEFAULTGW=<IPv6网关>
● 多IPv6地址: IPV6INIT=yes IPV6ADDR=<IPv6地址>/<子网前缀长度> IPV6ADDR_SECONDARIES="<IPv6地址1>/<子网前缀长度> <IPv6地址2>/<子网前缀长度>" IPV6_DEFAULTGW=<IPv6网关>
2、单IPv6地址静态配置
IPV6INIT=yes 网卡初始化IPv6协议栈
IPV6ADDR=2001:250:4000:2000::53 配置IPv6地址
IPV6_DEFAULTGW=2001:250:4000:2000::1 配置IPv6网关
systemctl restart network.service 重启网络服务,使配置生效
3、多IPv6地址静态配置
# 配置接口IPv6地址
vim /etc/sysconfig/network-scripts/ifcfg-eth0
IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6ADDR=2409:1:1:2::1:1/112 IPV6ADDR_SECONDARIES="2409:1:1:2::2:1/112 2409:1:1:2::3:1/112" IPV6_DEFAULTGW=2409:1:1:2::1:254
# 重启networking和NetworkManager服务
nmcli networking off;nmcli networking on
systemctl restart NetworkManager
# 检查配置是否生效
(base) [root@NewOSBC8 network-scripts]# ip a show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet6 2409:1:1:2::3:1/112 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 2409:1:1:2::2:1/112 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 2409:1:1:2::1:1/112 scope global noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::13d6:267f:73c3:6470/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4、动态获取IPv6地址
IPV6INIT=yes
DHCPV6C=yes
5、Client端添加连接上行网关的默认路由
# 上行交换机的link-local作为默认路由下一跳
(Openstack云计算虚机或裸金属服务器使用的上联交换机IPV6的link-local地址作为网关)
ip -6 route add default via fe80::13d6:267f:73c3:3498
route -A inet6 add default gw fe80::13d6:267f:73c3:3498
# 上行交换机的接口IPV6地址作为默认路由下一跳
ip -6 route add default via 2409:1:1:2::1:254
route -A inet6 add default gw 2409:1:1:2::1:254
6、查看IPV6路由
ip -6 route show route -A 'inet6' -n route -6 -n
五、指令临时添加IPV6路由
1、添加ipv6接口地址
ip address add 2409:801a:5ac3:bbf5::a:c/112 dev enp0s3 ip address add 2409:801a:5cc4:bbf7::6:2/112 dev enp0s3 主机A:2409:801a:5ac3:bbf5::a:c/112 ip -6 route add 2409:801a:5cc4:bbf7::6:0/112 via 2409:801a:5ac3:bbf5::a:1 主机B:2409:801a:5cc4:bbf7::6:2/112 ip -6 route add 2409:801a:5ac3:bbf5::a:0/112 via 2409:801a:5cc4:bbf7::6:1
2、删除多余的ipv6路由
ip -6 route del 2409:801a:5ac3:bbf5::6:0/112 ip -6 route del 2409:801a:5ac3:bbf5::/112
3、其他
# ifconfig eth0 inet6 add 2001:da8:2004:1000:202:116:160:41/64 (手工添加配置固定IPv6地址) # route -A inet6 add default gw 2001:da8:2004:1000::1 (添加默认路由) # ping6 ipv6.scau.edu.cn PING ipv6.scau.edu.cn(2001:da8:2004:1000:202:116:160:48) 56 data bytes 64 bytes from 2001:da8:2004:1000:202:116:160:48: icmp_seq=0 ttl=64 time=0.020 ms 64 bytes from 2001:da8:2004:1000:202:116:160:48: icmp_seq=1 ttl=64 time=0.019 ms 64 bytes from 2001:da8:2004:1000:202:116:160:48: icmp_seq=2 ttl=64 time=0.014 ms 这个显示表明IPv6已配置成功。
六、如何禁用IPv6
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6 禁用IPv6(包括回环接口) echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6 禁用IPv6(默认) vim /etc/sysctl.conf 编辑sysctl更改proc全局 # 禁用整个系统所有接口的IPv6 net.ipv6.conf.all.disable_ipv6 = 1 # 禁用某一个指定接口的IPv6(例如:eth0, lo) net.ipv6.conf.lo.disable_ipv6 = 1 net.ipv6.conf.eth0.disable_ipv6 = 1 sysctl –p /etc/sysctl.conf 设置更改生效
七、测试
(base) [root@NewOSBC8 network-scripts]# ping -6 -c 1 2409:1:1:2::3:1
PING 2409:1:1:2::3:1(2409:1:1:2::3:1) 56 data bytes
64 bytes from 2409:1:1:2::3:1: icmp_seq=1 ttl=64 time=0.057 ms
(base) [root@NewOSBC8 network-scripts]# ping -6 2409:1:1:2::3:1
PING 2409:1:1:2::3:1(2409:1:1:2::3:1) 56 data bytes
64 bytes from 2409:1:1:2::3:1: icmp_seq=1 ttl=64 time=0.037 ms
^C
--- 2409:1:1:2::3:1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.037/0.037/0.037/0.000 ms
(base) [root@NewOSBC8 network-scripts]# ping6 2409:1:1:2::3:1
PING 2409:1:1:2::3:1(2409:1:1:2::3:1) 56 data bytes
64 bytes from 2409:1:1:2::3:1: icmp_seq=1 ttl=64 time=0.031 ms
参考
IPV6相关
https://support.huawei.com/enterprise/zh/doc/EDOC1100367116/d4769442#ZH-CN_CONCEPT_0266316086
https://www.cnblogs.com/liam-wuhan/p/18592336/datacomhcie-09
https://www.rfc-editor.org/rfc/rfc8415
https://blog.csdn.net/fengxingzhe008/article/details/128909919
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异