Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析

Cisco GNS3 IPv6 6rd实验

1、回顾

前文:https://www.cnblogs.com/kingpop/p/14054321.html
在描述Cisco GNS3搭建6rd实验之前,再来回顾下,之前讲的Linux下搭建6rd的步骤,上次只是给了一个简单的例子,并没有详细说出每个步骤的具体的作用;并且,通过对6rd原理的了解,我们可以认识到,更为普通的情况下,IPv6的前缀长度可以小于64bit的,只需要满足条件:
IPv6前缀长度 + 32 – IPv4通用前缀 – IPv4通用后缀长度 ≤ 64
此外,就Cisco设备针对IPv6的6rd功能实现来讲,提到的IPv4通用前缀和IPv4通用后缀两个概念,在当前的Linux内核中是否均支持呢?我们用实际代码来说话(如果有理解上的出入,还望各位指出);直接步入关键函数:

static bool check_6rd(struct ip_tunnel *tunnel, const struct in6_addr *v6dst,
              __be32 *v4dst)
{
#ifdef CONFIG_IPV6_SIT_6RD
    if (IPv6_prefix_equal(v6dst, &tunnel->ip6rd.prefix,
                  tunnel->ip6rd.prefixlen)) {
        unsigned int pbw0, pbi0;
        int pbi1;
        u32 d;

        /* 整个计算目的IPv4地址的过程。*/
        pbw0 = tunnel->ip6rd.prefixlen >> 5;
        pbi0 = tunnel->ip6rd.prefixlen & 0x1f;

        /* 从目的IPv6地址中取出 IPv4 不共用的部分,如192.168.10.10中 10.10 */
        d = tunnel->ip6rd.relay_prefixlen < 32 ?
            (ntohl(v6dst->s6_addr32[pbw0]) << pbi0) >>
            tunnel->ip6rd.relay_prefixlen : 0;

        pbi1 = pbi0 - tunnel->ip6rd.relay_prefixlen;
        if (pbi1 > 0)
            d |= ntohl(v6dst->s6_addr32[pbw0 + 1]) >>
                 (32 - pbi1);
        /* &#x5C06;&#x914D;&#x7F6E;&#x7684;IPv4&#x901A;&#x7528;&#x524D;&#x7F00;&#x548C;&#x83B7;&#x53D6;&#x4E0D;&#x901A;&#x7528;&#x7684;&#x90E8;&#x5206;&#x6216;&#x8FD0;&#x7B97;&#x8BA1;&#x7B97;&#x51FA;IPv4&#x76EE;&#x7684;&#x5730;&#x5740; */
        *v4dst = tunnel->ip6rd.relay_prefix | htonl(d);
        return true;
    }
#else
    if (v6dst->s6_addr16[0] == htons(0x2002)) {
        /* 6to4 v6 addr has 16 bits prefix, 32 v4addr, 16 SLA, ... */
        memcpy(v4dst, &v6dst->s6_addr16[1], 4);
        return true;
    }
#endif
    return false;
}

说了这么多了,我们也就清楚,Linux下,仅支持设置IPv4通用前缀长度,不支持IPv4通用后缀长度。现在,以Linux系统为基础环境,构建一个48的IPv6前缀长度和16的IPv4通用前缀长度的6rd环境。相关拓扑图和配置如下:

Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
拓扑结构如上图所示,实际配置不同的是IPv6的前缀,将IPv6的前缀修订为2012:db8:2300::/48。
#&#x914D;&#x7F6E;CE&#x8BBE;&#x5907;
ip address add 192.168.110.27 dev eth0
ip link set eth0 up
ip tunnel add kali006rd mode sit local 192.168.110.27
ip tunnel 6rd dev kali006rd 6rd-prefix 2012:db8:2300::/48 6rd-relay_prefix 192.168.0.0/16
ip link set kali006rd up
ip -6 addr add 2012:db8:2300:6e1b::1/64 dev kali006rd
ip -6 route add 2012:db8:2300::/64 dev kali006rd
ip -6 route add default via ::192.168.147.136

