大家对full cone nat 很熟悉,因为需要使用nat穿透完成相应的网络映射,也就是大家说的NAT类型1,RouterOS从7.10开始支持full cone nat,仅限支持UDP协议,在RouterOS /ip firewall nat添加设置action选择endpoint-Independent-nat ,如果你要开启路由器的full cone nat仅限UDP协议,其他协议的nat转换还需要使用masquerade来补充,不能独立使用,如下实例:

首先你的RouterOS需要接入一个公网IP地址,例如pppoe拨号,这里配置接口是pppoe-out1,默认的masquerade规则保留,这里以官方默认nat规则为例

[admin@MikroTik] /ip/firewall/nat> print
Flags: X - disabled, I - invalid; D - dynamic
0 ;;; defconf: masquerade
chain=srcnat action=masquerade out-interface-list=WAN log=no log-prefix="" ipsec-policy=out,none

添加full cone nat规则

[admin@MikroTik] /ip/firewall/nat>add action=endpoint-independent-nat chain=srcnat out-interface=pppoe-out1 protocol=udp
[admin@MikroTik] /ip/firewall/nat>add action=endpoint-independent-nat chain=dstnat in-interface=pppoe-out1 protocol=udp

查看配置

[admin@MikroTik] /ip/firewall/nat> print
Flags: X - disabled, I - invalid; D - dynamic
0 ;;; defconf: masquerade
chain=srcnat action=masquerade out-interface-list=WAN log=no log-prefix="" ipsec-policy=out,none

1 chain=srcnat action=endpoint-independent-nat randomise-ports=no protocol=udp out-interface=pppoe-out1 log=no log-prefix=""

2 chain=dstnat action=endpoint-independent-nat randomise-ports=no protocol=udp in-interface=pppoe-out1 log=no log-prefix=""

配置完成规则后使用move命令,需将full cone规则移动到所有nat规则最前,优先执行

[admin@MikroTik] /ip/firewall/nat>move 1 0
[admin@MikroTik] /ip/firewall/nat>move 2 0
[admin@MikroTik] /ip/firewall/nat> print
Flags: X - disabled, I - invalid; D - dynamic
0 chain=dstnat action=endpoint-independent-nat randomise-ports=no protocol=udp in-interface=pppoe-out1 log=no log-prefix=""

1 chain=srcnat action=endpoint-independent-nat randomise-ports=no protocol=udp out-interface=pppoe-out1 log=no log-prefix=""

2 ;;; defconf: masquerade
chain=srcnat action=masquerade out-interface-list=WAN log=no log-prefix="" ipsec-policy=out,none

配置full cone nat需要使用两条规则完成,一条srcnat链表和一条dstnat链表,srcnat完成映射行为,dstnat完成过滤行为,Endpoint-Independent NAT 是与端点无关的nat,在过滤行为与外部主机的IP和端口无关,

