本文基于 网络操作系统VyOS应用实践(四) 修改,完善了实验细节及1-to-1 NAT部分。

NAT

NAT即网络地址转换,最常见的就是各种虚拟机工具的NAT模式,让虚拟机以宿主的网络地址与外网通讯,内网主机发送数据时,内网的地址将会被转换为运行NAT服务的主机的地址,内网主机都以该主机地址为代表与外界沟通。

原理的确很简单,接下来将会通过实验,操作VyOS进行NAT实验。

下图为本实验的基本拓扑:

实验拓扑

实验拓扑图

网络拓扑

实验环境是GSN3

网络拓扑图

SNAT

SNAT是把内网的地址转换为NAT服务的宿主的地址进行对外访问,在实际运作时,SNAT修改离开internal的包的源地址,VyOS支持两种配置方式,一种是用出口接口(上图VyOS连接external的接口)上的地址作为全局的外网地址,另一种方式是手动设置,可以设置一个范围,出口时用其中一个地址。

在DHCP环境下,SNAT应该选择前者,即设置为MASQUERADE

下面的实验会使用MASQUERADE方式,设置完毕后,会通过发送ICMP包,然后通过wireshark抓包验证SNAT的配置。

在VMware上配置好4个虚拟机后,登陆VyOS开始设置:

一般,配置SNAT需要知道以下内容(或者说设置SNAT的步骤):

  • 1.我们想转换的内网IP
  • 2.使用哪个接口作为出口接口
  • 3.使用哪个外网地址作为转换目标

对于上面的问题,本实验中的答案是:

  • 1.需要转换的源地址为192.168.225.3与192.168.225.4
  • 2.使用VyOS的eth1接口作为出口接口(我的设置中,eth1连接到192.168.10.3/24)
  • 3.使用masquerade

在本例中,我们使用masquerade(含义:伪装)作为转换地址,而不是IP地址。masquerade目标实际上是一个别名,表示“使用出口接口上的任何IP地址”,而不是静态配置的IP地址。如果您使用DHCP作为传出接口,并且不知道外部地址是什么,这将非常有用。

下面我们开始实验:

设定IP及网关

  • vyos 设定端口
vyos@vyos:~$ configure
[edit]
vyos@vyos# set interfaces ethernet eth1 address '192.168.10.2/24'
vyos@vyos# set interfaces ethernet eth2 address '192.168.225.2/24'
  • PC-1 设定IP/网关
ip 192.168.225.3/24 192.168.225.2
  • PC-2 设定IP/网关
ip 192.168.225.4/24 192.168.225.2
  • PC-3 设定IP/网关
ip 192.168.10.3/24 192.168.10.2

先测验未启用SNAT情况

下图没有启用SNAT,vyos仅仅起到路由的作用

可以看到在external区域抓到的包的source(右图第一行)还是192.168.225.3,而返回的包中,destination也还是192.168.225.3。

PC-1> ping 192.168.10.3
192.168.10.3 icmp_seq=1 timeout
192.168.10.3 icmp_seq=2 timeout
84 bytes from 192.168.10.3 icmp_seq=3 ttl=63 time=6.000 ms
84 bytes from 192.168.10.3 icmp_seq=4 ttl=63 time=5.000 ms
84 bytes from 192.168.10.3 icmp_seq=5 ttl=63 time=3.500 ms

启用SNAT

先为vm1设置一个rule(和防火墙类似,以rule定义规则):

vyos@vyos:~$ configure
[edit]
vyos@vyos# set nat source rule 10 outbound-interface 'eth1'
[edit]
vyos@vyos# set nat source rule 10 source address '192.168.225.3/24'
[edit]
vyos@vyos# set nat source rule 10 translation address 'masquerade'

再用类似的方法为vm2设置rule:

vyos@vyos# set nat source rule 11 outbound-interface 'eth1'
[edit]
vyos@vyos# set nat source rule 11 source address '192.168.225.4/24'
[edit]
vyos@vyos# set nat source rule 11 translation address 'masquerade'

commit并且保存,这样一来就完成了SNAT的设置,接着,我们通过wireshark进行验证,证明SNAT起了作用:

这幅图是启用了SNAT的单个ICMP包的抓包结果:

上图左边的是internal的抓包结果,右边的是external的结果。

可以看到,由vm1发出的ICMP包,一开始的source是192.168.225.3,然后在external区域抓到的包是已经被修改过source的包,因为使用了MASQUERADE,所以external中抓到的包的source是192.168.10.2,即vyos的eth1接口。然后在返回的包中(即右图第二行),destination是192.168.10.2而不是192.168.225.3,最后通过转换,internal区域中抓到的包的destination是192.168.225.3。

