mininet(一)实验环境搭建

mininet(二)简单的路由实验

mininet(三)简单的NAT实验

本次实验拓扑图如下:



假设 Openvswitch switch1是一个带有NAT功能的路由器,H1 的IP地址为 192.168.1.10,MAC地址为:00:00:00:00:00:01, H2 的IP地址为 10.0.0.1 MAC 地址为 00:00:00:00:00:02。私有网络的默认网关为: 192.168.1.1。公网默认网关为: 10.0.0.2。 在H1发送IP报文给H2的时候首先会发送ARP报文查询192.168.1.1的MAC地址,需要OpenVswitch发送 ARP回复报文给H1,H1收到网关的MAC后会将报文发送给switch。

nat.py

  1. #!/usr/bin/python
  2. from mininet.net import Mininet
  3. from mininet.node import Controller, RemoteController, OVSKernelSwitch
  4. from mininet.link import Link, TCLink
  5. from mininet.cli import CLI
  6. from mininet.log import setLogLevel
  7. def topology():
  8. net = Mininet( controller=RemoteController, link=TCLink, switch=OVSKernelSwitch )
  9. print "*** Creating nodes"
  10. h1 = net.addHost( 'h1', mac='00:00:00:00:00:01', ip='192.168.1.10/24' )
  11. h2 = net.addHost( 'h2', mac='00:00:00:00:00:02', ip='10.0.0.1/24' )
  12. s1 = net.addSwitch( 's1', protocols='OpenFlow10', listenPort=6673)
  13. c1 = net.addController( 'c1', ip='127.0.0.1', port=6633 )
  14. print "*** Creating links"
  15. net.addLink(h1, s1)
  16. net.addLink(h2, s1)
  17. print "*** Starting network"
  18. net.build()
  19. c1.start()
  20. s1.start( [c1] )
  21. print "*** Running CLI"
  22. h1.cmd("ip route add default via 192.168.1.1 dev h1-eth0")
  23. h2.cmd("ip route add default via 10.0.0.2 dev h2-eth0")
  24. CLI( net )
  25. print "*** Stopping network"
  26. net.stop()
  27. if __name__ == '__main__':
  28. setLogLevel( 'info' )
  29. topology()

mypox.py

  1. #!/usr/bin/python
  2. from pox.core import core
  3. from pox.lib.addresses import IPAddr
  4. from pox.lib.addresses import EthAddr
  5. import pox.openflow.libopenflow_01 as of
  6. from pox.lib.util import dpid_to_str, str_to_bool
  7. from pox.lib.packet.arp import arp
  8. from pox.lib.packet.ethernet import ethernet, ETHER_BROADCAST
  9. log = core.getLogger()
  10. #flow2:
  11. switch2 = 0000000000000001
  12. flow2msg = of.ofp_flow_mod(command=0) #add flow rules
  13. flow2msg.cookie = 0
  14. flow2msg.match.in_port = 1 # match in port,the index of the switch
  15. flow2msg.match.dl_type = 0x0800 # match ipv4 protcol
  16. flow2msg.match.nw_src = IPAddr("192.168.1.10") # match src ip 192.168.1.10
  17. # ACTIONS---------------------------------
  18. flow2out = of.ofp_action_output (port = 2)
  19. flow2srcIP = of.ofp_action_nw_addr.set_src(IPAddr("10.0.0.2")) # set src ip to 10.0.0.2
  20. flow2srcMAC = of.ofp_action_dl_addr.set_src(EthAddr("00:00:00:00:00:04")) # set src mac 00.**.04
  21. flow2dstMAC = of.ofp_action_dl_addr.set_dst(EthAddr("00:00:00:00:00:02")) # set dst mac 00.**.01 host2
  22. flow2msg.actions = [flow2srcIP, flow2srcMAC, flow2dstMAC, flow2out]
  23. #flow3:
  24. switch3 = 0000000000000001
  25. flow3msg = of.ofp_flow_mod(command=0)#add flow rules
  26. flow3msg.cookie = 0
  27. flow3msg.match.in_port = 2 # match in port,the index of the switch
  28. flow3msg.match.dl_type = 0x0800
  29. flow3msg.match.nw_dst = IPAddr("10.0.0.2") # match dst ip 10.0.0.2
  30. # ACTIONS---------------------------------
  31. flow3out = of.ofp_action_output (port = 1)
  32. flow3dstIP = of.ofp_action_nw_addr.set_dst(IPAddr("192.168.1.10")) # set dst ip to 192.168.1.10
  33. flow3srcMAC = of.ofp_action_dl_addr.set_src(EthAddr("00:00:00:00:00:03")) # #set src mac to 00.**.03
  34. flow3dstMAC = of.ofp_action_dl_addr.set_dst(EthAddr("00:00:00:00:00:01")) # set dst mac to 00.**.01
  35. flow3msg.actions = [flow3dstIP, flow3srcMAC, flow3dstMAC, flow3out]
  36. def install_flows():
  37. log.info(" *** Installing static flows... ***")
  38. # Push flows to switches
  39. core.openflow.sendToDPID(switch2, flow2msg)
  40. core.openflow.sendToDPID(switch3, flow3msg)
  41. log.info(" *** Static flows installed. ***")
  42. def _handle_ConnectionUp (event):
  43. log.info("*** install flows ***")
  44. install_flows()
  45. def _handle_PacketIn (event):
  46. #log.info("*** _handle_PacketIn... ***")
  47. dpid = event.connection.dpid
  48. inport = event.port
  49. packet = event.parsed
  50. if not packet.parsed:
  51. log.warning("%i %i ignoring unparsed packet", dpid, inport)
  52. return
  53. a = packet.find('arp')
  54. if not a: return
  55. log.info("%s ARP %s %s => %s", dpid_to_str(dpid),
  56. {arp.REQUEST:"request",arp.REPLY:"reply"}.get(a.opcode,
  57. 'op:%i' % (a.opcode,)), str(a.protosrc), str(a.protodst))
  58. if a.prototype == arp.PROTO_TYPE_IP and a.hwtype == arp.HW_TYPE_ETHERNET and a.opcode == arp.REQUEST:
  59. r = arp()
  60. r.hwtype = a.hwtype
  61. r.prototype = a.prototype
  62. r.hwlen = a.hwlen
  63. r.protolen = a.protolen
  64. r.opcode = arp.REPLY
  65. r.hwdst = a.hwsrc
  66. r.protodst = a.protosrc
  67. r.protosrc = a.protodst
  68. if str(a.protodst)=="192.168.1.1":
  69. r.hwsrc = EthAddr("00:00:00:00:00:03")
  70. if str(a.protodst)=="10.0.0.2":
  71. r.hwsrc = EthAddr("00:00:00:00:00:04")
  72. e = ethernet(type=packet.type, src=r.hwsrc,
  73. dst=a.hwsrc)
  74. e.payload = r
  75. log.info("%s answering ARP for %s" % (dpid_to_str(dpid),
  76. str(r.protosrc)))
  77. msg = of.ofp_packet_out()
  78. msg.data = e.pack()
  79. msg.actions.append(of.ofp_action_output(port = of.OFPP_IN_PORT))
  80. msg.in_port = inport
  81. event.connection.send(msg)
  82. def launch ():
  83. log.info("*** Starting... ***")
  84. log.info("*** Waiting for switches to connect.. ***")
  85. core.openflow.addListenerByName("ConnectionUp", _handle_ConnectionUp)
  86. core.openflow.addListenerByName("PacketIn", _handle_PacketIn)