CE配置命令这么多,是哪条命令完成设定IPv6前缀和IPv4通用前缀的呢?以及隧道口的IPv6地址是否是可以随意设定的呢?答案当然不是的。

&#x547D;&#x4EE4;&#xFF1A;
    ip tunnel 6rd dev kali006rd 6rd-prefix 2012:db8:2300::/48 6rd-relay_prefix 192.168.0.0/16
    &#x8FD9;&#x6761;&#x547D;&#x4EE4;&#x5373;&#x5B8C;&#x6210;IPv6&#x7684;&#x524D;&#x7F00;&#x8BBE;&#x5B9A;&#x548C;IPv4&#x901A;&#x7528;&#x524D;&#x7F00;&#x7684;&#x8BBE;&#x5B9A;&#x3002;&#x7B49;&#x6548;&#x4E8E;Cisco&#x8BBE;&#x5907;&#x4E2D;&#x7684;&#x914D;&#x7F6E;&#xFF1A;

interface Tunnel0
tunnel6rd IPv4 prefix-len 16
tunnel6rd prefix 2001:db80:2300::/48

再者是隧道接口的IPv6地址如何确定?如果还记之前博客里面写的6rd原理,你就应该清楚的知道IPv6地址的前缀是有IPv6前缀和IPv4地址共同决定的。

&#x547D;&#x4EE4;&#xFF1A;
    ip -6 addr add 2012:db8:2300:6e1b::1/64 dev kali006rd
    2012:db8:2300  &#x5373;&#x8BBE;&#x5B9A;&#x7684;IPv6&#x8FD0;&#x8425;&#x5546;&#x5206;&#x914D;&#x7684;&#x524D;&#x7F00;
        6e1b  &#x5373;&#x9700;&#x8981;&#x5D4C;&#x5165;&#x5230;IPv6&#x524D;&#x7F00;&#x4E2D;&#x7684;&#x90E8;&#x5206;IPv4&#x4FE1;&#x606F;&#xFF0C;&#x7531;&#x4E8E;&#x5DF2;&#x7ECF;&#x8BBE;&#x5B9A;&#x4E86;&#x901A;&#x7528;&#x524D;&#x7F00;&#x4E3A;192.168.0.0/16&#x4E5F;&#x5373;&#x662F; 192.168&#x8FD9;&#x4E24;&#x4E2A;&#x5B57;&#x8282;&#x4E0D;&#x9700;&#x8981;&#x5D4C;&#x5165;&#x5230;IPv6&#x524D;&#x7F00;&#x4E2D;&#xFF0C;&#x53EA;&#x9700;&#x8981;&#x5C06;&#x5269;&#x4F59;&#x7684;&#x90E8;&#x5206;&#x5D4C;&#x5165;&#x5230;IPv6&#x524D;&#x7F00;&#x4E2D;&#x3002;
&#x547D;&#x4EE4;&#xFF1A;
    ip -6 route add default via ::192.168.147.136

不知道你们是否好奇这一条命令,作用到底是什么?为什么需要他?为啥搭建6to4的时候不需要呢?在回顾下上一篇博客中讲到的CE与CE通信以及CE和IPv6 internet网的通信时,报文的封装过程。
一句话解释就是:
CE到CE,封装的IPv4目的地址是从IPv6目的地址中获取的;当我们访问IPv6 Internet时,我们是要通过6rd的br路由器来与之通信的。因此我们需要先将报文送到br路由器,因此IPv6默认路由 via后面跟的IPv4地址为br路由器的IPv4地址(这个很关键,突然想起了dota情书的口头禅了:这很关键!)。

#&#x914D;&#x7F6E;ISP
ip address add 192.168.147.1 dev eth0
ip link set eth0 up
ip address add 192.168.110.1 dev eth1
ip link set eth1 up

