前言
本文会紧接着《网络操作系统VyOS应用实践(三)》进一步在模拟环境中体验VyOS的功能。
NAT
NAT即网络地址转换,最常见的就是各种虚拟机工具的NAT模式,让虚拟机以宿主的网络地址与外网通讯,内网主机发送数据时,内网的地址将会被转换为运行NAT服务的主机的地址,内网主机都以该主机地址为代表与外界沟通。
原理的确很简单,接下来将会通过实验,操作VyOS进行NAT实验。
下图为本实验的基本拓扑:
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
——————————分隔线——————————————
下面是实验的具体操作:
先为vm1设置一个rule(和防火墙类似,以rule定义规则):
1 2 3 4 5 6 7 |
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:
1 2 3 4 5 |
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,vyos仅仅起到路由的作用:
可以看到在external区域抓到的包的source(右图第一行)还是192.168.225.3,而返回的包中,destination也还是192.168.225.3。这就是启用SNAT和不启用SNAT的区别。
关于设置NAT时的注意事项:
如果内部网络有很多节点需要使用SNAT,VyOS官方建议每256个节点就使用一个外部IP地址进行NAT。如果有8000个节点,那么就需要32个外部IP地址才够。
另外,VyOS支持所谓的NAT Reflection(发夹转换),这里只简单地引用官方的例子:
1 2 3 4 5 |
set nat source rule 110 description 'NAT Reflection: INSIDE' set nat source rule 110 destination address '192.168.0.0/24' set nat source rule 110 outbound-interface 'eth1' set nat source rule 110 source address '192.168.0.0/24' set nat source rule 110 translation address 'masquerade' |
关于什么是NAT Reflection,读者可以看看这篇文章:www.nycnetworkers.com/real-world/nat-reflectionnat-loopbacknat-hairpinning/
请自备梯子。
DNAT
DNAT主要是用于隐藏内部网络的机器的真实地址,DNAT的原理是修改目标地址和端口。外部节点访问内部节点时,目标地址是运行NAT服务的节点的外网地址,DNAT接受数据后,会修改数据包的目标地址,改为内网节点的地址。
接下来的实验目标:
假设在我的internal网络里有一个节点运行xmlrpc服务,但为了安全,我不想直接把该节点暴露给external区域,此时,可以使用防火墙加DNAT实现我的目的。
思路:
vm2运行xmlrpc服务,vm3运行客户端。使用防火墙,限制vm3只能通过端口1800访问XMLRPC服务器,同时启用DNAT,隐藏vm2的地址,只暴露vyos的eth1接口的地址。
首先,我们先进行防火墙设置。先划分区域,创建internal和external区域:
1 2 3 4 |
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:
1 2 3 |
vyos@vyos# set zone-policy zone IN interface eth0 [edit] vyos@vyos# set zone-policy zone EX interface eth1 |
然后开始根据目的设置防火墙规则,这里,默认的规则为reject:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 |
再设置一个返回数据的规则:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 |
应用两组规则:
1 2 3 |
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的设置。
在vyos中,设置DNAT和SNAT的方法和步骤略有不同,其步骤一般是:
1.知道数据会从哪个接口进来
2.要转发的是什么协议,端口号是什么
3.要转发的目标内网节点地址
对于上面的问题,本实验中的答案是:
1.从eth1接口进入
2.端口为1800,TCP协议
3.目标地址为vm2的地址,即192.168.225.4
登陆vyos进行DNAT的设置:
1 2 3 4 5 6 7 8 |
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其实有点接近防火墙的功能,不是单单地进行地址转换,还对协议和端口进行了限制。
还可以基于DNAT和SNAT设置一对一NAT,一对一NAT必须有一个外部IP去对应内部IP,这里就简单地引用官方的例子提供给读者参考:
1 2 3 4 5 6 7 8 9 10 11 12 |
set interfaces ethernet eth0 address '192.168.1.1/24' set interfaces ethernet eth0 description 'Inside interface' set interfaces ethernet eth1 address '1.2.3.4/24' set interfaces ethernet eth1 description 'Outside interface' set nat destination rule 2000 description '1-to-1 NAT example' set nat destination rule 2000 destination address '1.2.3.4' set nat destination rule 2000 inbound-interface 'eth1' set nat destination rule 2000 translation address '192.168.1.10' 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.1.10' set nat source rule 2000 translation address '1.2.3.4' |
上面的例子就是使用了1.2.3.4/24这个外部IP地址对应192.168.1.1/24这个内部地址,一般情况下,还是使用一对多的NAT。
QoS
VyOS支持控制指定网络接口的网速,我们可以通过配置Traffic Policy以进行QoS。
在没有设置QoS之前,通过iperf工具,我测试了vm3与vm2之间的网络速度:
从图中可以看到,一般情况下,VMware的vmnet间的传输速度大概是773Mbits/s,现在尝试对连接vm3的eth1接口进行限速到100Mbits/s。
其实这个设置和进行其他设置类似,都是先创建规则或者分组,然后应用到具体的接口之类:
这个策略是应用到eth1的出口网速的:
1 2 3 4 5 6 7 |
vyos@vyos# set traffic-policy shaper EXT-OUT bandwidth '100Mbit' [edit] vyos@vyos# set traffic-policy shaper EXT-OUT default bandwidth '50%' [edit] vyos@vyos# set traffic-policy shaper EXT-OUT default ceiling '100%' [edit] vyos@vyos# set traffic-policy shaper EXT-OUT default queue-type 'fair-queue' |
把这个策略应用到eth1上:
1 2 |
vyos@vyos# set interfaces ethernet eth1 traffic-policy out 'EXT-OUT' [edit] |
验证这个QoS策略是否生效。需要在vm3上启动iperf作为server,vm2上启动iperf作为client,用UDP测速,验证QoS策略是否生效:
上图是server端反馈的结果,在87.5Mbits/s左右,如果你设置为50Mbits,实际测速大概也是47Mbits左右,比设置的值小一点。
对于流量限制,VyOS还支持多种演算法,读者可以参考这里:http://vyos.net/wiki/QoS
关于演算法,可以看看这个:http://rambo.blog.ustc.edu.cn/?p=238
结语
本文通过实验,介绍了VyOS的NAT的配置方式并对SNAT和DNAT的处理流程进行分析,最后介绍了VyOS的QoS设置。望能为各位VyOS研究者或潜在的使用者提供帮助。在后面的文章还会介绍它的其他功能。本人水平有限,如有缺点和漏洞,还请各位读者指出。
参考资料:
http://blog.itpub.net/29867/viewspace-702622/
http://www.linuxidc.com/Linux/2013-08/88536p2.htm
http://blog.csdn.net/ustcgy/article/details/5655050
http://vyos.net/wiki/User_Guide#NAT
http://rambo.blog.ustc.edu.cn/?p=238
https://www.slyar.com/blog/iperf-measure-network-performance.html
作者简介:
何智刚,2015至今,暨南大学经济统计学专业16届新生,主要研究云计算、SDN、机器学习,对各种领域都有所涉猎,目标是迈向full stack。
qq:1097225749
github:https://github.com/Hochikong