介绍

网络地址转换是一种互联网标准,允许局域网上的主机使用一套IP地址进行内部通信,并使用另一套IP地址进行外部通信。使用NAT的局域网被称为 Natted 网络。为了使NAT发挥作用,每个 NATted 网络中要有一个NAT网关。NAT网关(NAT路由器)在数据包和局域网通信的过程中执行IP地址重写。

NAT只匹配连接的第一个数据包,连接跟踪会记住这个动作,并对属于同一连接的所有其他数据包执行。

当NAT规则改变或添加时,连接跟踪表要清除,否则NAT规则可能看起来不能正常工作,直到连接条目过期。

NAT类型

  • 源NAT或srcnat 这种类型的NAT对来自NAT网络的数据包执行的。当数据包通过路由器时,NAT路由器会用一个新的公共IP地址替换IP数据包的私有源地址。相反的操作应该用于另一个方向的回复数据包。

  • 目的地NAT或dstnat 这种类型的NAT对以NAT网络为目的地的数据包执行的。最常用于使私人网络上的主机能够从互联网上访问。一个执行dstnat的NAT路由器在IP数据包通过路由器向私有网络传输时,会替换其目的IP地址。

从RouterOS v7开始,防火墙NAT有两个新的 INPUTOUTPUT 链,这两个链用于传递到本地机器上运行的应用程序和从其发送的数据包。

  • input - 处理通过某个接口进入路由器的数据包,其目标IP地址是路由器的地址之一。通过路由器的数据包不会根据输入链的规则进行处理。

  • output - 处理来自路由器的数据包,并通过其中一个接口离开路由器。通过路由器的数据包不按照输出链的规则进行处理。

目的NAT

网络地址转换的工作原理是修改数据包IP头中的网络地址信息。让我们看一下常见的设置,即网络管理员想从互联网上访问办公室服务器。

希望从互联网连接到本地IP为10.0.0.3的办公室服务器。在这种情况下,必须在办公室网关路由器上配置一个目标地址转换规则。

/ip firewall nat add chain=dstnat action=dst-nat dst-address=172.16.16.1 dst-port=22 to-addresses=10.0.0.3 protocol=tcp

上面的规则翻译为:当一个传入的连接请求TCP端口22和目标地址172.16.16.1时,使用 dst-nat 动作并将数据包出发到本地IP地址10.0.0.3和端口22的设备。

为了只允许从家里的PC访问,可以用 src-address=192.168.88.1 改进的 dst-nat 规则,这是一个家用电脑的公共(本例)IP地址,是更安全的!

源网络地址转换

如果想把本地设备隐藏在ISP的公共IP地址后面,应该配置MikroTik路由器的源网络地址转换(masquerading)功能。 假设要把办公室计算机和服务器都隐藏在公共 IP 172.16.16.1 后面,规则如下所示:

/ip firewall nat add chain=srcnat src-address=10.0.0.0/24 action=src-nat to-addresses=172.16.16.1 out-interface=WAN

现在ISP将看到所有以IP 172.16.16.1发出的请求,他们不会看到你的局域网IP地址。

Masquerade

防火墙NAT action=masqueradeaction=srcnat 的一个特殊版本,设计用于公共IP随机改变的情况,例如,DHCP服务器改变分配的IP或PPPoE隧道断开后得到不同的IP,简而言之 - 公共IP是动态的

/ip firewall nat add chain=srcnat src-address=10.0.0.0/24 action=masquarade out-interface=WAN

每次接口断开连接或IP地址改变时,路由器会清除所有和该接口相关的伪装连接跟踪条目,这样可以改善公共IP改变后的系统恢复时间。如果用 srcnat 代替 masquerade ,连接跟踪条目仍然存在,连接会在链接失败后简单地恢复。

但是这可能会导致一些不稳定的链接问题,当主链接发生故障后,连接被路由到不同的链接。这样,会发生以下情况。

  • 在断开连接时,所有相关的连接跟踪条目被清除。

  • 每个被清除的(以前被伪装的)连接的下一个数据包将作为新的数据包进入防火墙,如果一个主接口没有返回,数据包将通过替代路由(如果有的话)被送出,从而形成一个新的伪装连接。

  • 如果主链路返回了,主链路上的路由就会恢复,属于现有连接的数据包就会通过主接口发送,而不会被伪装,这样就会把本地IP泄露给公共网络。

为了解决这种情况,可以创建 黑洞 路由,作为断开连接时可能消失的路由的替代。

支持NAT的路由器后面的主机没有真正的端到端连接。因此,一些互联网协议在有NAT的情况下可能无法工作。需要从专用网络外启动TCP连接的服务或无状态协议(如UDP)可能会被破坏。

为了克服这些限制,RouterOS包含一些NAT助手,可以使各种协议的NAT穿越。当使用 action=srcnat 时,连接跟踪条目仍然存在,连接可以简单地恢复。