#&#x914D;&#x7F6E;BR&#x8BBE;&#x5907;
ip address add 192.168.147.136 dev eth0
ip link set eth0 up
ip tunnel add kali006rd mode sit local 192.168.147.136
ip tunnel 6rd dev kali006rd 6rd-prefix 2012:db8:2300::/48 192.168.0.0/16
ip link set kali006rd up
ip -6 addr add 2012:db8:2300:9388::1/64 dev kali006rd
ip -6 route add 2012:db8:2300::/48 dev kali006rd

#&#x5728;CE&#x8BBE;&#x5907;&#x6D4B;&#x8BD5;&#x8FDE;&#x901A;&#x6027;&#xFF1A;
root@kalimk:~# ping6 2012:db8:2300:9388::1 -c 5
PING 2012:db8:c0a8:9388::1(2012:db8:c0a8:9388::1) 56 data bytes
64 bytes from 2012:db8:c0a8:9388::1: icmp_seq=1 ttl=64 time=0.759 ms
64 bytes from 2012:db8:c0a8:9388::1: icmp_seq=2 ttl=64 time=1.64 ms
64 bytes from 2012:db8:c0a8:9388::1: icmp_seq=3 ttl=64 time=0.769 ms
64 bytes from 2012:db8:c0a8:9388::1: icmp_seq=4 ttl=64 time=0.606 ms
64 bytes from 2012:db8:c0a8:9388::1: icmp_seq=5 ttl=64 time=0.710 ms

10 packets transmitted, 10 received, 0% packet loss, time 9138ms
rtt min/avg/max/mdev = 0.424/0.858/1.687/0.413 ms

2、Cisco GNS3环境搭建

讲之前,我们先来唠唠嗑吧,我为啥突然想起来要写个这个呢?
讲实话,搭建这个GNS3环境之前,我也是百度的,肯定有写的很好的,也有写的言简意赅的。我中和几篇文章,再折腾了好久才把环境搭建起来,这可能是我没太多耐心去读哪些文章。不过更为重要的原因是:每当我看到这里需要一个软件或者其他GNS3以外的东西时,都没有访问地址或资源链接,搜索到了,那个C币(CSDN)价格很喜人。我没有给他机会,我还是继续认真的百度,必应去了。哈哈哈哈哈。。。
不过安装完GNS3之后,发现最新的GNS3 2.XX版本真的很好用,比以前的好用多了,之前1.XX版本时,那个内存吃的,界面操作也不是很流畅。最近优化了不少哇。
让我们步入正题吧。

2.1 软件及工具下载方式

在GNS3官网上先注册一个账号,因为只有有了账号才能够免费下载对应的软件。
GNS3:https://gns3.com/software/download;根据自己的需求选择Windows, Linux, MAC版本。
GNS3镜像包(也即是界面中的路由器、交换机):

2.2 GNS3使用时常用操作

2.2.1 导入IOS镜像包

注:这里需要使用到IOS image文件,自己记得在前面提供的下载方式中去下载。
步骤1:点击菜单栏,Edit –> Preferences

Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
步骤2:点击 New
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
步骤3:点击Next,选择我们已经下载好的IOS image文件,完成加载,其他默认即可,自己可以按需配置,作为新手的我,都是默认选项。
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
在选择Network Adapters时,可以根据自己的需求来增加一个槽。
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
如:slot1中下拉框中的NM-4T、NM-16ESW(对应到实体路由器就是一张板卡,板卡含有多个接口(以太接口、serial接口等))。这里slot0中的默认的GT96100-FE是一张含有两个fast接口的板卡。
这些配置,后期都可以再更改的。当前这里,一直点击Next按钮知道点击Finish完成。
当前,实验使用的是,c7200。记得加载c7200的IOS image包。
2.2.2 配置GNS3 VM

