IPv6介绍

本文详细介绍了IPv6地址相关知识,包括地址表示、掩码、单播地址类型等。阐述了IEEE EUI - 64格式接口标识符及本地链路地址生成方法,讲解了IPv6转发原理和NDP协议作用。还介绍了IPv6的配置、路由、邻居查看等使用方法,以及抓包、防火墙查看等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IPv6地址描述

地址表示

128位地址,使用:号分隔。区别IPv4的点分十进制格式。其中:可以缩写,其中双冒号只能一次,否则恢复成128位时将不确定0的个数。

案例地址:

​ fe80::129d:b1e3:3248:9f0c == 完整格式为 fe80:0000:0000:0000:129d:b1e3:3248:9f0c

​ 0128:0000:0000:0000:0000:0000:0000:0011 == 简写为 128::11

地址掩码

0128:0000:0000:0000:0000:0000:0000:0011 / 64

如上64掩码,则网络段为 0128:0000:0000:0000。

地址案例

单播地址 - 未指定地址, 00…0(128 bits),前缀标识:::/128

单播地址 - 环回地址,00…1(128 bits),前缀标识:::1/128

单播地址 - 链路本地地址, 1111111010…XXX,前缀标识:FE80::/10

单播地址 - 唯一本地地址 ,1111110…XXX,前缀标识FC00::/7(包括FD00::/8和FC00::/8)

单播地址 - 站点本地地址(已弃用,被唯一本地地址替代),1111111011,前缀标识:FEC0::/10

单播地址 - 全局单播地址,除了以上单播地址的其他形式

组播地址 - 11111111,前缀标识:FF00::/8

IEEE EUI-64格式接口标识符

本地链路地址由特定的本地链路前缀FE80::/10(最高10位值为1111111010)和IEEE EUI-64格式的接口标识符(EUI-64可来源于EUI-48)构成。

64 位 EUI 64 地址是由电气和电子工程师协会(IEEE) 定义的。将 EUI-64 地址指派给网络适配器,或从 IEEE 802 地址派生得到该地址。

IEEE 802地址

​ 即以太网地址(MAC地址)。传统接口标识可使用称为 IEEE 802 地址的 48 位地址。此地址由 24 位公司 ID(也称为制造商 ID或组织唯一标识OUI)和 24位扩展ID(也称为底板 ID)组成。公司 ID(唯一指派给每个网络适配器的制造商)和底板 ID(在装配时唯一指派给每个网络适配器)的组合,即可生成全局唯一的 48 位地址。这个 48 位地址也称为物理地址、硬件地址或媒体访问控制(MAC) 地址。一般公司扩展ID不够用会申请多个OUI。

IEEE 802 地址格式

​ 即传统的MAC地址,如同公网IP一样,要求全球唯一,实际可能存在复用。24位组织唯一标识ID OUI + 24位ID用于标识厂商的每个网卡ID。其中OUI中MAC地址(最高位)第一个字节中的第七位位U/L位,(最高位)第一个字节的最后一位为I/G位。

IEEE 802 地址最高位

​ 最高位指代比特序,比如以太网网络传输字节序为大端,比特序为小端。比特序直接影响第一个字节的第7和最后一位,但无论什么序号统一转换为小端后其G/L位和I/G位指代的应该是相同的bit。

IEEE 802 地址U/L位

​ (Global/Local,也称为U/L位,其中U表示Universal)位,如果G/L=0,则是全局管理地址,由IEEE分配;如果U/L=1,则是本地管理地址,是网络管理员为了加强自己对网络管理而指定的地址。

IEEE 802 地址I/G位

​ (Individual/Group)位,如果I/G=0,则是某台设备的MAC地址,即单播地址;如果I/G=1,则是多播地址(组播+广播=多播)。

EUI-64地址

IEEE EUI-64地址

​ 代表网络接口寻址的新标准。公司(OUI) ID 仍然是 24 位长度,但扩展 ID 是 40 位,从而为网络适配器制造商创建了更大的地址空间。EUI-64 地址使用 U/L 和 I/G 位的方式与 IEEE 802 地址(传统的48位MAC地址)相同。

从IEEE 802地址映射EUI-64地址

IEEE 802地址48位,转换映射为EUI-64地址是将16 位的 11111111 11111110 (0xFFFE) 将被插入到公司 ID 和扩展 ID 之间的 IEEE 802 地址中。同样,EUI-64地址也是唯一的。

EUI-64地址映射接口标识符