这就是启用SNAT和不启用SNAT的区别。

关于设置NAT时的注意事项:

如果内部网络有很多节点需要使用SNAT,VyOS官方建议每256个节点就使用一个外部IP地址进行NAT。如果有8000个节点,那么就需要32个外部IP地址才够。

DNAT

DNAT主要是用于隐藏内部网络的机器的真实地址,DNAT的原理是修改目标地址和端口。外部节点访问内部节点时,目标地址是运行NAT服务的节点的外网地址,DNAT接受数据后,会修改数据包的目标地址,改为内网节点的地址。

网络拓扑

实验环境是GSN3,为了方便测试python,我们将pc-2pc-3换成vyos的虚机。

网络拓扑图

实验目标:

假设在我的internal网络里有一个节点运行xmlrpc服务,但为了安全,我不想直接把该节点暴露给external区域,此时,可以使用防火墙加DNAT实现我的目的。

思路:

vm2运行xmlrpc服务,vm3运行客户端。使用防火墙,限制vm3只能通过端口1800访问XMLRPC服务器,同时启用DNAT,隐藏vm2的地址,只暴露vyos的eth1接口的地址。

设定IP及网关

  • VM-2 设定IP/网关
set interfaces ethernet eth1 address '192.168.225.4/24'
# 不设置下面的内容,无法访问到另一个端口地址,即192.168.10.2
set protocols static route 0.0.0.0/0 next-hop 192.168.225.2
  • VM-3 设定IP/网关
set interfaces ethernet eth1 address '192.168.10.3/24'
set protocols static route 0.0.0.0/0 next-hop 192.168.10.2
  • vyos 设定端口
vyos@vyos:~$ configure
[edit]
vyos@vyos# set interfaces ethernet eth1 address '192.168.10.2/24'
vyos@vyos# set interfaces ethernet eth2 address '192.168.225.5/24'

设定防火墙

首先,我们先进行防火墙设置。先划分区域,创建internal和external区域:

vyos-1

vyos@vyos# set zone-policy zone IN description "Internal zone"
[edit]
vyos@vyos# set zone-policy zone EX description "External zone"
[edit]

然后把eth0划分给区域IN,eth1划分给EX:

vyos@vyos# set zone-policy zone IN interface eth0
[edit]
vyos@vyos# set zone-policy zone EX interface eth1

然后开始根据目的设置防火墙规则,这里,默认的规则为reject:

vyos@vyos# set firewall name EX-TO-IN default-action reject
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 1 action accept
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 1 state established enable
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 1 state related enable
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 10 action accept
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 10 destination port 1800
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 10 source address 192.168.10.3
[edit]
vyos@vyos# set firewall name EX-TO-IN rule 10 protocol tcp

再设置一个返回数据的规则:

vyos@vyos# set firewall name IN-TO-EX default-action reject
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 1 action accept
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 1 state established enable
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 1 state related enable
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 10 action accept
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 10 source port 1800
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 10 source address 192.168.225.4
[edit]
vyos@vyos# set firewall name IN-TO-EX rule 10 protocol tcp

应用两组规则:

vyos@vyos# set zone-policy zone IN from EX firewall name EX-TO-IN
[edit]
vyos@vyos# set zone-policy zone EX from IN firewall name IN-TO-EX

xmlrpc客户端可以正确运作:

上面的实验内容仅仅满足了安全性,只允许来自192.168.10.3这个可信节点的客户端访问1800端口,但是连接的时候还是直接用vm2的真实地址的,我们还需要设置DNAT进行地址隐藏。

然后进行DNAT的设置。

启用DNAT

在vyos中,设置DNAT和SNAT的方法和步骤略有不同,其步骤一般是:

  • 1.知道数据会从哪个接口进来
  • 2.要转发的是什么协议,端口号是什么
  • 3.要转发的目标内网节点地址

对于上面的问题,本实验中的答案是:

  • 1.从eth1接口进入
  • 2.端口为1800,TCP协议
  • 3.目标地址为vm2的地址,即192.168.225.4

登陆vyos进行DNAT的设置:

vyos@vyos# set nat destination rule 10 destination port '1800'
[edit]
vyos@vyos# set nat destination rule 10 inbound-interface 'eth1'
[edit]
vyos@vyos# set nat destination rule 10 protocol 'tcp'
[edit]
vyos@vyos# set nat destination rule 10 translation address '192.168.225.4'
[edit]