两条规则说明

1、从交换机1口进,并且源ip为 192.168.1.10,将报文的源ip修改为10.0.0.2,源mac修改为00:00:00:00:00:04,修改目的为00:00:00:00:00:02(主机h2的mac)

2、从交换机2口进,并且目的ip为10.0.0.2,将报文的目的ip修改为192.168.1.10,源mac修改为00:00:00:00:00:03,修改目的为00:00:00:00:00:01(主机h1的mac)

实验结果:

  1. mininet@mininet-vm:~/pox$ ./pox.py mypox
  2. POX 0.2.0 (carp) / Copyright 2011-2013 James McCauley, et al.
  3. INFO:mypox:*** Starting... ***
  4. INFO:mypox:*** Waiting for switches to connect.. ***
  5. INFO:core:POX 0.2.0 (carp) is up.
  6. INFO:openflow.of_01:[None 1] closed
  7. INFO:openflow.of_01:[00-00-00-00-00-01 2] connected
  8. INFO:mypox:*** install flows ***
  9. INFO:mypox: *** Installing static flows... ***
  10. INFO:mypox: *** Static flows installed. ***
  11. INFO:openflow.of_01:[00-00-00-00-00-02 3] connected
  12. INFO:mypox:*** install flows ***
  13. INFO:mypox: *** Installing static flows... ***
  14. INFO:mypox: *** Static flows installed. ***
  15. INFO:mypox:00-00-00-00-00-01 ARP request 192.168.1.10 => 192.168.1.1
  16. INFO:mypox:00-00-00-00-00-01 answering ARP for 192.168.1.1
  17. INFO:mypox:00-00-00-00-00-01 ARP request 10.0.0.1 => 10.0.0.2
  18. INFO:mypox:00-00-00-00-00-01 answering ARP for 10.0.0.2
  1. mininet@mininet-vm:~$ sudo python nat.py
  2. *** Creating nodes
  3. *** Creating links
  4. *** Starting network
  5. *** Configuring hosts
  6. h1 h2
  7. *** Running CLI
  8. *** Starting CLI:
  9. mininet> h1 ping h2 -c 4
  10. PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
  11. 64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=39.6 ms
  12. 64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.082 ms
  13. 64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.063 ms
  14. 64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=0.055 ms
  15. --- 10.0.0.1 ping statistics ---
  16. 4 packets transmitted, 4 received, 0% packet loss, time 3074ms
  17. rtt min/avg/max/mdev = 0.055/9.960/39.643/17.137 ms

在h1上面抓包可以看到的是192.168.1.10 -> 10.0.0.1