EUI-64 地址中的 U/L 位将进行求反(如果是 1,则被设置为 0;如果是 0,则被设置为 1)。

接口标识符转换为本地链路地址

接口标识符前边追加FE80::拼接EUI-64格式的接口标识符。综上所述,根据IEEE 802地址(MAC地址)自动生成本地链路地址的方法。

(1)得到MAC地址:传统的网络适配器标识。

(2)得到EUI-64地址:在组织唯一ID和扩展ID之间增加FFFE。

(3)得到EUI-64格式接口标识符:EUI-64地址中U/L位取反(第7位)。

(4)拼接fe80前缀。

转换案例

root@myb:~# ifconfig
enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.56.115  netmask 255.255.255.0  broadcast 192.168.56.255
        inet6 fe80::a00:27ff:fed7:cf78  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:d7:cf:78  txqueuelen 1000  (Ethernet)
        RX packets 53  bytes 9027 (9.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 654  bytes 95368 (95.3 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

MAC地址:08:00:27:d7:cf:78

EUI-64地址:08:00:27:ff:fe:d7:cf:78

EUI-64格式接口标识符:最高位第一个字节08,二进制1000,U/L位取反1010(二进制) = a(16进制)。所以为:0a:00:27:ff:fe:d7:cf:78

本地链路地址:fe80::0a00:27ff:fed7:cf78,注意:从后边开始每两个字节隔开

IPv6转发原理

​ linux对于本地链路地址不查询路由表,直接使用NDP(邻居发现协议)探测出的链路层(MAC)地址和链路状态进行封包发送。实际本地链路地址通信需要指定出接口,可能就是因为不查询路由表导致的(本身本地链路都是fe80,其路由也没法指定)。

​ 所以对于IPv6(非本地链路),NDP负责地址解析获取到目标MAC地址和邻居的状态,封包基于mac封包,然后根据路由选择出口发送(区别本地链路不查询路由表)。

NDP主要包括:

  1. 地址解析,类似ARP,通过ICMP6协议类型(NS和NA)消息将IPv6地址解析为MAC地址,通过邻居查看可看到MAC。
  2. 路由发现:通过RS和RA消息,发现和获取所在网络路由器信息,包括默认的路由器的IPv6地址,前缀,参数等。
  3. 重复地址检测:主机在分配或配置新的IPv6地址时,使用NDP的DAD机制进行重复探测。
  4. 邻居状态跟踪:用于定期发送NS消息维护邻居可达性,更新邻居缓存。

对于终端主机而言,其核心:

​ NDP相当于ARP,维护mac地址,助力二层封包。但ndp协议自身本身是属于icmp6协议,在ipv4中arp是2.5层协议,在ipv6中NDP实际体现为icmp6,其icmp类型为NS(邻居请求-135)、NA(邻居通告-136)。所以IPv6中要获取mac,也得发送(icmp6-实际内部ndp类型),而icmp是IP层的辅助协议,是需要IP的,这一点本地链路地址保证,促使即使没有任何IP配置,但只要有本地链路则可以完成邻居发现(mac学习)。

​ 路由负责选路,指导下一跳和出接口。

​ 本地链路比较特殊,出不了路由,只能局域网内通信,且由于本地链路都是fe80前缀,无法指导路由,所以在用的时候比如 ping6 ssh telnet都需要指定接口。

IPv6单播地址

本地链路地址

用于邻居发现协议和无状态自动配置进程中链路本地上节点之间的通信。使用链路本地地址作为源或目的地址的数据包不会被转发到其他链路上。使用链路本地前缀FE80::/10(1111 1110 10)和IEEE EUI-64格式的接口标识符(EUI-64可来源于EUI-48)可在以太接口对其进行自动配置。

自动生成的生成算法不一。用于本地链路的通信,不能通过路由转发,不经过路由(且不考虑冲突)的前提下可像普通的单播公网地址一样正常使用。

唯一本地地址

仅用于同一个站点的地址。具有全球唯一的前缀,可以进行网络之间的私有连接,而不必担心地址冲突等问题。如果出现路由泄漏,不会造成Internet路由冲突。在应用中,上层应用程序将这些地址看作全球单播地址。

唯一本地地址前缀:FC00::/7。

注:就跟IPv4的A、B、C、D类的分类一样,有些比如192网段认为是局域网,这里也可以认为非公网的IP,但这个IP是可以穿过路由的。同时这个IP地址不用于公网IP。

环回地址

环回地址0:0:0:0:0:0:0:1或::1,不会被分配给任何接口。

它的作用与在IPv4中的127.0.0.1相同,即节点将IPv6报文发送给自己。

未指定地址

未指定地址(::),不能被分配给任何节点,也不能作为目的地址。在主机初始化且没有取得自己的地址时,未指定地址可以用在IPv6报文的源地址字段,例如重复地址探测时,NS报文的源地址就是未指定地址。

比如netstat看到监听任何地址一样。

公网单播地址

除了以上地址,剩余的地址为公网全球单播地址。全球单播地址等同于IPv4公网地址。用于可以聚合的链路,最后提供给网络服务提供商。这种地址类型的结构允许路由前缀的聚合,从而满足全球路由表项的数量限制。地址包括运营商管理的48位路由前缀和本地站点管理的16位子网ID,以及64位接口ID。如无特殊说明,全球单播地址包括站点本地单播地址。

IPv6使用

IPv6配置

ip -6 addr add 2001::121/64 dev eth0

ifconfig eth0 inet6 add 2001::121/64

注:以上64为掩码,注意配置的掩码大小,直接影响路由和设备出接口选择。

注:其中add换成del即删除。

永久配置 - nmtui、nmcli以及配置文件(不同发行版存在差异)等。

路由配置

ip -6 route add default via 2001::1

route -A inet6 add default gw 2001::1 dev eth0

注:其中add换成del即删除。

查看IPv6邻居

ip -6 neighbor show

注:等价IPv4的ARP。

查看IPv6路由

ip -6 route show

route -6n

路由最长匹配,但本地链路可能都是同网段的,不带任何子网信息用来指示路由,所以使用本地链路通信则需要指定出接口。

ping IPv6地址(本地链路)

ping6 fe80::b4f4:1c06:416c:11cb -I enp9s0

大写的i指定本地链路出口。

或者,

ping6 fe80::b4f4:1c06:416c:11cb%enp9s0

%指定本地链路接口。

注:非本地链路地址不需要指定接口。

telnet访问IPv6(本地链路)

telnet -6 fe80::b4f4:1c06:416c:11cb%enp9s0 22

指定-6选项,IPv6地址,%指定本地链路接口,访问测试端口22。

注:非本地链路地址不需要指定接口。

ssh访问IPv6(本地链路)

ssh root@fe80::b4f4:1c06:416c:11cb%enp9s0

指定IPv6地址,%指定本地链路接口。

注:非本地链路地址不需要指定接口。

非本地链路地址的IP使用

非本地链路地址使用不需要指定接口。

root@myb-kylinV10:~# ssh root@128::103 #OK
root@128::103's password:
root@myb-kylinV10:~# ssh root@fe80::129d:b1e3:3248:9f0c #FAIL
ssh: connect to host fe80::129d:b1e3:3248:9f0c port 22: Invalid argument
root@myb-kylinV10:~# ssh root@fe80::129d:b1e3:3248:9f0c%enp0s3 #OK
The authenticity of host 'fe80::129d:b1e3:3248:9f0c%enp0s3 (fe80::129d:b1e3:3248:9f0c%enp0s3)' can't be established.
ECDSA key fingerprint is SHA256:hy25aH3XooiDemGUpyypWVkiebtqYVNx3d+1yak+0CM.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'fe80::129d:b1e3:3248:9f0c%enp0s3' (ECDSA) to the list of known hosts.
root@fe80::129d:b1e3:3248:9f0c%enp0s3's password:

IPv6抓包

简单几个例子:

比如抓端口22,访问目标IP为 fe80::b4f4:1c06:416c:11cb

​ tcpdump -i enp9s0 -nnv tcp port 22 and host fe80::b4f4:1c06:416c:11cb

比如抓ipv6的ping包

​ tcpdump -i enp9s0 -nnv icmp6

比如抓ipv6的ip包

​ tcpdump -i enp9s0 -nnv ip6

其他和IPv4类似不赘述,具体问题具体现查。

IPv6防火墙查看

ip6table xxxx

后边xxx的命令和iptables是一致的。

IPv6转发开启查看

sysctl -a | grep net.ipv6.conf.all.forwarding

对应IPv4的net.ipv4.ip_forward

参考

https://zhuanlan.zhihu.com/p/113368496

https://support.huawei.com/enterprise/zh/doc/EDOC1100116138

https://www.cnblogs.com/lsgxeva/p/13932262.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值