现在,登入vm3,改变serverproxy的地址,调用XMLRPC并抓包:

上图,我使用了vyos暴露在外的192.168.10.2这个地址,xmlrpc服务也成功地返回了结果。

检查抓包结果:

我们先分析右图,第4行,源地址为192.168.10.3,目标地址为192.168.10.2,可以看到客户端先把数据发到vyos的eth1接口上,然后看左图第四行,现在,destination已经变成了192.168.225.4。

左图第6行开始返回数据,source是vm2的地址,然而到了右图,source已经不再是192.168.225.4而是192.168.10.2。可以看到,DNAT的确是起到了隐藏vm2的真实地址的作用,那么一来,最初的目的就达到了。

可以看到,DNAT其实有点接近防火墙的功能,不是单单地进行地址转换,还对协议和端口进行了限制。

1-to-1 NAT

另一个常用于DNAT的术语是1-to-1 NAT 。对于1-to-1 NAT配置,dnat和snat都用于将外部IP地址到内部IP地址之间的所有通信进行NAT,反之亦然。

通常,1对1的NAT规则会忽略目标端口(所有端口),并用all或ip替换协议。

然后创对应的SNAT规则,设定NAT,用于内部IP到保留的外部IP流通。这便可以外部IP地址专用于内部IP地址,对于不具有端口概念的协议(如GRE)非常有用。

网络拓扑

设定IP及网关

  • PC-1 设定IP/网关
ip 192.168.225.3/24 192.168.225.2
  • PC-2 设定IP/网关
ip 192.168.10.3/24 192.168.10.2
  • vyos设定ip
vyos@vyos:~$ configure
[edit]
set interfaces ethernet eth2 address '192.168.225.2/24'
set interfaces ethernet eth2 description 'Inside interface'
set interfaces ethernet eth1 address '192.168.10.2/24'
set interfaces ethernet eth1 description 'Outside interface'

设定 1-to-1 NAT

set nat destination rule 2000 description '1-to-1 NAT example'
set nat destination rule 2000 destination address '192.168.10.2'
set nat destination rule 2000 inbound-interface 'eth1'
set nat destination rule 2000 translation address '192.168.225.3'
set nat source rule 2000 description '1-to-1 NAT example'
set nat source rule 2000 outbound-interface 'eth1'
set nat source rule 2000 source address '192.168.225.3'
set nat source rule 2000 translation address '192.168.10.2'

PC-1 ping PC-2

PC-1上执行如下命令:

PC-1> ping 192.168.10.3
84 bytes from 192.168.10.3 icmp_seq=1 ttl=63 time=10.000 ms
84 bytes from 192.168.10.3 icmp_seq=2 ttl=63 time=5.500 ms
84 bytes from 192.168.10.3 icmp_seq=3 ttl=63 time=4.000 ms
84 bytes from 192.168.10.3 icmp_seq=4 ttl=63 time=5.000 ms
84 bytes from 192.168.10.3 icmp_seq=5 ttl=63 time=2.500 ms

抓包Ethernetswitch-2 to PC-2



可以发现,原地址192.168.225.3已经变成了192.168.10.2

PC-2 ping PC-1

PC-2 在不知道 PC-1地址的情况下,可以通过访问192.168.10.2来访问PC-1

PC-2> ping 192.168.10.2
84 bytes from 192.168.10.2 icmp_seq=1 ttl=63 time=6.000 ms
84 bytes from 192.168.10.2 icmp_seq=2 ttl=63 time=5.500 ms
84 bytes from 192.168.10.2 icmp_seq=3 ttl=63 time=3.500 ms
84 bytes from 192.168.10.2 icmp_seq=4 ttl=63 time=6.500 ms
84 bytes from 192.168.10.2 icmp_seq=5 ttl=63 time=6.000 ms

抓包Ethernetswitch-1 to PC-1



可以发现,原地址192.168.10.2已经变成了192.168.225.3

