梳理了IETF的相关RFC文档,汇总IPv4与IPv6地址转换映射的方法。笔者资历较浅,难免有错误之处,还望指正。如真正深入研究,可以查看标准RFC文档。IETF官网文档下载链接 本文总体上根据RFC文档出版的时间先后顺序,大概叙述每个文档实现IP地址转换的思路;为了便于理解某些内容,对某些文档描述调整了顺序,可能不符合时间先后顺序。
IPv6与IPv4地址转换
- RFC4291
- RFC6052
- RFC2766(NAT-PT)
- RFC6146(NAT64)
- RFC8512
- RFC 8215( Local-Use IPv4/IPv6 Translation Prefix )
- RFC3306( Unicast-Prefix-based IPv6 Multicast Addresses )
- RFC 6219(IVI)
- RFC 8114
- 相关资料
- 参考文献
RFC4291
《RFC4291》1提出两种兼容方式实现IPv4和IPv6的地址转换,81-96位全为0的兼容方式或全为1的兼容方式。IPv6兼容的IPv4地址必须为全球单播地址,81-96位全为0的兼容方式见图1。
图1 81-96位全为0的兼容方式
IPv6地址81-96位全为1的兼容方式见图2。
图2 81-96位全为1的兼容方式
RFC6052
《RFC6052》2规定了IPv4地址转换成对不同前缀长度的IPv6地址格式,IPv6地址前缀位数有32, 40, 48, 56, 64, 72, 80, 88和96。32位的IPv4地址直接内嵌至IPv6前缀后格式如图3所示。
图3 IPv6地址内嵌IPv4地址
《RFC6052》规定IPv4地址和IPv6地址实现映射的知名网络前缀
64:ff9b::/96,同时,知名网络前缀只能使用最后一种前缀长度为96的IPv6地址格式。知名网络前缀
64:ff9b::/96不能映射《RFC1918》分配的私有IPv4地址。《RFC6052》中利用 2001:db8:: 特定网络前缀实现映射如图4所示。
图4 特定网络前缀映射
RFC2766(NAT-PT)
介绍NAT-PT前,可能需要了解一下NAT技术,本文不再介绍NAT技术,直接了解NAT-PT原理。(由于论文行文习惯,先叙述文字再放图。为了便于描述,这里先放图,因此该图不视为文内的图4,当做不存在就行。本图摘自《RFC2766》3。)
如图,IPv6侧的A和B主机通过NAT-PT与IPv4侧的IPv4主机C连接。主机A和B位于同一个网络内,具有相同的网络前缀,主机C具有IPv4地址132.146.243.30,且为全为唯一的。
NAT-PT配置有IPv4地址池,可以满足与IPv6地址的一一对应关系。
主机A向主机C发起通信时,源地址fedc:BA98::7654:3210,目的地址prefix::132.146.243.30(prefix为IPv6网络前缀,与NAT-PT IPv6地址网络前缀一致)。如果A发送的是建立会话的初始化数据包,假设NAT-PT为其分配一个120.130.26.10IPv4地址,然后转发至主机C,此时数据包的源地址120.130.26.10,目的地址132.146.243.30。NAT-PT收到主机C的IPv4数据包时,根据源地址132.146.243.30,目的地址120.130.26.10,将其转发至主机A,此时源地址prefix::132.146.243.30,目的地址fedc:BA98::7654:3210。主要原理就是建立一个映射表,存储建立的映射关系,数据包到来时,直接查表。
在此基础上,引入“地址+端口”映射,过程区别不大,主要区别在于数据包( src代表源地址,dest代表目的地址,tcp=3017代表tcp端口号为3017),如下过程所述。
A -> NAT-PT:
src = fedc:BA98::7654:3210, tcp = 3017, dest = prefix::132.146.243.30,tcp=23
NAT-PT -> C:
src = 120.130.26.10, tcp = 1025, dest = 132.146.243.30, tcp = 23
C -> NAT-PT:
src = 120.130.26.10, tcp = 23, dest = 132.146.243.30, tcp = 1025
NAT-PT -> A:
src = prefix::132.146.243.30, tcp = 23, dest = fedc:BA98::7654:3210,tcp=3017
RFC6146(NAT64)
NAT64设备根据《RFC6052》定义的算法,利用自身IPv6前缀和待转换的IPv4地址生成IPv6地址。有状态NAT64转换包含绑定的TCP和UDP端口号。NAT64的IPv6地址池前缀为Pref64::/n。
在《RFC6146》4示例中,根据《RFC6052》知名网络前缀,
在NAT64 IPv6接口端建立的映射关系为: ( 2001:db8::1, 1500 ) <–> ( 203.0.113.1, 2000 );
在IPv4接口端建立的映射关系为:( 64:ff9b::192.0.2.1, 80) <–> ( 192.0.2.1, 80 )。
《RFC6146》中NAT64会话映射表为( X’, x), (Y’, y) <–> ( T, t), ( Z, z),其中X’和Y’为IPv6地址,T和Z为IPv4地址。x, y, z和t为端口号,同时y必须等于z。
RFC8512
《RFC8512》5根据《RFC6052》地址转换算法,在NPT和NAT中实现IPv6和IPv4地址转换。IPv6地址2001:db8:1234 ::198.51.100.1采用特定网络前缀,映射至IPv4地址198.51.100.1。
RFC 8215( Local-Use IPv4/IPv6 Translation Prefix )
《RFC6052》预留了知名网络前缀64:ff9b::/96,因此《RFC8215》6将
64:ff9b::1:0:0 - 64:ff9b:0:ffff:ffff:ffff:ffff:ffff 地址分配给本地内网IPv4和IPv6地址转换使用。另一方面《RFC6052》对于分配的私有IPv4地址的限制,对IPv6前缀64:ff9b:1::/48不适用,因此64:ff9b:1::/48网络前缀可以实现私有IPv4地址转换。
RFC3306( Unicast-Prefix-based IPv6 Multicast Addresses )
在IPv6组播地址格式中,flags:P=0,IPv6组播地址非基于网络前缀;P = 1,表示IPv6组播地址基于IPv6网络前缀,当P=1时,必须满足T = 1。
scope:限制组播范围,不同值对应范围如下表所示。
value | domain |
0 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
A |
|
B |
|
C |
|
D |
|
E |
|
F |
|
reserved:0x00,根据《RFC 3306》7,需要清0该域。
plen:network prefix长度。
network prefix:利用IPv6网络前缀中填充该域,填充位数由plen决定。
group ID:组播ID。
当P=1.且T=1时,基于IPv6网络前缀的组播地址如图5所示。
图5 基于IPv6网络前缀组播地址
IPv4组播地址范围为
224.0.0.0 - 239.255.255.255。当IPv6组播地址为
239.1.1.5时,假设转换设备的IPv6地址由特定网络前缀
2001:db8:122:344::/96(见图1)组成,基于IPv6网络前缀的一种IPv4组播地址转换结果为
ff32:40:2001:db8:122:344:fe01:105。其中,
fe01:105为
239.1.1.5的十六进制,即
fe.01.01.05。ff为固定格式,3代表flags=0011,2代表组播限制在
Link-Local scope。0x40代表基于IPv6网络前缀的长度为64位,即
2001:db8:122:344。
RFC 6219(IVI)
《RFC6219》8采用IPv6特定网络前缀解决IPv4和IPv6地址之间的无状态映射,同时利用32-39位标识IVI前缀,40-71位内嵌全球唯一的IPv4地址。IVI实现单播地址映射如图5所示。
图6 IVI单播地址映射
IVI实现IPv4组播地址和IPv6组播地址的映射,IPv4组播地址范围为
232.0.0.0/8 - 232.255.255.255/8,采用的IPv6组播地址为 PIM-SSM( Protocol Independent Multicast - Source-Specific Multicast, 协议无关组播-特定于源的组播)。转换后的IPv6组播地址范围为
ff3e:0:0:0:0:0:f000:0000/96 - ff3e:0:0:0:0:0:f0ff:ffff/96,32位的组播ID中,f0固定,而后24位由IPv4组播地址后24位转换而来。IVI实现IPv4组播地址和IPv6组播地址映射如图7所示。
图7 IVI实现IPv4组播和IPv6组播地址映射
RFC 8114
《RFC8114》8对组播地址转换算法进行描述,分为IPv6组播地址的组成和IPv4组播地址的获取。
IPv6组播地址:结合IPv6组播地址前缀的96位和IPv4地址的32位以获得一个128位的地址。
IPv4组播地址:如果IPv6组播地址前缀为预先配置,即可直接从组播地址后32位获取IPv4组播地址。
如图8为IPv4组播地址与IPv6组播地址转换。
图8 IPv4组播地址与IPv6组播地址转换
请在转载或引用时,说明本文章来源。
相关资料
《RFC7269》NAT64 Deployment Options and Experience《RFC7857》Updates to Network Address Translation (NAT) Behavioral Requirements《RFC6889》Analysis of Stateful 64 Translationgithub IPv6组播实验源码
参考文献
- 《RFC4291》IP Version 6 Addressing Architecture ↩︎
- 《RFC6052》IPv6 Addressing of IPv4/IPv6 Translators ↩︎
- 《RFC2766》Network Address Translation - Protocol Translation (NAT-PT) ↩︎
- 《RFC6146》Stateful NAT64: Network Address and Protocol Translation from IPv6 Clients to IPv4 Servers ↩︎
- 《RFC8512》A YANG Module for Network Address Translation (NAT) and Network Prefix Translation (NPT) ↩︎
- 《RFC8215》Local-Use IPv4/IPv6 Translation Prefix ↩︎
- 《RFC3306》Unicast-Prefix-based IPv6 Multicast Addresses ↩︎
- 《RFC8114》Delivery of IPv4 Multicast Services to IPv4 Clients over an IPv6 Multicast Network ↩︎ ↩︎