使用GNS3 VM作为一个Server。
步骤1:菜单栏,Help  Setup Wizard,点击Next

Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
默认配置即可,再点击Next  Next,直到界面:
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
如果界面VM name的下拉框中,没有GNS3 VM,这是因为,你没有将之前下载的GNS3 VM 虚拟机加载到VMware中。相应的操作如下:
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
来完成GNS VM虚拟机的导入(当前我使用的VMware, Virtual Box的用户自行实验)。
再次GNS VM界面的Refresh按钮刷新,即可看到GNS3 VM的选项。点击Next直到Finish。
最后,最后:
重启GNS3软件,GNS3 VM会自动跟随启动的。
如果一切正常,VM虚拟机有如下界面弹出:
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
键入Enter键后,弹出的界面:
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
目前而言,主要关注的是:
  • Shell: Open a shell #启动一个shell命令行
  • Network: Configure network settings # 配置网络IP地址等相关信息,配置后,虚拟机将会自动重启。
    有个小疑问:进入到shell后,怎么再次回到这个界面,没有办法。
    注:设备中,需要使用ip 等命令,或执行命令时,提示无权限时,记得在命令前加:sudo 关键字。
2.2.3 连接网线

启动GNS3软件,创建一个项目:File  New blank project。

Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
点击图中1出的路由器图标,在旁边就会列出,我们之前所加载的IOS image对应的路由器设备。
选择对应的路由器,将其拖拽到图中2旁边的空白区域,进行编辑,连接网线。上图中的【云朵图标】在图中1处的显示器图片栏目下面:
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
连接网线:

Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
启动路由器,并进入命令行:

Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
右键,需要启动的路由器,如:6r_br_router,选择start;再双击设备,即可进入命令行:
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析

2.3 配置6rd

现在,终于可以开始搭建6rd环境了。拓扑如下:

Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
IPv4地址配置:
6rd_br_router: gi 0/0 192.168.10.10
IPv4-Network: 与br_router连接的接口的IPv4地址为 192.168.10.1
与ce_route连接的接口的IPv4地址为 192.168.1.2
6rd_ce_router: gi 0/0 192.168.1.10
注:IPv4-Network的地址配置是在GNS VM 中去配置的。
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
确保6r_br_route和6r_ce_router的互通性:
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
如果不能正常ping通,可以配置arpa来完成:
arp 192.168.1.10 000c.291f.1598 ARPA
arp &#x76EE;&#x7684;&#x5730;&#x5740; &#x5413;&#x4E00;&#x8DF3;MAC&#x5730;&#x5740; ARPA
6rd_br_router的配置如下:
interface Tunnel1
 no ip address
 no ip redirects
 IPv6 address 2001:DB80:A0A::1/48
 tunnel source GigabitEthernet0/0
 tunnel mode IPv6ip 6rd
 tunnel 6rd IPv4 prefix-len 16
 tunnel 6rd prefix 2001:DB80::/32
!
interface Ethernet0/0
 no ip address
 shutdown
 duplex auto
!
interface GigabitEthernet0/0
 ip address 192.168.10.10 255.255.255.0
 duplex full
 speed 1000
 media-type gbic
 negotiation auto
!
ip forward-protocol nd
no ip http server
no ip http secure-server
!
!
ip route 192.168.1.0 255.255.255.0 GigabitEthernet0/0
!
no cdp log mismatch duplex
arp 192.168.1.10 000c.291f.1598 ARPA
IPv6 route 2001:DB80::/32 Tunnel1
IPv6 route ::/0 2001:DB80::1
6rd_ce_router的配置如下:
interface Tunnel1
 no ip address
 no ip redirects
 IPv6 address 2001:DB80:10A::1/48
 tunnel source GigabitEthernet0/0
 tunnel mode IPv6ip 6rd
 tunnel 6rd IPv4 prefix-len 16
 tunnel 6rd prefix 2001:DB80::/32
 tunnel 6rd br 192.168.10.10
