网络操作系统VyOS之NAT实践
本文基于 网络操作系统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-2
和pc-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实践的更多相关文章
- 开源网络操作系统--VyOS
User Guide Jump to: navigation, search Contents 1 Introduction 2 Installation 3 Using the Command-Li ...
- VNF网络性能提升解决方案及实践
VNF网络性能提升解决方案及实践 2016年7月 作者: 王智民 贡献者: 创建时间: 2016-7-20 稳定程度: 初稿 修改历史 版本 日期 修订人 说明 1.0 20 ...
- 嵌入式实时操作系统μCOS原理与实践任务控制与时间的解析
/*************************************************************************************************** ...
- 实例讲解虚拟机3种网络模式(桥接、nat、Host-only)
转自:http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html 前言 很多人安装虚拟机的时候,经常遇到不能上网的问题,而vmwa ...
- 20145312袁心《网络对抗》Web基础实践
20145312袁心<网络对抗>Web基础实践 问题回答 1.什么是表单: 表单在网页中主要负责数据采集功能. 一个表单有三个基本组成部分: 表单标签:这里面包含了处理表单数据所用CGI程 ...
- 20144303石宇森 《网络对抗》 WEB基础实践
20144303石宇森 <网络对抗> WEB基础实践 实验后回答问题 一.什么是表单 表单是一个包含表单元素的区域.用form来定义. HTML是静态显示网页的,无法跟服务器进行交互,所以 ...
- 20145229吴姗珊《网络对抗》WEB基础实践
20145229吴姗珊<网络对抗>WEB基础实践 基础与实践 基础问题 1.什么是表单 表单是可以收集用户的信息和反馈意见,是网站管理者与浏览者之间沟通的桥梁. 一部分是HTML源代码用于 ...
- 03--实例讲解虚拟机3种网络模式(桥接、nat、Host-only)
前言 很多人安装虚拟机的时候,经常遇到不能上网的问题,而vmware有三种网络模式,对初学者来说也比较眼花聊乱,今天我就来基于虚拟机3种网络模式,帮大家普及下虚拟机上网的背景知识.(博文原创自http ...
- 网络操作系统 第九章 DHCP服务器管理与配置
本章小结 本章介绍了DHCP服务器的基本概念,基本原理和主要功能,详细说明了Window是下DHCP服务器的安装配置和Linux下DHCP 服务器的安装配置,通过本章的学习.读者能够理解动态主机配置协 ...
随机推荐
- linux下nginx访问ftp目录权限问题
在将nginx目录设置为ftp目录访问时会报错:403 forbidden 原因在于nginx访问时账户问题,通过修改nginx.conf中的访问名解决 打开nginx.conf 修改user值,去掉 ...
- P4293 [WC2010]能量场
P4293 [WC2010]能量场 题意 给你 \(n\) 个粒子,每个粒子有两个权值 \(m_i,c_i\) 每个相邻有序对 \((a,b)\) 会产生 \(m_am_b(c_a-c_b)\) 的贡 ...
- P2476-记忆化搜索
链接 DP? 我们看看,这个状态似乎有亿点点多. 我们看看数据范围,数量不超过5,颜色数不超过15. 15维DP显然不靠谱. 那么我们就思考一下--个数? 记忆化搜索可ac: #include< ...
- BZOJ2457 双端队列 题解
本题直接求解十分困难,因为在不知道整个序列的数字规律时当前所作决策都无法保证最优性. 考虑正难则反,题目转化为将一个非降序列分成尽量少的几段,让每段对应原问题的双端队列. 先将原数组排序,由于原数组下 ...
- Python如何将py文件打包成exe
安装pyinstaller 打开cmd窗口,输入pip install pyinstaller,命令行输出successfully表示成功. 生成exe文件 一.单个py文件 在py文件目录下,打开c ...
- intouch制作历史报警查询(时间查询,筛选关键字)
在项目中,intouch制作历史报警查询已属于标配功能,如何做出按时间以及关键字来进行综合查询,提高历史报警查询效率仍然是一个值得研究的问题,接下来参考网上文章自己总结下如何制作. 1.DTPicke ...
- SQL 查询总是先执行SELECT语句吗?你们都错了!
SELECT语句中子句的顺序.SELECT语句中使用时必须遵循的次序. 经过一段时间的学习,我们知道了SELECT语句超简版的语法如下: SELECT 字段名 FROM 表名 后来,我们又陆续学习了W ...
- MySQL执行计划【explain】详解
本文已经收录到github仓库,仓库用于分享Java相关知识总结,包括Java基础.MySQL.Springboot.mybatis.Redis.rabbitMQ等等,欢迎大家提pr和star! gi ...
- OpenGL学习笔记(二)画三角形
目录 渲染管线(Graphics Pipeline) 编码实现 顶点数据 顶点缓冲对象(VBO) 顶点着色器 编译着色器 片段着色器 着色器程序 链接顶点属性 顶点数组对象 最终绘制三角形 索引缓冲对 ...
- Android 键盘属性
键盘定义:通过Keyboard说明是一个软键盘定义文件,Row元素说明这是一行按键的定义,Key元素说明这是一个按键的定义.Key元素通过一些属性来定义每个按键,下面是一些常用的属性介绍: Codes ...