在h2上面抓包可以看到的是 10.0.0.2 -> 10.0.0.1

mininet(三)简单的NAT实验的更多相关文章

  1. mininet(二)简单的路由实验

    mininet(一)实验环境搭建 mininet(二)简单的路由实验 mininet(三)简单的NAT实验 在网上找了 好几个代码都是不能直接复现成功,这里把自己实现成功的代码给大家演示一下. 实验的 ...

  2. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  3. MySQL之单表查询 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER BY 八 限制查询的记录数:LIMIT 九 使用正则表达式查询

    MySQL之单表查询 阅读目录 一 单表查询的语法 二 关键字的执行优先级(重点) 三 简单查询 四 WHERE约束 五 分组查询:GROUP BY 六 HAVING过滤 七 查询排序:ORDER B ...

  4. BeagleBone Black板第四课:简单LED控制实验

    BBB板第四课:简单LED控制实验 学习BBB板的终于目的是想像单片机一样做控制,但控制思路全然不一样(Linux下控制硬件设备实质就是对相关设备虚拟文件的读写).研究了几天头都大了还是没有进展,网上 ...

  5. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  6. grpc使用记录(三)简单异步服务实例

    目录 grpc使用记录(三)简单异步服务实例 1.编写proto文件,定义服务 2.编译proto文件,生成代码 3.编写服务端代码 async_service.cpp async_service2. ...

  7. Java实验项目三——简单工厂模式

    Program: 请采用采用简单工厂设计模式,为某个汽车销售店设计汽车销售系统,接口car至少有方法print(), 三个汽车类:宝马.奥迪.大众 (属性:品牌,价格),在测试类中根据客户要求购买的汽 ...

  8. Mininet系列实验(六):Mininet动态改变转发规则实验

    一. 实验目的 熟悉Mininet自定义拓扑脚本的编写:熟悉编写POX脚本动态改变转发规则 二.实验原理 在SDN环境中,控制器可以通过对交换机下发流表操作来控制交换机的转发行为.在本实验中,基于Mi ...

  9. CCNP第三天 EIGRP综合实验

    实验题如图所示:其中R2连R3 R5为快速以太网线,其他均为串线,帧中继默认是富曼斯(全连网状结构),即所有接入的路由之间的PVC都已经打通,所有  要关闭R5和R8的逆向arp功能,来手工配置R5到 ...

随机推荐

  1. 字符串模拟大数相加——Java实现

    本题是CVTE二面编程题,首先考虑返回值肯定是一个字符串(int会有溢出可能),并且两个字符串只含数字,不含”+“.”-“这种. 代码如下: public static String add(Stri ...

  2. EFK教程 - ElasticSearch高性能高可用架构

    通过将elasticsearch的data.ingest.master角色进行分离,搭建起高性能+高可用的ES架构 作者:"发颠的小狼",欢迎转载与投稿 目录 ▪ 用途 ▪ 架构 ...

  3. H5+app,自动更新后自动删除安装包

    H5+app 自动删除安装包 一.前言 之前做好的app自动更新,遗留下了一个问题,就是自动更新后安装包没有自行删除掉. 好像现在的手机的系统是有安装完自动清理安装包的.想我这个H5+的app安装完后 ...

  4. 微信小程序this.data和this.setData({})的区别

    this.data.xx是用来获取页面data对象的----------只是js(逻辑层)数据的更改: this.setData是用来更新界面的---------用于更新view层的.

  5. Swoole和Redis实现的并发队列处理系统

    由于PHP不支持多线程,但是作为一个完善的系统,有很多操作都是需要异步完成的.为了完成这些异步操作,我们做了一个基于Redis队列任务系统. 大家知道,一个消息队列处理系统主要分为两大部分:消费者和生 ...

  6. gitbook 入门教程之一招彻底解决 favicon 图标失效问题

    favicon-absolute 项目 favicon-absolute 插件采用绝对路径设置网站 favicon 图标,相对于相对路径来说更加简单方便.

  7. vim光标移动、跳转

    这里记载我用到并需要下次会用的vim快捷键 vim的三个模式:命令行模式.插入模式.底行模式 从命令模式到插入模式: a 光标后输入 A 行尾输入 i 光标前输入 I 行首输入 o 上一行输入 O 下 ...

  8. SpringBoot让你的Bean动起来(自定义参数解析HandlerMethodArgumentResolver)

    SpringBoot让你的Bean动起来(自定义参数解析HandlerMethodArgumentResolver) 简介 我们 Controller 用到的一些 Bean 需要通过一定的方式去获取的 ...

  9. vue中自定义html文件的模板

    如果默认生成的 HTML 文件不适合需求,可以创建/使用自定义模板. 一是通过 inject 选项,然后传递给定制的 HTML 文件.html-webpack-plugin 将会自动注入所有需要的 C ...

  10. centos 生成网卡UUID

    在Linux或CentOS中,可以通过如下命令获取网卡的uuid信息: uuidgen 网卡名07d07031-eb0f-4691-8606-befb46645433 查看网卡UUID nmcli c ...