!
interface Ethernet0/0
 no ip address
 shutdown
 duplex auto
!
interface GigabitEthernet0/0
 ip address 192.168.1.10 255.255.255.0
 duplex full
 speed 1000
 media-type gbic
 negotiation auto
!
ip forward-protocol nd
no ip http server
no ip http secure-server
!
!
ip route 192.168.10.0 255.255.255.0 GigabitEthernet0/0
!
no cdp log mismatch duplex
arp 192.168.10.10 000c.291f.15a2 ARPA
arp 192.168.10.12 000c.291f.15a2 ARPA
IPv6 route 2001:DB80::/32 Tunnel1
IPv6 route ::/0 Tunnel1
6rd互通性测试:

Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析
Wireshark抓取报文:

Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析

Original: https://www.cnblogs.com/kingpop/p/14163178.html
Author: KingPop
Title: Cisco GNS3教程,GNS3搭建IPv6 6rd环境,Linux 配置 IPv6 6rd详析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/577876/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • TCP三次握手 四次挥手

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年10月19日
    0225
  • 如何写出有效的单元测试

    测试不要名不副实避免测试的描述与测试内容不符;测试结果必须精准;测试该失败的时候一定要失败! 测试私有或者受保护的方法解决思路: 将方法变成公共方法; 将方法抽取到新类; 将方法变…

    Linux 2023年6月8日
    070
  • 苹果手机使用altstore免越狱安装第三方应用

    转自52pojie &#x5F00;&#x53D1;&#x4EBA;&#x5458;Riley Testut&#x63A8;&#x5…

    Linux 2023年6月7日
    0244
  • zabbix监控配置流程

    zabbix监控配置流程 管理层次: 开发人员要加监控,需要让其提供监控指标运营人员要加监控,让其找开发要监控指标运维人员要加监控,让运营人员去找开发要监控指标。 配置层次: 1….

    Linux 2023年6月6日
    072
  • 聊聊redis单线程为什么能做到高性能和io多路复用到底是个什么鬼

    1:io多路复用epoll io多路复用简单来说就是一个线程处理多个网络请求。 我们知道epoll in 的事件触发是可读了,这个比较好理解,比如一个连接过来,或者一个数据发送过来…

    Linux 2023年5月28日
    057
  • 笔记:linux 总结

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年9月10日
    0195
  • WSL系统安装与使用

    WSL是适用于 Linux 的 Windows 子系统,可让开发人员按原样运行 GNU/Linux 环境 – 包括大多数命令行工具、实用工具和应用程序 – …

    Linux 2023年5月27日
    0103
  • Redis的字符串源码

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年9月14日
    0182
  • 关于Ubuntu 下新开发板adb 无法识别的问题

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月26日
    0197
  • Linux环境下配置vscode的C/C++ 的make编译环境(编写makefile方式)代码Demo版

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年8月24日
    0289
  • Xshell 设置右键粘贴功能

    参考链接:百度经验 活在当下, 从零 出发; posted @2018-04-27 09:38 半天的半天 阅读(266 ) 评论() 编辑 Original: https://w…

    Linux 2023年5月28日
    064
  • Redis-Cluster实战–5.使用redis-cli安装

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年9月14日
    0207
  • 【已解决】Windows环境下启动redis服务失败

    在redis安装目录下打开cmd窗口: 依次输入: redis-cli.exe shutdown exit redis-server.exe redis.windows.conf …

    Linux 2023年6月14日
    041
  • Linux

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年9月10日
    0178
  • Linux之export命令

    镜像下载、域名解析、时间同步请点击阿里云开源镜像站 export命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。 一个变量创建时,它不会自动地为在它之后…

    Linux 2023年5月27日
    089
  • 《分布式系统原理介绍》读书笔记

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    Linux 2022年11月12日
    0150
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球