实现简单的路由器

一、配置环境

1.安装所需工具

sudo apt-get update

sudo apt-get install -y git vim-noxpython-setuptools python-all-dev flex bison traceroute


实现简单的路由器_第1张图片 实现简单的路由器_第2张图片

2.检查mininet版本号

git checkout remotes/origin/class/cs244


执行./util/install.sh -fnv 即安装openflow,更新其配置


3.检查pox版本号

git checkout f95dd1a81584d716823bbf565fa68254416af603


实现简单的路由器_第3张图片

3.检查pox版本号

git checkout f95dd1a81584d716823bbf565fa68254416af603

4.安装ltprotocol

cd ~

git clonegit://github.com/dound/ltprotocol.git

cd ltprotocol

sudo python setup.py install

实现简单的路由器_第4张图片


二、配置路由器

1.从斯坦福网站上下载相应代码

cd ~

git clonehttps://huangty@bitbucket.org/huangty/cs144_lab3.git

cd cs144_lab3/

git checkout --trackremotes/origin/standalone

实现简单的路由器_第5张图片

2.安装简单路由器pox的模块并配置环境

cd ~/cs144_lab3

./config.sh

实现简单的路由器_第6张图片

中间在安装某几个模块时(比如incremental模块)会有无数的warning提醒在某目录中找不到对应匹配的文件,所以在后面要对应的安装三个包。

实现简单的路由器_第7张图片

有两个配置文档:

~/cs144_lab3/IP_CONFIG

实现简单的路由器_第8张图片

该文档列出了分配给server1,server2,client的IP地址和路由器与之相连的网关的IP地址。可以看到,构建的简单拓扑如下:

实现简单的路由器_第9张图片

~/cs144_lab3/router/rtable

该文档显示的是路由表,列出了IP地址,子网掩码和对应的网关编号(这条路由的网络出口)

3.测试仿真拓扑结构的可连接性

> ./run_mininet.sh

实现简单的路由器_第10张图片

保持这个终端始终打开,新建另一个终端尝试pox连接来运行控制器:
> cd ~/cs144_lab3/

> ln -s ../pox

> ./run_pox.sh

结果发生报错,提示没有安装incremental包

运行sudo pip installincremental,安装包,然后重新./run_pox.sh,他会再提示没有安装其他的包,同上继续安装 sudo pip install XXX,直到不报错位置。

总共安装了三个包:zope.interface,incremental, constantly后, ./run_pox.sh得到结果如下:

实现简单的路由器_第11张图片

这代表环境已经配置成功。

4.测试环境的连接性

> ./sr_solution

可以看到结果和之前的rtable和IP_CONFIG是一样的

实现简单的路由器_第12张图片

5.在之前运行的mininet的终端尝试从client  ping  Server1,观察是否可以ping通以及pox终端的反应:

mininet> client ping -c 3192.168.2.2

实现简单的路由器_第13张图片

可以看到,三个包全部接收成功,其中第一个包的时间最长,后面的时间变短。

观察运行./sr_solution的界面,可以看到每个包的发出信息和接收信息,包括:版本号,头长度,服务类型,长度,ID编号,碎片标识,偏移量,生命周期,校验和,源地址,目的地址。

实现简单的路由器_第14张图片 实现简单的路由器_第15张图片 实现简单的路由器_第16张图片

6. 用traceroute检测一下发出数据包的client到Server1之间所经过的网关数量

mininet>client traceroute -n 192.168.2.2

可以看到经过了两个网关10.0.1.1和192.168.2.2,后面显示的分别是三个数据包经过网关的时间。

7.测试一下server1和server2之间是否可以工作,发送htto请求进行测试

mininet> client wgethttp://192.168.2.2

实现简单的路由器_第17张图片

可以看到,server1和server2可以连接上,发送http请求后对方可以接受到

8.尝试关闭./sr_solution,就会发现无论是ping/traceroute/wget都不会再成功


实现简单的路由器_第18张图片


三、开始运行路由器

1.运行源代码

> cd ~/cs144_lab3/router/

> make

>./sr

实现简单的路由器_第19张图片

实现简单的路由器_第20张图片

其结果和> ./sr_solution一样,均反映了rtable和IP_CONFIG的内容。

2.记录接收到的packets

> ./sr -l logname.pcap

其结果与> >./sr效果一致,当./run_mininet.sh时,会接收到很多包的长度:

实现简单的路由器_第21张图片

用wireshark测试回环接口,可得如下图结果:

实现简单的路由器_第22张图片

3.可以直接监听每一个节点,以server1为例

可以通过如下监听server1:
mininet> server1 sudo tcpdump -n -i server1-eth0


也可以重新打开一个server1节点的窗口进行监听

mininet> xterm server1

> sudo tcpdump -n -i server1-eth0

开始监听

然后,在新终端中打开./sr_solution,在原mininet终端用client去pingserver1

>client ping -c 3 server1

实现简单的路由器_第23张图片

可以看到三个数据包接收成功,观察正在监听server1的端口:

实现简单的路由器_第24张图片

可以看到,最初是广播,以ARP协议询问谁有192.168.2.2(Server1),告诉192.168.2.1(网关),然后以ARP协议回复192.168.2.2的MAC地址。后面开始进行client和server1的传数据包的工作,以ICMP进行。

四、使用mininet构建简单的路由实验

使用mininet构建一个简单的路由实验,在桌面建立Router.py文件:

from mininet.topo import Topo

class Router_Topo(Topo):

   def __init__(self):

       "Create P2P topology."

       # Initialize topology

       Topo.__init__(self)

       # Add hosts and switches

       H1 = self.addHost('h1')

       H2 = self.addHost('h2')

       H3 = self.addHost('h3')

       S1 = self.addSwitch('s1')

       S2 = self.addSwitch('s2')

       # Add links

       self.addLink(H1, S1)

       self.addLink(H2, S1)

       self.addLink(H2, S2)

       self.addLink(H3, S2)

topos = {

       'router': (lambda: Router_Topo())

}

拓扑结构如下:


实现简单的路由器_第25张图片


实现简单的路由器_第26张图片

为节点配置路由功能如下:

实现简单的路由器_第27张图片

实现简单的路由器_第28张图片

则进行h1 ping h3可以ping通

mininet> h1 ping -c 1 192.168.23.3

实现简单的路由器_第29张图片





你可能感兴趣的:(SDN)