尽管源NAT和伪装执行相同的基本功能:将一个地址空间映射到另一个地址空间,但细节上略有不同。最明显的是,伪装为出站数据包选择了与数据包出口的接口绑定的IP的源IP地址。

CGNAT (NAT444)

为了应对IPv4地址耗尽,部署了一个新的RFC 6598。这个想法是在运营商网络内部使用共享的100.64.0.0/10地址空间,并在运营商的边缘路由器上执行NAT到一个公共IP或公共IP范围。

由于这种设置的性质,它也被称为NAT444,相对于 "正常 "NAT环境的NAT44网络,涉及三个不同的IPv4地址空间。

RouterOS上的CGNAT配置与其他常规的源NAT配置没有区别。

/ip firewall nat
 add chain=src-nat action=srcnat src-address=100.64.0.0/10 to-address=2.2.2.2 out-interface=<;public_if>

这里:

  • 2.2.2.2 - 公共IP地址。

  • public_if - 连接到互联网供应商边缘路由器的接口

NAT444的优势是显而易见的,使用的公共IPv4地址更少。但是这种技术也有很大的缺点。

  • 执行CGNAT的服务提供商的路由器需要为所有的地址转换维护一个状态表:这需要大量的内存和CPU资源。

  • 游戏问题。当两个使用相同外部公共IPv4地址的用户试图相互连接时,一些游戏会失败。

  • 出于法律原因跟踪用户意味着额外的记录,因为多个家庭在一个公共地址后面。

  • 任何需要进入的连接都被破坏了。虽然普通的NAT已经是这种情况,但最终用户通常仍然可以在他们的NAT路由器上设置端口转发。CGNAT使之成为不可能。这意味着这里不能托管网络服务器,而且IP电话默认也不能接收来电。

  • 一些网络服务器只允许来自同一公共IP地址的最大连接数,作为对抗SYN泛滥等DoS攻击的一种手段。使用CGNAT,这个限制会更频繁地达到,一些服务可能质量很差。

  • 6to4需要全球可达的地址,在采用拓扑跨度有限的地址的网络中无法工作。

具有共享地址空间源地址或目标地址的数据包不得跨越服务提供商的边界转发。服务提供商必须在入口链路上过滤此类数据包。在RouterOS中,可以通过边缘路由器上的防火墙过滤器轻松实现。

/ip firewall filter
 add chain=input src-address=100.64.0.0/10 action=drop in-interface=<;public_if>
 add chain=output dst-address=100.64.0.0/10 action=drop out-interface=<;public_if>
 add chain=forward src-address=100.64.0.0/10 action=drop in-interface=<;public_if>
 add chain=forward src-address=100.64.0.0/10 action=drop out-interface=<;public_if>
 add chain=forward dst-address=100.64.0.0/10 action=drop out-interface=<;public_if>

服务提供商可能被要求记录MAPed地址,在一个大型CGN部署网络中,这可能是一个问题。幸运的是,RFC 7422提出了一种管理CGN翻译方法,以大大减少所需的记录量,同时为滥用响应提供可追溯性。

RFC指出,CGN可以确定地将客户的私人地址(在CGN面向客户的接口上收到的,也就是内部一侧)映射到用端口范围扩展的公共地址,而不是记录每个连接。

在RouterOS中,可以用一些脚本函数来完成算法。举个例子:

Inside IP Outside IP/Port range
100.64.1.1 2.2.2.2:2000-2099
100.64.1.2 2.2.2.2:2100-2199
100.64.1.3 2.2.2.2:2200-2299
100.64.1.4 2.2.2.2:2300-2399
100.64.1.5 2.2.2.2:2400-2499
100.64.1.6 2.2.2.2:2500-2599

可以写一个自动添加这种规则的函数,而不用手工编写NAT映射。

:global sqrt do={
  :for i from=0 to=$1 do={
    :if (i * i > $1) do={ :return ($i - 1) }
  }
}

:global addNatRules do={
  /ip firewall nat add chain=srcnat action=jump jump-target=xxx
    src-address="$($srcStart)-$($srcStart + $count - 1)"

  :local x [$sqrt $count]
  :local y $x
  :if ($x * $x = $count) do={ :set y ($x + 1) }
  :for i from=0 to=$x do={
    /ip firewall nat add chain=xxx action=jump jump-target="xxx-$($i)"
     src-address="$($srcStart + ($x * $i))-$($srcStart + ($x * ($i + 1) - 1))"
  }

  :for i from=0 to=($count - 1) do={
    :local prange "$($portStart + ($i * $portsPerAddr))-$($portStart + (($i + 1) * $portsPerAddr) - 1)"
    /ip firewall nat add chain="xxx-$($i / $x)" action=src-nat protocol=tcp src-address=($srcStart + $i)
     to-address=$toAddr to-ports=$prange
    /ip firewall nat add chain="xxx-$($i / $x)" action=src-nat protocol=udp src-address=($srcStart + $i)
     to-address=$toAddr to-ports=$prange
  }
}

