简介
前段时间,有朋友让我介绍以下在VyOS下如何配置端口转发NAT。我查了一下资料,发现市面上介绍NAT的文章都过于学术化,甚至有些晦涩难懂。有鉴于此,本文试图从应用的视角来介绍常见的NAT及在VyOS上的配置。
从技术的角度来区分,我们常用的NAT可以分为源地址转换SNAT和目标地址转换DNAT两种类型。VyOS/EdgeOS上,两种NAT与接口和防火墙的关系可以参考下图。
下面我们就介绍NAT的各种应用场景以及配置方法。
NAT应用
SNAT
顾名思义,SNAT主要应用于从内网访问外网的场景。我们知道,一般运营商只给宽带接入分配一个IP地址。流量从WAN口出去,就必须转换为外网IP地址,否则远端服务器的回传流量无法路由回本地。
在出口为静态地址,例如192.0.0.1时,可以使用SNAT。VyOS的配置如下:
configure set nat source rule 100 outbound-interface eth0 set nat source rule 100 translation address 192.0.0.1 commit;save;exit
Masquerade是SNAT的一种实现形式,主要应用于出口是动态地址的场景。
configure set nat source rule 100 outbound-interface pppoe0 set nat source rule 100 translation address 'masquerade' commit;save;exit
在某些特殊场景下,我们希望排除NAT,例如IPSec是按照两端地址进行匹配的,如果相应的流量NAT后,就源地址就会变化,导致流量无法进入隧道,这时候就需要使用下面的配置对相应的流量排除。注意,和防火墙策略一样,NAT策略是按照规格序号从小到大先后执行的,因此,需要把排除策略放到前面。
configure set nat source rule 10 destination address '10.0.0.0/24' set nat source rule 10 'exclude' set nat source rule 10 outbound-interface 'eth0' set nat source rule 10 source address '192.168.0.0/24' commit;save;exit
端口转发
有些时候,我们会在家里部署NAS,视频监控等应用。当我们出门在外,希望能访问家里的DNS或者查看监控视频,这时候就需要用到DNAT,因为回访的流量是从外到内,目标地址是家里路由器的外网地址,进入到内网,需要转化成指定的内网设备地址。这就是我们常说的端口转发,是DNAT最常见的应用场景。
配置端口转发时,需要指定相关的协议(tcp/udp/tcp_udp)以及相应的端口号。常用的端口号可以参见Wikipedia。端口转发只适用于TCP或者UDP协议。
下面的配置将协议为TCP或者UDP,并且端口为52800或者52810的流量转发到192.168.0.100主机上。
configure set nat destination rule 100 description 'demo dnat application' set nat destination rule 100 inbound-interface pppoe0 set nat destination rule 100 protocol tcp_udp set nat destination rule 100 port 52800,52810 set nat destination rule 100 translation address 192.168.0.100 commit;save;exit
1:1 NAT
在商业应用中,如果你有两个或以上的静态IP地址,你可以将其中一个IP匹配到某个服务器或者第二级路由器上。这时候就会用到1:1NAT,也就是一个外网IP对应一个内网IP,也被称作双向NAT。由于1:1NAT不受限于协议,所有流量都会被转发到内网IP,相应的该内网IP的出口流量也都使用指定的外网IP。
下面的范例中,把WAN口eth1的一个IP地址(192.0.2.30),转化为内网eth0上另一个IP地址(192.168.1.10)。
configure set nat destination rule 2000 description '1-to-1 NAT example' set nat destination rule 2000 destination address '192.0.2.30' 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 '192.0.2.30' commit;save;exit
Hairping NAT
假定我们在内网运行了一个web服务器,我们可以通过DNAT开启外网访问。如果我们也要从内网访问,如果使用同样的URL,而DNS解析出来的目标地址是我们的外网地址,导致内网无法访问。这时候,就可以使用Hairping NAT来解决这个问题。
Hairping NAT的工作原理是在内网接口eth1配置地址转换,将所有来自eth1,并且是访问本地的特定端口的流量(原目标地址根据DNS解析为本地WAN口IP),转换目标地址为服务器的内网IP。
同时还要配置一个返程策略,让返回流量的源地址变换为外网IP,这样,从客户端看起来,就好像直接访问了该外网IP。
首先,我们配置一个常规的端口转发:
configure set nat destination rule 100 description 'Regular destination NAT from external' set nat destination rule 100 destination port 80 set nat destination rule 100 inbound-interface 'pppoe0' set nat destination rule 100 protocol 'tcp' set nat destination rule 100 translation address '192.168.0.100'
接下来我们配置Hairping NAT 的DNAT部分,让内网来的流量重新定位到服务器的内网IP。
set nat destination rule 110 description 'NAT Reflection: INSIDE' set nat destination rule 110 destination port '80' set nat destination rule 110 inbound-interface 'eth1' set nat destination rule 110 protocol 'tcp' set nat destination rule 110 translation address '192.168.0.100'
最后,我们再为Hairping NAT配置相应的返程策略。
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 protocol 'tcp' set nat source rule 110 source address '192.168.0.0/24' set nat source rule 110 translation address 'masquerade'
防火墙策略
由于WAN口的缺省防火墙策略是drop,也就是拒绝未经许可的流量。因此对于所有的DNAT,还需要配置相匹配的防火墙策略。防火墙的策略配置,请参考如何理解EdgeOS/VyOS防火墙一文。