网络操作系统VyOS之NAT实践的更多相关文章

  1. 开源网络操作系统--VyOS

    User Guide Jump to: navigation, search Contents 1 Introduction 2 Installation 3 Using the Command-Li ...

  2. VNF网络性能提升解决方案及实践

    VNF网络性能提升解决方案及实践 2016年7月 作者:    王智民 贡献者:     创建时间:    2016-7-20 稳定程度:    初稿 修改历史 版本 日期 修订人 说明 1.0 20 ...

  3. 嵌入式实时操作系统μCOS原理与实践任务控制与时间的解析

    /*************************************************************************************************** ...

  4. 实例讲解虚拟机3种网络模式(桥接、nat、Host-only)

    转自:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html 前言 很多人安装虚拟机的时候,经常遇到不能上网的问题,而vmwa ...

  5. 20145312袁心《网络对抗》Web基础实践

    20145312袁心<网络对抗>Web基础实践 问题回答 1.什么是表单: 表单在网页中主要负责数据采集功能. 一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程 ...

  6. 20144303石宇森 《网络对抗》 WEB基础实践

    20144303石宇森 <网络对抗> WEB基础实践 实验后回答问题 一.什么是表单 表单是一个包含表单元素的区域.用form来定义. HTML是静态显示网页的,无法跟服务器进行交互,所以 ...

  7. 20145229吴姗珊《网络对抗》WEB基础实践

    20145229吴姗珊<网络对抗>WEB基础实践 基础与实践 基础问题 1.什么是表单 表单是可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 一部分是HTML源代码用于 ...

  8. 03--实例讲解虚拟机3种网络模式(桥接、nat、Host-only)

    前言 很多人安装虚拟机的时候,经常遇到不能上网的问题,而vmware有三种网络模式,对初学者来说也比较眼花聊乱,今天我就来基于虚拟机3种网络模式,帮大家普及下虚拟机上网的背景知识.(博文原创自http ...

  9. 网络操作系统 第九章 DHCP服务器管理与配置

    本章小结 本章介绍了DHCP服务器的基本概念,基本原理和主要功能,详细说明了Window是下DHCP服务器的安装配置和Linux下DHCP 服务器的安装配置,通过本章的学习.读者能够理解动态主机配置协 ...

随机推荐

  1. 构建高效Presubmit卡点,落地测试左移最佳实践

    樊登有一节课讲的挺有意思,说中国有个组织叫绩效改进协会,专门研究用技控代替人控的事情.其用麦当劳来举例子,他说麦当劳其实招人标准很低,高中文凭就可以,但是培养出来的人,三五年之后,每一个都是大家争抢的 ...

  2. UBUNTU 16.04 LTS SERVER 手动升级 MariaDB 到最新版 10.2

    UBUNTU 16.04 LTS SERVER 手动升级 MariaDB 到最新版 10.2 1. 起因 最近因为不同软件的数据问题本来只是一些小事弄着弄着就越弄越麻烦了,期间有这么个需求,没看到有中 ...

  3. PphpStorm常用操作整理

    本地修改记录:在项目名称上右键,点击Local History | Show History.你可以看到项目文件各个历史版本:Alt+Shift+C,可以看到项目最近的修改.这就是它的版本集成功能特性 ...

  4. (Opencv06)绘制轮廓函数

    (Opencv06)绘制轮廓函数 cv2.drawContours(image, contours, contourIdx, color, thickness) img: 指在哪副图像上绘制轮廓 会改 ...

  5. php中英文字符串转字母转大小写

    <?php //转小写 function lowercase($a){ $b = str_split($a, 1); $r = ''; foreach($b as $v){ $v = ord($ ...

  6. Java 反射(二)运行时获取类的信息

    目录 一.获得类的运行时结构 1. 获得类的名字 2. 获得类的属性 获取属性列表 获取指定属性 3. 获取类的方法 获得类的方法列表 获得指定方法 4. 获得的构造器 获得构造器列表 获得指定构造器 ...

  7. Feign实战技巧篇

    介绍Feign在项目中的正确打开方式 看了上一期Feign远程调用的小伙伴可能会问:阿鉴,你不是说上一期讲的是Feign的99%常用方式吗?怎么今天还有正确打开方式一说呀? 阿鉴:是99%的常用方式, ...

  8. netty系列之:使用POJO替代buf

    目录 简介 decode和encode 对象序列化 使用编码和解码器 总结 简介 在之前的文章中我们提到了,对于NioSocketChannel来说,它不接收最基本的string消息,只接收ByteB ...

  9. JavaScript高级程序设计(第4版)-第一章学习

    第一章 什么是Javascript 一.历史 JavaScript的名字怎么来的 首先,我们从javascript的历史开始了解,在以前的时候网页要验证某个必填字段是否填写,或者是判断输入的值的正确与 ...

  10. 花1个月时间准备 面试华为,薪资和定级都谈好了却被拒,HR竟说......

    说在前面,千万不要频繁跳槽. 本来华为很想去的,面试前花了一个月的时间准备,面试过程挺顺利的,也拒绝了其他的所有面试邀请,而我拒绝其他面试邀请的底气,则是之前面试过程中的良好表现,薪资和定级都谈好了. ...