将上述脚本粘贴到终端后,函数 "addNatRules "就可用了。以我们的例子为例,需要将6个共享网络地址映射到2.2.2.2,每个地址使用100个端口范围,从2000开始。运行函数:

$addNatRules count=6 srcStart=100.64.1.1 toAddr=2.2.2.2 portStart=2000 portsPerAddr=100

现在可以得到一套规则:

[admin@rack1_b18_450] /ip firewall nat> print
Flags: X - disabled, I - invalid, D - dynamic
 0    chain=srcnat action=jump jump-target=xxx src-address=100.64.1.1-100.64.1.6 log=no log-prefix=""

 1    chain=xxx action=jump jump-target=xxx-0 src-address=100.64.1.1-100.64.1.2 log=no log-prefix=""

 2    chain=xxx action=jump jump-target=xxx-1 src-address=100.64.1.3-100.64.1.4 log=no log-prefix=""

 3    chain=xxx action=jump jump-target=xxx-2 src-address=100.64.1.5-100.64.1.6 log=no log-prefix=""

 4    chain=xxx-0 action=src-nat to-addresses=2.2.2.2 to-ports=2000-2099 protocol=tcp src-address=100.64.1.1 log=no log-prefix=""

 5    chain=xxx-0 action=src-nat to-addresses=2.2.2.2 to-ports=2000-2099 protocol=udp src-address=100.64.1.1 log=no log-prefix=""

 6    chain=xxx-0 action=src-nat to-addresses=2.2.2.2 to-ports=2100-2199 protocol=tcp src-address=100.64.1.2 log=no log-prefix=""

 7    chain=xxx-0 action=src-nat to-addresses=2.2.2.2 to-ports=2100-2199 protocol=udp src-address=100.64.1.2 log=no log-prefix=""

 8    chain=xxx-1 action=src-nat to-addresses=2.2.2.2 to-ports=2200-2299 protocol=tcp src-address=100.64.1.3 log=no log-prefix=""

 9    chain=xxx-1 action=src-nat to-addresses=2.2.2.2 to-ports=2200-2299 protocol=udp src-address=100.64.1.3 log=no log-prefix=""

10    chain=xxx-1 action=src-nat to-addresses=2.2.2.2 to-ports=2300-2399 protocol=tcp src-address=100.64.1.4 log=no log-prefix=""

11    chain=xxx-1 action=src-nat to-addresses=2.2.2.2 to-ports=2300-2399 protocol=udp src-address=100.64.1.4 log=no log-prefix=""

12    chain=xxx-2 action=src-nat to-addresses=2.2.2.2 to-ports=2400-2499 protocol=tcp src-address=100.64.1.5 log=no log-prefix=""

13    chain=xxx-2 action=src-nat to-addresses=2.2.2.2 to-ports=2400-2499 protocol=udp src-address=100.64.1.5 log=no log-prefix=""

14    chain=xxx-2 action=src-nat to-addresses=2.2.2.2 to-ports=2500-2599 protocol=tcp src-address=100.64.1.6 log=no log-prefix=""

15    chain=xxx-2 action=src-nat to-addresses=2.2.2.2 to-ports=2500-2599 protocol=udp src-address=100.64.1.6 log=no log-prefix=""

发夹式NAT

发夹式网络地址转换(NAT Loopback)是指LAN上的设备能够通过网关路由器的公共IP地址访问LAN上的另一台机器。

在上述例子中,网关路由器有以下 dst-nat 配置规则:

/ip firewall nat add chain=dstnat action=dst-nat dst-address=172.16.16.1 dst-port=443 to-addresses=10.0.0.3 to-ports=443 protocol=tcp

当一个来自家里PC的用户与网络服务器建立连接时,路由器按照配置执行DST NAT。

  1. 客户端发送一个源IP地址为192.168.88.1的数据包到443端口的目的IP地址为172.16.16.1,以请求一些网络资源。

  2. 路由器目的地NAT数据包到10.0.0.3,并相应替换数据包中的目的IP地址。源IP地址保持不变:192.168.88.1。

  3. 服务器回复客户的请求,回复数据包的源IP地址为10.0.0.3,目的IP地址为192.168.88.1。

  4. 路由器确定该数据包是以前连接的一部分,并撤消了目的地NAT,并将原来的目的地IP地址放入源IP地址域。目的IP地址是192.168.88.1,源IP地址是172.16.16.1。

  5. 客户端收到它所期望的回复数据包,连接就建立了。

