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_6RDif (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);/* 将配置的IPv4通用前缀和获取不通用的部分或运算计算出IPv4目的地址 */*v4dst = tunnel->ip6rd.relay_prefix | htonl(d);return true;}
#elseif (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;}
#endifreturn false;
}
说了这么多了,我们也就清楚,Linux下,仅支持设置IPv4通用前缀长度,不支持IPv4通用后缀长度。现在,以Linux系统为基础环境,构建一个48的IPv6前缀长度和16的IPv4通用前缀长度的6rd环境。相关拓扑图和配置如下:
拓扑结构如上图所示,实际配置不同的是IPv6的前缀,将IPv6的前缀修订为2012:db8:2300::/48。
#配置CE设备
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地址是否是可以随意设定的呢?答案当然不是的。
命令:
ip tunnel 6rd dev kali006rd 6rd-prefix 2012:db8:2300::/48 6rd-relay_prefix 192.168.0.0/16
这条命令即完成IPv6的前缀设定和IPv4通用前缀的设定。等效于Cisco设备中的配置:
interface Tunnel0
tunnel6rd IPv4 prefix-len 16
tunnel6rd prefix 2001:db80::/32
再者是隧道接口的IPv6地址如何确定?如果还记之前博客里面写的6rd原理,你就应该清楚的知道IPv6地址的前缀是有IPv6前缀和IPv4地址共同决定的。
命令:
ip -6 addr add 2012:db8:2300:6e1b::1/64 dev kali006rd
2012:db8:2300 即设定的IPv6运营商分配的前缀
6e1b 即需要嵌入到IPv6前缀中的部分IPv4信息,由于已经设定了通用前缀为192.168.0.0/16也即是 192.168这两个字节不需要嵌入到IPv6前缀中,只需要将剩余的部分嵌入到IPv6前缀中。
命令:
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情书的口头禅了:这很关键!)。
#配置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#配置BR设备
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#在CE设备测试连通性:
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--- 2012:db8:c0a8:9388::1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4065ms
rtt min/avg/max/mdev = 0.606/0.897/1.642/0.376 ms#在BR设备创建一个IPv6/IPv4 Internet
ip link del kaliBr0
ip link add dev kaliBr0 type bridge
ip link set kaliBr0 up
ip -6 addr add 2233:ccc::1/64 dev kaliBr0#在CE设备测试连通性:
root@kalimk:~# ping6 2233:ccc::1
PING 2233:ccc::1(2233:ccc::1) 56 data bytes
64 bytes from 2233:ccc::1: icmp_seq=1 ttl=64 time=0.723 ms
64 bytes from 2233:ccc::1: icmp_seq=2 ttl=64 time=0.424 ms
64 bytes from 2233:ccc::1: icmp_seq=3 ttl=64 time=0.722 ms
64 bytes from 2233:ccc::1: icmp_seq=4 ttl=64 time=1.69 ms
64 bytes from 2233:ccc::1: icmp_seq=5 ttl=64 time=0.887 ms
64 bytes from 2233:ccc::1: icmp_seq=6 ttl=64 time=1.62 ms
64 bytes from 2233:ccc::1: icmp_seq=7 ttl=64 time=0.603 ms
64 bytes from 2233:ccc::1: icmp_seq=8 ttl=64 time=0.642 ms
64 bytes from 2233:ccc::1: icmp_seq=9 ttl=64 time=0.596 ms
64 bytes from 2233:ccc::1: icmp_seq=10 ttl=64 time=0.677 ms--- 2233:ccc::1 ping statistics ---
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镜像包(也即是界面中的路由器、交换机):
- 百度云盘:https://pan.baidu.com/s/1WnIcOE9Qo27yHIMMgtxPuw 提取码: 3bt8
- 其他地址:http://srijit.com/working-cisco-ios-gns3/
当需要搭建与外部通信(如:宿主机,Internet网)时,所使用到的GNS3虚拟机,
根据自己的需要下载匹配的版本:https://gns3.com/software/download-vm
(后续,更新在百度云盘中…)
其他:https://github.com/GNS3;github GNS3项目托管。
2.2 GNS3使用时常用操作
2.2.1 导入IOS镜像包
注:这里需要使用到IOS image文件,自己记得在前面提供的下载方式中去下载。
步骤1:点击菜单栏,Edit --> Preferences
步骤2:点击 New
步骤3:点击Next,选择我们已经下载好的IOS image文件,完成加载,其他默认即可,自己可以按需配置,作为新手的我,都是默认选项。
在选择Network Adapters时,可以根据自己的需求来增加一个槽。
如: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
默认配置即可,再点击Next Next,直到界面:
如果界面VM name的下拉框中,没有GNS3 VM,这是因为,你没有将之前下载的GNS3 VM 虚拟机加载到VMware中。相应的操作如下:
来完成GNS VM虚拟机的导入(当前我使用的VMware, Virtual Box的用户自行实验)。
再次GNS VM界面的Refresh按钮刷新,即可看到GNS3 VM的选项。点击Next直到Finish。
最后,最后:
重启GNS3软件,GNS3 VM会自动跟随启动的。
如果一切正常,VM虚拟机有如下界面弹出:
键入Enter键后,弹出的界面:
目前而言,主要关注的是:
- Shell: Open a shell #启动一个shell命令行
- Network: Configure network settings # 配置网络IP地址等相关信息,配置后,虚拟机将会自动重启。
有个小疑问:进入到shell后,怎么再次回到这个界面,没有办法。
注:设备中,需要使用ip 等命令,或执行命令时,提示无权限时,记得在命令前加:sudo 关键字。
2.2.3 连接网线
启动GNS3软件,创建一个项目:File New blank project。
点击图中1出的路由器图标,在旁边就会列出,我们之前所加载的IOS image对应的路由器设备。
选择对应的路由器,将其拖拽到图中2旁边的空白区域,进行编辑,连接网线。上图中的【云朵图标】在图中1处的显示器图片栏目下面:
连接网线:
启动路由器,并进入命令行:
右键,需要启动的路由器,如:6r_br_router,选择start;再双击设备,即可进入命令行:
2.3 配置6rd
现在,终于可以开始搭建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 中去配置的。
确保6r_br_route和6r_ce_router的互通性:
如果不能正常ping通,可以配置arpa来完成:
arp 192.168.1.10 000c.291f.1598 ARPA
arp 目的地址 吓一跳MAC地址 ARPA
6rd_br_router的配置如下:
interface Tunnel1no ip addressno ip redirectsIPv6 address 2001:DB80:A0A::1/48tunnel source GigabitEthernet0/0tunnel mode IPv6ip 6rdtunnel 6rd IPv4 prefix-len 16tunnel 6rd prefix 2001:DB80::/32
!
interface Ethernet0/0no ip addressshutdownduplex auto
!
interface GigabitEthernet0/0ip address 192.168.10.10 255.255.255.0duplex fullspeed 1000media-type gbicnegotiation 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 Tunnel1no ip addressno ip redirectsIPv6 address 2001:DB80:10A::1/48tunnel source GigabitEthernet0/0tunnel mode IPv6ip 6rdtunnel 6rd IPv4 prefix-len 16tunnel 6rd prefix 2001:DB80::/32tunnel 6rd br 192.168.10.10
!
interface Ethernet0/0no ip addressshutdownduplex auto
!
interface GigabitEthernet0/0ip address 192.168.1.10 255.255.255.0duplex fullspeed 1000media-type gbicnegotiation 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