这样的配置和之前一个大神在github上发布为iptables开发的full cone nat功能很像,由于Linux的netfliter原生并不支持full cone nat需要通过重新编译iptables来加载模块,也有openwrt的版本需要自己编译(https://github.com/Chion82/netfilter-full-cone-nat)配置如下:

iptables -t nat -A POSTROUTING -o eth0 -j FULLCONENAT #same as MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -j FULLCONENAT  #automatically restore NAT for inbound packets

Chion82/netfilter-full-cone-nat发布时间很早,反而感觉RouterOS这个操作和他有点类似。

关于Full Cone NAT的原理简单举个例子,例如:

当内网主机192.168.88.8使用1024端口的UDP,向公网主机8.8.8.8请求53端口,在路由器上将内网192.168.88.8:1024通过NAT映射到WAN口IP,假设是19.19.19.19:1024请求8.8.8.8:53,此时,在路由器上开启了19.19.19.19:1024 NAT映射关系到内网192.168.88.8:1024,这个行为是NAT Mapping映射行为,8.8.8.8:53处理完成后回复消息给路由器的WAN口IP :19.19.19.19:1024,会判断是否是该映射表,这种是过滤行为(Filtering),Full Cone NAT允许从外网请求1024端口的IP和端口是任何IP和端口,不做限制。如果你没有看懂,后面会继续说明

关于STUN协议

RouterOS设置endpoint-independent-nat端点无关的NAT类型,在命名上好像和full cone nat无关,但这是第四种NAT类型的补充和修订,与端点无关的NAT类型,这些相关知识从网上整理了一部分:

首先四种NAT分类来至于2003年的rfc3489的STUN协议,STUN通过允许两个设备(P2P设备)发现它们之间NAT的存在和类型,并找出NAT转换的外部IP地址和端口,以便两个设备之间进行P2P通信,也就STUN是定义了如何进行NAT穿透。

STUN最初在2003年的RFC3489(标准)中定义,之后在2008年的RFC 5389(新标准)和2010年的RFC 5780中进行了两次修订。根据RFC 5389,“经典的STUN(RFC 3489)用于分类NAT类型的方法被发现有缺陷,因为许多NAT并不完全符合里面定义的(四种)类型。” 为了解决这个问题,在RFC5389中对经典STUN进行了修改。并且在RFC 5780中,重新定义了NAT类型,并修改了用于分类NAT类型的方法。 RFC 3489和RFC5389使用相同的缩写名称 “STUN”,但他们的具体含义又不同:

  • RFC 3489: STUN – Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs)
  • RFC 5389: STUN – Session Traversal Utilities for NAT

 

RFC5780重新定义NAT类型

RFC5780明确了他们的行为,对于修正后的NAT行为定义,有两大类:

  • Mapping Behavior-NAT用于outbound行为,即出站,内网IP向外请求使用端口替换的方式,包括:Endpoint-Independent Mapping,Address Dependent Mapping和Address and Port-Dependent Mapping
  • Filtering Behavior-NAT用于inbound行为,即入站,从外网返回或请求目标端口时的nat过滤方式,包括:Endpoint-Independent Filtering,Address-Dependent Filtering和Address and Port-Dependent Filtering

Full Cone NAT 全锥NAT

  • 【映射行为】:无论外部主机的目的IP和目的端口是什么,只要源IP和源端口相同,NAT都会将所有出方向的报文转换为相同的端口映射出去。
  • 【过滤行为】:NAT检查入方向目的IP和目的端口时,不关心外部主机的源IP或源端口值。
  • full cone NAT(RFC 3489)= Endpoint-Independent Mapping (EIM) and Endpoint-Independent Filtering (EIF) RFC 5780.

Restricted Cone 限制锥NAT

  • 【映射行为】:与全锥类型相同
  • 【过滤行为】:外部主机(IP地址)只有在内部主机发起通信后,才能向内部主机发送数据包,不关心外部主机的源端口。
  • restricted cone NAT(RFC 3489)= Endpoint-Independent Mapping (EIM) and Address-Dependent Filtering (ADF) in RFC 5780.

Port Restricted Cone 端口限制锥NAT

  • 【映射行为】:与全锥类型相同
  • 【过滤行为】:该NAT检查外部主机源IP,源端口与映射是否相同,以决定报文是否通过。。
  • port restricted cone NAT (RFC 3489)= Endpoint-Independent Mapping (EIM) and Address and Port-Dependent Filtering (APDF) in RFC 5780.

Symmetric 对称NAT

  • 映射行为:该NAT映射会为每个主机连接映射独立的IP和端口
  • 过滤行为:与端口限制锥类型相同
  • symmetric NAT (RFC 3489)= Address and Port-Dependent Mapping (APDM) and Address and Port-Dependent Filtering (APDF) in RFC 5780.

实际上RFC5780通过对Mapping和Filtering的组合共有9种,远比RFC3489定义的更多:

以上内容可以参考此网站内容,上面还对更多nat相关的rfc内容用图形解释

可能在大部分人理解Linux(包括RouterOS)的masquerade和src-nat的NAT规则是symmetric 对称型NAT,通过测试发现,他们是port restricted cone NAT端口锥型NAT,即:  Endpoint-Independent Mapping (EIM) + Address and Port-Dependent Filtering (APDF) ,映射使用的是EIM方式,过滤使用的是APDF方式。

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章很值,打赏犒劳作者一下