但是,会有一个 问题,当一个与网络服务器在同一网络上的客户要求连接到网络服务器的 公共 IP地址时:

  1. 客户端发送一个源IP地址为10.0.0.2的数据包到目的IP地址为172.16.16.1的443端口,以请求一些网络资源。

  2. 路由器目的地将数据包NAT到10.0.0.3,并相应地替换了数据包中的目的地IP地址。源IP地址保持不变:10.0.0.2。

  3. 服务器对客户的请求进行回复。然而,该请求的源IP地址与网络服务器在同一个子网。网络服务器没有把回复发回路由器,而是直接发回10.0.0.2,回复中的源IP地址为10.0.0.3。

  4. 客户端收到了回复数据包,但丢弃了它,因为它期望从172.16.16.1,而不是从10.0.0.3返回的数据包。

为了解决这个问题,配置一个新的 src-nat 规则(发夹式NAT规则),如下所示。

/ip firewall nat
add action=masquerade chain=srcnat dst-address=10.0.0.3 out-interface=LAN protocol=tcp src-address=10.0.0.0/24

在配置了上面的规则后:

  1. 客户发送一个源IP地址为10.0.0.2的数据包到443端口的目的IP地址172.16.16.1,请求一些网络资源。

  2. 路由器将该数据包目标NAT到10.0.0.3,并相应地替换数据包中的目标IP地址。它还对数据包进行源NAT处理,并将数据包中的源IP地址替换为其LAN接口上的IP地址。目的IP地址是10.0.0.3,源IP地址是10.0.0.1。

  3. 网络服务器回复请求,并将源IP地址为10.0.0.3的回复发回路由器的LAN接口IP地址为10.0.0.1。

  4. 路由器确定该数据包是以前连接的一部分,并撤消了源和目的NAT,并将原来的目的IP地址10.0.0.3放入源IP地址域,而将原来的源IP地址172.16.16.1放入目的IP地址域

IPv4

属性

