网络操作系统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-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

posted @ 2019-07-24 17:20  亚楠老猎人  阅读(4889)  评论(0编辑  收藏  举报