NAT64实现过程
NAT64是什么
地址转换:地址转换技术是将一种协议版本的数据包报头更改为另一种协议版本的数据包报头,因而解决了IPv4设备与IPv6设备之间的互操作问题。 简单的NAT64设置可能是一个设备的两个接口分别连接到IPv4网络与IPv6网络的网关。 IPv6网络的流量经由网关路由,其对两个网络之间传送的分组进行所有必要的翻译。 但是,这种翻译并不是对称的,因为IPv6地址空间比IPv4地址空间大得多,因此就不可能进行一对一的地址映射。如下两种场景:
- 场景1:c–ipv4–>router–ipv6–>s(ipv4转ipv6,总能在v6里找到ip与v4映射)
- 场景2:c–ipv6–>router–ipv4–>s(ipv6转ipv4,会面临v4的ip池不够用问题)
总的来说就是当需要的进行NAT的ipv6数量达到了了ipv4支持最大数,就无法建立更多的地址映射。
NAT64并不是?个很好的解决?案,?前确定的NAT64局限性如下: 1、在没有静态地址映射表项的情况下,不允许IPv4设备向IPv6设备发起会话请求(dst_ip无法确定); 2、软件对NAT64的?持程度有限; 3、与其他所有转换器?样,也不?持IP多播; 4、很多应?都不?持。
IPv6、IPV4各自特点
IPV6地址
名称 | 特点 | 数量 |
---|
未指明地址 | 全0,::/128 | 1个 | 环回地址 | 最后一位为1其余为0,::1/128 | 1个 | 多播地址 | 前8位为1,FF00::/8 | 2^120个 | 本地链路单播地址 | 前10位为1111111010,FE80::/10 | 2^108个 | 全球单播地址 | 除上所有地址 | 2128-2-2120-2^108个 |
IPv4地址
名称 | 特点 | 数量 |
---|
A类 | 首位为0,网络号8位,主机号24位 | (27-2)*(224-2)个 | B类 | 前2位为10,网络号16位,主机号16位 | (214-1)*(216-2)个 | C类 | 前3位为110,网络号24位,主机号8位 | (221-1)*(28-2)个 | D类 | 前4位为1110,多播地址 | 2^28个 | E类 | 前4位为1111,保留为今后使用 | 2^28个 |
**注:**A类网络号-2的原因是:0.0.0.0是保留地址,意思是“本网络”,其次127...*是环回地址; B类网络号-1原因是:128.0.0.0用来代表B类网络不指派; C类网络号-1原因是:192.0.0.0用来代表C类网络不指派; 所有主机号-2原因:主机号全为“0”,不论哪一类网络,主机号全为“0”表示指向本网,常用在路由表中;主机号全为“1”,主机号全为“1”表示广播地址,向特定的所在网上的所有主机发送数据包。
两者报文帧的不同点
与IPv4相比,IPv6对首部中的某些字段进行了如下更改:
- 取消了首部长度字段,因为的它的首部长度是固定的40B。
- 取消了服务类型字段,因为优先级和流标号字段实现了服务类型字段的功能。
- 取消了总长度字段,改用有效载荷长度字段。
- 取消了标识、标志和片偏移字段,因为这些功能已包含在分片扩展首部中。
- 把TTL字段改称位跳数限制字段,但作用是一样的。
- 取消了协议字段,改用下一个首部字段,在没有扩展首部的时候作用和协议字段一样。
- 取消了检验和字段。
- 取消了选项字段,而用扩展首部来实现选项的功能。
**注:**取消的字段用灰色表示,相同作用的字段用相同颜色表示。
IP头如何转换
原理:IP头有两种方向的转换,从IPv4转为IPv6及从IPv6转为IPv4,这两种转换参考自RFC6145文档。
从IPv4转为IPv6
版本:6 通信量类:复制IPv4的服务类型 流标号:全0 有效载荷长度:IPv4头的IP段总长-IPv4首部长度-IPv4选项长度 下一个首部:对于ICMPV4(1)需要转为ICMPV6(58),其余协议直接拷贝IPV4的协议 跳数限制:拷贝IPv4头的TTL 源/目的地址:转换后的源/目的地址 有效载荷:(待讨论)
ICMPv4转为ICMPv6
查询消息:
类型 | 代码 | 处理动作 |
---|
8/0 | | 8改为128 0改为129 | 9-10 13-14 | | drop | 未识别类型 | | drop |
错误消息:
类型 | 代码 | 处理动作 |
---|
4-6 | | drop | 3 | 0-1 | 把代码改为0 | 3 | 2 | 类型改为4,代码改为1 | 3 | 3 | 代码改为4 | 3 | 4 | 类型改为2,代码改为0 | 3 | 5-8,11-12 | 代码改为0 | 3 | 9-10,13,15 | 代码改为1 | 3 | 14 | drop | 3 | < 0 或 > 15 | drop | 11 | | 类型改为3,代码不变,检验和更新 | 12 | 0/2 | 类型改为4,代码改为0 | 12 | 1 | drop | 12 | < 0 或 > 2 | drop | 未识别类型 | | drop |
从IPv6转为IPv4
协议版本:4 首部长度:5(没有选项) 服务类型:复制IPv6的通信量类 IP段总长:有效载荷长度+IPv4首部长度 标识:全0 标记:全0 片偏移:全0 生存时间:拷贝IPv6的跳数限制 协议:对于ICMPV6(58)需要转为ICMPV4(1),其余协议直接拷贝IPV6的下一个首部 校验和:创建完IPv4头后计算 源/目的地址:转换后的源/目的地址
ICMPv6转为ICMPv4
查询消息:
类型 | 代码 | 处理动作 |
---|
128/129 | | 128改为0,129改为8 | 130-137 | | drop | 未知类型 | | drop |
错误消息:
类型 | 代码 | 处理动作 |
---|
1 | 0,2,3 | 代码改为1 | 1 | 1 | 代码改为10 | 1 | 4 | 代码改为3 | 1 | < 0 或 > 4 | drop | 2 | | 类型改为3代码改为4 | 3 | | 类型改为11,代码不变 | 4 | 0 | 类型改为12,代码改为0 | 4 | 1 | 类型改为3,代码改为2 | 4 | 2 | drop | 4 | 其他代码 | drop | 未知类型 | | drop |
存在的问题: IPv4转IPv6后头部长度会变长,可能会大于MTU导致丢包。并且IPv6路由器不能进行分片,只能由发送者进行分片。 这种情况下就需要用ICMPv4发送“我需要分片”的错误信息到发送者,这里的实现比较复杂,暂时先不支持,作为缺陷处理。
校验和更新
当转换的IP地址算法不是检验和中性的,则需要更新传输层头部检验和,至少支持TCP、UDP(检验和不为全0)、ICMP。 此外,IPv6转为IPv4时检验和需更新。
IP地址转换
原理:IP地址有两种方向的转换,从IPv4转为IPv6及从IPv6转为IPv4,这两种转换参考自RFC6052文档。 地址转换示意图: 地址转换方法: 网络特定前缀: 众所周知的前缀: 以上方法是一种无状态转换,支持IPv6、IPv4任一端发起访问,但是对转换器的IPv6端的IP前缀有要求,必须符合转换起预定的前缀要求。若想做到无状态转换则需准备一个符合前缀的IPv6转换池,V6端每来一个IPv6都与转换池里的IPv6地址进行一一绑定,绑定过程是随机一个挑选池里的IP,直达转换池用完,就不能支持更多的连接。 关于无状态转换与有状态转换,可戳这里了解。
|