属性 说明
action (action name; Default: accept) 如果一个数据包被规则匹配,要采取的动作:
- accept - 接受该数据包。数据包不会被传递给下一个NAT规则。
- add-dst-to-address-list - 将目标地址添加到参数 "address-list "指定的地址列表中。
- add-src-to-address-list - 将源地址添加到参数 "address-list "指定的地址列表中。
- dst-nat - 将IP数据包的目标地址和/或端口替换为 to-addressesto-ports 参数所指定的值
- jump - 跳到由 jump-target 参数值指定的用户定义的链上
- log - 在系统日志中添加一条信息,包含以下数据:in-interface, out-interface, src-mac, protocol, src-ip:port->dst-ip:port和包的长度。在数据包被匹配后,它被传递到列表中的下一个规则,类似于 "穿透"。
- masquerade - 将IP数据包的源端口替换为 to-ports 参数指定的端口,并将IP数据包的源地址替换为由路由设施确定的IP。
- netmap - 创建一个静态的1:1映射,将一组IP地址映射到另一组。通常用于将公共IP地址分配给私人网络中的主机。
- passthrough - 如果数据包被规则匹配,增加计数器并进入下一个规则(对统计有用)。
- redirect - 用 to-ports 参数指定的端口替换IP数据包的目的端口,目的地址替换为路由器的一个本地地址
- return - 将控制权传回发生跳转的链上
- same - 从提供的范围内给一个特定的客户提供相同的源/目的IP地址,用于每次连接。这最常用于那些希望同一客户的多个连接使用同一客户地址的服务。
- src-nat - 用 "to-addresses "和 "to-ports "参数指定的值替换IP包的源地址。
address-list (string; Default: ) 要用的地址列表的名称。如果动作是 "add-dst-to-address-list "或 "add-src-to-address-list "则适用。
address-list-timeout (none-dynamic | none-static | time; Default: none-dynamic) 地址从 address-list 参数指定的地址列表中删除的时间间隔。与 add-dst-to-address-listadd-src-to-address-list 动作一起使用。
- 非动态值(00:00:00)将在地址列表中保留该地址,直到重新启动。
- 非静态的值将使地址永远留在地址列表中,并将包括在配置导出/备份中。
chain (name; Default: ) 指定添加到哪个链的规则。如果输入的内容与已经定义的链名称不一致,将创建一个新的链。
comment (string; Default: ) 规则的描述。
connection-bytes (integer-integer; Default: ) 只有在通过特定连接传输了一定数量的字节时才会匹配数据包。0 - 表示无穷大,例如 connection-bytes=2000000-0 表示如果通过相关连接的传输量超过2MB,该规则就会匹配。
connection-limit (integer,netmask; Default: ) 在达到给定值后,匹配每个地址或地址块的连接。
connection-mark (no-mark | string; Default: ) 匹配通过mangle标记为特定连接标记的数据包。如果设置了 无标记,该规则将匹配任何无标记的连接。
connection-rate (Integer 0...4294967295; Default: ) 连接速率是一个防火墙匹配器,允许根据目前的连接速度来捕获流量。
connection-type (ftp | h323 | irc | pptp | quake3 | sip | tftp;Default: ) 根据连接跟踪助手的信息,匹配来自相关连接的数据包。相关的连接帮助器必须在/ip firewall service-port下启用。
content (string; Default: ) 匹配包含指定文本的数据包。
dscp (integer: 0..63; Default: ) 匹配DSCP IP头。
dst-address (IP/netmask | IP range; Default: ) 匹配目的地等于指定IP或属于指定IP范围的数据包。
dst-address-list (name; Default: ) 根据用户定义的地址列表匹配数据包的目的地址。
dst-address-type (unicast | local | broadcast | multicast; Default: ) 匹配目的地址类型:
- unicast - 用于点对点传输的IP地址
- local - 如果dst-address分配给路由器的一个接口
- broadcast - 数据包发送到子网的所有设备上
- multicast - 数据包转发到一个定义的设备组中
dst-limit (integer[/time],integer,dst-address | dst-port | src-address[/time]; Default: ) 匹配数据包,直到超过给定的PPS限制。与限制匹配器相反,每个目的IP地址/目的端口都有自己的限制。参数按下列格式书写:count[/time],burst,mode[/expire].
- count - 每一 time 间隔的数据包为单位的最大平均数据包速率
- time - 指定测量数据包速率的时间间隔(可选)
- burst - 不计入包率的数据包数量
- mode - 用于限制数据包速率的分类器
- expire - 指定间隔,之后记录的IP地址/端口将被删除(可选)。
dst-port (integer[-integer]: 0...65535; Default: ) 目标端口号或端口号范围的列表,格式为 Range[,Port],例如,dst-port=123-345,456-678
fragment (yes | no; Default: ) 匹配碎片化的数据包。第一个(开始)片段不计入。如果启用连接跟踪就不会有碎片,因为系统会自动组装每个数据包。
hotspot (auth | from-client | http | local-dst | to-client; Default: ) 把从HotSpot客户端收到的数据包与各种HotSpot匹配器进行匹配。
- auth - 匹配经过认证的HotSpot客户端数据包
- from-client - 匹配来自HotSpot客户端的数据包
- http - 匹配发送到HotSpot服务器的HTTP请求
- local-dst - 匹配以HotSpot服务器为目的地的数据包
- to-client - 匹配发送至HotSpot客户端的数据包
icmp-options (integer:integer; Default: ) 匹配ICMP类型:代码字段
in-bridge-port (name; Default: ) 如果输入的接口是网桥,则为数据包进入路由器的实际接口。
in-interface (name; Default: ) 数据包进入路由器的接口。
ingress-priority (integer: 0..63; Default: ) 匹配数据包的进入优先级。优先级可以从VLAN、WMM或MPLS的EXP位得出。
ipsec-policy (in | out, ipsec | none; Default: ) 匹配IPSec的策略。值按下列格式书写。方向,策略。方向用于选择是匹配用于解封装的策略还是将用于封装的策略。
- in - 在PREROUTING、INPUT和FORWARD链中有效
- out - 在POSTROUTING、OUTPUT和FORWARD链中有效。
- ipsec - 匹配数据包是否接受IPsec处理。
- none - 匹配不受IPsec处理的数据包(例如,IPSec传输数据包)。
例如,如果路由器收到一个IPsec封装的Gre包,那么规则 ipsec-policy=in,ipsec 将匹配Gre包,但规则 ipsec-policy=in,none 将匹配ESP包。
ipv4-options (any | loose-source-routing | no-record-route | no-router-alert | no-source-routing | no-timestamp | none | record-route | router-alert | strict-source-routing | timestamp; Default: ) 匹配IPv4头的选项。
- any - 匹配至少有一个IPv4选项的数据包。
- loose-source-routing - 匹配带有松散源路由选项的数据包。该选项用于根据源提供的信息对互联网数据报进行路由。
- no-record-route - 匹配没有记录路由选项的数据包。这个选项用于根据源提供的信息对互联网数据报进行路由。
- no-router-alert - 匹配没有路由器改变选项的数据包
- no-source-routing - 匹配没有源路由选项的数据包
- no-timestamp - 匹配没有时间戳选项的数据包
- record-route - 匹配带有record route选项的数据包
- router-alert - 匹配带有router alter选项的数据包
- strict-source-routing - 匹配具有严格源路由选项的数据包
- timestamp - 匹配有时间戳的数据包
jump-target (name; Default: ) 要跳到的目标链名称。只适用于 action=jump 的情况。
layer7-protocol (name; Default: ) 第七层协议菜单中定义的第七层过滤器名称。
limit (integer,time,integer; Default: ) 匹配数据包,直到超过给定的PPS限制。参数按下列格式编写。count[/time],burst.
- count - 以每一time间隔的数据包为单位的最大平均数据包速率
- time - 指定测量数据包速率的时间间隔(可选,如果不指定将使用1s)。
- burst - 不按包率计算的数据包的数量
log (yes | no; Default: no) 在系统日志中添加一条信息,包含以下数据:in-interface, out-interface, src-mac, protocol, src-ip:port->dst-ip:port, 和包长度。
log-prefix (string; Default: ) 在每条日志信息的开头添加指定的文本。如果配置了 action=loglog=yes 则适用。
out-bridge-port (name; Default: ) 如果出站接口是网桥,则为数据包离开路由器的实际接口。
out-interface (; Default: ) 数据包离开路由器的接口。
packet-mark (no-mark | string; Default: ) 匹配通过mangle设施标记为特定数据包标记的数据。如果设置了无标记,该规则将匹配任何无标记的数据包。
packet-size (integer[-integer]:0...65535; Default: ) 匹配指定大小或大小范围的字节的数据包。
per-connection-classifier (ValuesToHash:Denominator/Remainder; Default: ) PCC匹配器允许将流量分为相等的流,并能够将具有特定选项集的数据包保留在一个特定的流中。
port (integer[-integer]: 0...65535; Default: ) 如果任何(源或目的)端口与指定的端口或端口范围列表匹配,则进行匹配。只有当 protocol 是TCP或UDP时才适用。
protocol (name or protocol ID; Default: tcp) 匹配由协议名称或编号指定的特定IP协议。
psd (integer,time,integer,integer; Default: ) 尝试检测TCP和UDP扫描。参数格式如下:"WeightThreshold, DelayThreshold, LowPortWeight, HighPortWeight"。
- WeightThreshold - 来自同一主机的不同目的端口的最新TCP/UDP数据包的总权重,视为端口扫描序列。
- DelayThreshold - 来自同一主机的不同目的端口的数据包的延迟,被视为可能的端口扫描子序列。
- LowPortWeight - 具有特权(<1024)目的端口的数据包的权重
- HighPortWeight - 具有非特权目的端口的数据包的权重
random (integer: 1..99; Default: ) 以一定的概率随机匹配数据包。
routing-mark (string; Default: ) 以特定的路由标记来匹配由mangle标记的数据包。
same-not-by-dst (yes | no; Default: ) 指定在选择新的源IP地址时是否考虑目标IP地址。如果 `action=same' 则适用。
src-address (Ip/Netmaks, Ip range; Default: ) 匹配来源等于指定IP或属于指定IP范围的数据包。
src-address-list (name; Default: ) 根据用户定义的地址列表匹配数据包的源地址。
src-address-type (unicast | local | broadcast | multicast; Default: ) 匹配源地址类型。
- 单播 - 用于点对点传输的IP地址
- 本地 - 如果一个地址被分配给路由器的一个接口
- 广播 - 数据包发送到子网的所有设备上
- 多播 - 数据包转发到一个定义的设备组中
src-port (integer[-integer]: 0...65535; Default: ) 源端口和源端口范围的列表。只有当协议是TCP或UDP时才适用。
src-mac-address (MAC address; Default: ) 匹配数据包的源MAC地址。
tcp-mss (integer[-integer]: 0...65535; Default: ) 匹配IP包的TCP MSS值。
time (time-time,sat | fri | thu | wed | tue | mon | sun; Default: ) 允许根据数据包的到达时间和日期创建一个过滤器,对于本地产生的数据包,则是离开时间和日期。
to-addresses (IP address[-IP地址]; Default: 0.0.0.0) 用指定的地址替换原始地址。如果动作是dst-nat, netmap, same, src-nat,则适用。
to-ports (integer[-integer]: 0...65535; Default: ) 用指定的端口替换原来的端口。如果动作是dst-nat, redirect, masquerade, netmap, same, src-nat,则适用。
ttl (integer: 0..255; Default: ) 匹配数据包的TTL值。

统计信息

属性 说明
bytes (integer) 规则匹配的字节总数
packets (integer) 规则匹配的数据包总量

显示额外的只读属性:

[admin@MikroTik] > ip firewall nat print stats all
Flags: X - disabled, I - invalid, D - dynamic
# CHAIN ACTION BYTES PACKETS
0 srcnat masquerade 265 659 987

IPv6

从RouterOS v7.1开始支持NAT66。

ipv6/firewall/nat/

属性

属性 说明
action (action name; Default: accept) 如果一个数据包被规则匹配,要采取的动作:
- accept - 接受该数据包。数据包不会被传递给下一个NAT规则。
- add-dst-to-address-list - 将目标地址添加到参数 "address-list "指定的地址列表中。
- add-src-to-address-list - 将源地址添加到参数 "address-list "指定的地址列表中。
- dst-nat - 将IP数据包的目标地址和/或端口替换为 to-addressesto-ports 参数所指定的值
- jump - 跳到由 jump-target 参数值指定的用户定义的链上
- log - 在系统日志中添加一条信息,包含以下数据:in-interface, out-interface, src-mac, protocol, src-ip:port->dst-ip:port和包的长度。在数据包被匹配后,它被传递到列表中的下一个规则,类似于 "穿透"。
- masquerade - 将IP数据包的源端口替换为 to-ports 参数指定的端口,并将IP数据包的源地址替换为由路由设施确定的IP。
- netmap - 创建一个静态的1:1映射,将一组IP地址映射到另一组。通常用于将公共IP地址分配给私人网络中的主机。
- passthrough - 如果数据包被规则匹配,增加计数器并进入下一个规则(对统计有用)。
- redirect - 用 to-ports 参数指定的端口替换IP数据包的目的端口,目的地址替换为路由器的一个本地地址
- return - 将控制权传回发生跳转的链上
- same - 从提供的范围内给一个特定的客户提供相同的源/目的IP地址,用于每次连接。这最常用于那些希望同一客户的多个连接使用同一客户地址的服务。
- src-nat - 用 "to-addresses "和 "to-ports "参数指定的值替换IP包的源地址。
address-list (string; Default: ) 要用的地址列表的名称。如果动作是 "add-dst-to-address-list "或 "add-src-to-address-list "则适用。
address-list-timeout (none-dynamic| none-static| time; Default: none-dynamic) 地址从 address-list 参数指定的地址列表中删除的时间间隔。与 add-dst-to-address-listadd-src-to-address-list 动作一起使用。
- 非动态值(00:00:00)将在地址列表中保留该地址,直到重新启动。
- 非静态的值将使地址永远留在地址列表中,并将包括在配置导出/备份中。
chain (name; Default: ) 指定添加到哪个链的规则。如果输入的内容与已经定义的链名称不一致,将创建一个新的链。
comment (string; Default: ) 规则的描述。
connection-bytes (integer-integer; Default: ) 只有在通过特定连接传输了一定数量的字节时才会匹配数据包。0 - 表示无穷大,例如 connection-bytes=2000000-0 表示如果通过相关连接的传输量超过2MB,该规则就会匹配。
connection-limit (integer,netmask; Default: ) 在达到给定值后,匹配每个地址或地址块的连接。
connection-mark (no-mark | string; Default: ) 匹配通过mangle标记为特定连接标记的数据包。如果设置了 无标记,该规则将匹配任何无标记的连接。
connection-rate (Integer 0...4294967295; Default: ) 连接速率是一个防火墙匹配器,允许根据目前的连接速度来捕获流量。
connection-type (ftp | h323 | irc | pptp | quake3 | sip | tftp;Default: ) 根据连接跟踪助手的信息,匹配来自相关连接的数据包。相关的连接帮助器必须在/ip firewall service-port下启用。
content (string; Default: ) 匹配包含指定文本的数据包。
dscp (integer: 0..63; Default: ) 匹配DSCP IP头。
dst-address (IP/netmask | IP range; Default: ) 匹配目的地等于指定IP或属于指定IP范围的数据包。
dst-address-list (name; Default: ) 根据用户定义的地址列表匹配数据包的目的地址。
dst-address-type (unicast | local | broadcast | multicast; Default: ) 匹配目的地址类型:
- unicast - 用于点对点传输的IP地址
- local - 如果dst-address分配给路由器的一个接口
- broadcast - 数据包发送到子网的所有设备上
- multicast - 数据包转发到一个定义的设备组中
dst-limit (integer[/time],integer,dst-address | dst-port| src-address[/time]; Default: ) 匹配数据包,直到超过给定的PPS限制。与限制匹配器相反,每个目的IP地址/目的端口都有自己的限制。参数按下列格式书写:count[/time],burst,mode[/expire].
- count - 每一 time 间隔的数据包为单位的最大平均数据包速率
- time - 指定测量数据包速率的时间间隔(可选)
- burst - 不计入包率的数据包数量
- mode - 用于限制数据包速率的分类器
- expire - 指定间隔,之后记录的IP地址/端口将被删除(可选)。
dst-port (integer[-integer]: 0...65535; Default: ) 目标端口号或端口号范围的列表,格式为 Range[,Port],例如,dst-port=123-345,456-678
icmp-options (integer:integer; Default: ) 匹配ICMP类型:代码字段
in-bridge-port (name; Default: ) 如果输入的接口是网桥,则为数据包进入路由器的实际接口。
in-bridge-port-list (name; Default: ) 在接口列表中定义的一组接口。与in-bridge-port的作用相同
in-interface (name; Default: ) 数据包进入路由器的接口
in-interface-list (name; Default: ) 在接口列表中定义的一组接口。作用与in-interface相同
ingress-priority (integer: 0..63; Default: )
ipsec-policy (in | out, ipsec | none; Default: ) 匹配IPSec的策略。值按下列格式书写。方向,策略。方向用于选择是匹配用于解封装的策略还是将用于封装的策略。
- in - 在PREROUTING、INPUT和FORWARD链中有效
- out - 在POSTROUTING、OUTPUT和FORWARD链中有效。
- ipsec - 匹配数据包是否接受IPsec处理。
- none - 匹配不受IPsec处理的数据包(例如,IPSec传输数据包)。
例如,如果路由器收到一个IPsec封装的Gre包,那么规则 ipsec-policy=in,ipsec 将匹配Gre包,但规则 ipsec-policy=in,none 将匹配ESP包。
jump-target (name; Default: ) 要跳到的目标链名称。只适用于 action=jump 的情况。
layer7-protocol (name; Default: ) 第七层协议菜单中定义的第七层过滤器名称。
limit (integer,time,integer; Default: ) 匹配数据包,直到超过给定的PPS限制。参数按下列格式编写。count[/time],burst.
- count - 以每一time间隔的数据包为单位的最大平均数据包速率
- time - 指定测量数据包速率的时间间隔(可选,如果不指定将使用1s)。
- burst - 不按包率计算的数据包的数量
log (yes | no; Default: no) 在系统日志中添加一条信息,包含以下数据:in-interface, out-interface, src-mac, protocol, src-ip:port->dst-ip:port, 和包长度。
log-prefix (string; Default: ) 在每条日志信息的开头添加指定的文本。如果配置了 action=loglog=yes 则适用。
out-bridge-port (name; Default: ) 如果出站接口是网桥,则为数据包离开路由器的实际接口。
out-bridge-port-list (name; Default: ) 在接口列表中定义的一组接口。与out-bridge-port的作用相同
out-interface (; Default: ) 数据包离开路由器的接口。
out-interface-list (name; Default: ) 在接口列表中定义的一组接口。与out-interface的作用相同
packet-mark (no-mark | string; Default: ) 匹配通过mangle设施标记为特定数据包标记的数据。如果设置了无标记,该规则将匹配任何无标记的数据包。
packet-size (integer[-integer]:0...65535; Default: ) 匹配指定大小或大小范围的字节的数据包。
per-connection-classifier (ValuesToHash:Denominator/Remainder; Default: ) PCC匹配器允许将流量分为相等的流,并能够将具有特定选项集的数据包保留在一个特定的流中。
port (integer[-integer]: 0...65535; Default: ) 如果任何(源或目的)端口与指定的端口或端口范围列表匹配,则进行匹配。只有当 protocol 是TCP或UDP时才适用。
protocol (name or protocol ID; Default: tcp) 匹配由协议名称或编号指定的特定IP协议。
priority (integer: 0..63; Default:) 匹配数据包设置的新优先级。优先级可以来自VLAN、WMM、DSCP、MPLS EXP位,或者来自set-priority设置的优先级。
random (integer: 1..99; Default: ) 以一定的概率随机匹配数据包。
routing-mark (string; Default: ) 以特定的路由标记来匹配由mangle标记的数据包。
src-address (Ip/Netmaks, Ip range; Default: ) 匹配来源等于指定IP或属于指定IP范围的数据包。
src-address-list (name; Default: ) 根据用户定义的地址列表匹配数据包的源地址。
src-address-type (unicast | local | broadcast | multicast; Default: ) 匹配源地址类型。
- 单播 - 用于点对点传输的IP地址
- 本地 - 如果一个地址被分配给路由器的一个接口
- 广播 - 数据包发送到子网的所有设备上
- 多播 - 数据包转发到一个定义的设备组中
src-port (integer[-integer]: 0...65535; Default: ) 源端口和源端口范围的列表。只有当协议是TCP或UDP时才适用。
tcp-flags (ack | cwr | ece | fin | psh | rst | syn | urg; Default: ) 匹配指定的TCP标志
- ack - 确认数据
- cwr - 拥塞窗口减少
- ece - ECN-echo标志(明确的拥塞通知)。
- fin - 关闭连接
- psh - 推送功能
- rst - 撤销连接
- syn - 新连接
- urg - 紧急数据
src-mac-address (MAC address; Default: ) 匹配数据包的源MAC地址。
tcp-mss (integer[-integer]: 0...65535; Default: ) 匹配IP包的TCP MSS值。
time (time-time,sat | fri | thu | wed | tue | mon | sun; Default: ) 允许根据数据包的到达时间和日期创建一个过滤器,对于本地产生的数据包,则是离开时间和日期。
to-addresses (IP address[-IP地址]; Default: 0.0.0.0) 用指定的地址替换原始地址。如果动作是dst-nat, netmap, same, src-nat,则适用。
to-ports (integer[-integer]: 0...65535; Default: ) 用指定的端口替换原来的端口。如果动作是dst-nat, redirect, masquerade, netmap, same, src-nat,则适用。

统计信息

属性 说明
bytes (integer) 规则匹配的字节总数
packets (integer) 规则匹配的数据包总量

显示额外的只读属性:

ipv6/firewall/nat/print stats