为了更好的理解RouterOS的防火墙,特地给大家补一下科学知识,ROS的防火墙,其实运作的就是iptables,也为四表五链。这篇文章教你快速理解ROS的防火墙,看懂了也就懂iptables是什么原理了。
四表五链大致如下。
1.四表:
Raw表——关闭连接追踪机制。用在prerouting,output链上。
Mangle表——拆解报文,分析报文,修改报文。用在prerouting,input,forward,output,postrouting链路上。
Nat表——网络地址转换,用在prerouting,output,postrouting链路上。
Filter表——负责过滤功能,用在input,forward,output链路上。
每个表优先级:
Raw>Mangle>Nat>Filter
2.五链
A.input——进来的数据包应用此规则链中的策略
(经过了第一次路由选择的数据包)
B.output
——外出的数据包应用此规则链中的策略
(经过了第二次路由选择的数据包)
C.forward
——转发数据包时应用此规则链中的策略
(经过了第一次路由选择的数据包)
D.prerouting
——对进来的数据包作路由选择前应用此链中的规则(还没有经过任何路由选择的所有数据包进来的时侯都先由这个链处理)
E.postrouting
——对出去的数据包作路由选择后应用此链中的规则(经过了所有的路由选择的所有数据包出来的时侯都先由这个链处理)
先看五链的图:
也许有人会问,为什么要判断两次路由呢?
其实路由是判断这个数据从哪里来到哪里去,要不要路由器出手干活,可以这么理解:
A.网关IP是路由器,但是不需要内核处理的数据,如内网对内网,只要经过一次判断就一条直线传出去了。
B.目的IP是路由器,且需要内核处理的数据,如内网对公网、公网对内网,都要拐个弯处理。因为涉及修改IP数据的处理。
所以,第一次是判断是否要路由器出手处理,第二次是修改完IP数据之后决定往哪个接口(网关)上面送数据。慢慢理解,不要急。
然后就是ROS里面用的链和表的关系图,告诉你链可以在哪里被处理。
看起来还是很烦,那么如何选用合适的链处理规则呢?
五链可以这样快速理解:
A.input——处理进来路由器的的数据包。(目的IP在路由器上的)
B.output——处理从路由器出去的数据包。
C.forward——数据包源IP和目的IP都不在路由器上的。
D.prerouting——外面进来路由器接口的数据包。
E.postrouting——路由器从接口送出去的数据包。
这样子就很好理解了。
以上就是RouterOS的防火墙一个大致处理过程。
3.规则是怎么处理的
任何数据经过路由器都会经过链式处理,我们在合适的地方配置规则,匹配了,就可以进行相应的处理。
那么怎么选择合适的链路进行配置,配置的处理动作又有那些呢?下一章节我们开始介绍下ROS防火墙的每个表是如何设置规则的。
防火墙过滤规则案例
此教程用途:
内网IP过滤:如禁止某些IP上网。
外网IP过滤:禁止访问某些外网IP。
一、内网IP过滤:如禁止某些IP上网
拓扑如下:
两台机器均可上网!
现在只允许254机器上网,不允许253机器上网。
那么我们要如何操作呢?
新建一条防火墙过滤规则:
动作为丢弃:
效果:
PC-1是毫无压力可以访问的,毕竟没有被拦截。
原理分析:
在第一次路由之后,因为从第四口进来的数据包源IP和目的IP都不在路由器上的。就要选用forward链来进行转发,然后通过NAT源地址出去。此时我们在Fliter表进行拦截forward链的数据,即可完成禁止符合规则的IP上网。
那么为什么能ping通网关呢?
因为网关的地址在第一次路由后就是另一个方向了,目的地址在ROS路由器上。
二、禁止访问某些外网IP
同理,还是要使用到forward链
假设我禁止访问8.8.8.8,针对所有的内网192.168.11.0/24的IP。
我们只需要新加一条规则
动作还是选择丢弃!
测试效果
其实Mikrotik ROS 的过滤过滤规则还可以应用在路由与路由之间的过滤限制,和vlan之间的过滤限制,但是我们还没有接触这些东西,所以到时候我们接着讲这些内容。
防火墙NAT映射-端口映射
本教程用途:
有IPV4公网IP的企业需要把内网网站,CRM,ERP等服务器能在公网访问。
那么什么是端口映射(Port-Forwarding),那么就是要了解一下NAT和NAPT。
NAT是网络地址转换。
NAPT是网络地址端口转换。
NAT是用于地址对地址的转换,如内网地址对公网地址转换。,后来发现这个没卵用,数量上远远不够用。然后我们摸索了TCP/IP协议,借助其16bit的端口容量,创新使用了NAPT技术,将一个IP可以扩展为65535个端口,终于又撑过了一轮设备数量的大爆发。
那么端口映射和这个有什么关系呢?
我们用电脑上网的时候,就是基于端口去访问,端口可以重复使用,简称端口复用。
如我们使用65162端口去访问服务器的443端口,路由器帮我们记录这条信息(NAPT映射表)并NAPT后送出去外网。外网服务器也会通过443将数据传回给我们65162端口,路由器再帮NAPT我们送回电脑,这样我们就能通讯了。
路由器的NAPT表:
但是这个端口是临时的,我们刷新页面后,本地的端口就会刷新,换成不同的端口,原先这个65162端口,可能等着再次被使用。如此,路由器就这样孜孜不倦的帮我们换来换去,我们就能有足够的端口去访问网络。
换一个方向,我们作为服务器,服务器的程序会监听特定的端口,用客户上门。那么我们就需要把这个特定端口永久分给服务器,保证客户通过这个地址和端口就能找到服务器。这就是端口映射。
那么RouterOS的端口映射是如何实现?
有请拓扑:
网站内网IP:192.168.11.252,网站端口是80
路由器公网IP:100.1.1.121
Win7电脑IP: 100.1.1.254
此时我们WIN7电脑需要访问我们的内网服务器,是怎样实现?
首先我们需要通过NAPT开放我们的80端口到外网去。
在RouterOS里面,点击IP>Firewall,选择NAT,新建一条规则:
然后在Action(动作)里面,
这个时候,我们就把公网的80端口永久分配给内网网站的80端口,
测试效果如下:
为什么没显示端口呢?因为这是HTTP协议默认就是80端口。所以浏览器不会显示你的80端口,但是如果你将映射的公网地址端口修改成8888,这时候就可以显示你的端口。
另外要注意的一点就是,国内的ISP环境,如果你没有去申请备案的话,80端口,8080端口和443端口都是没办法使用的,因为在运营商的网络里面,你没有向通管局申请备案,这些端口是关闭的,这时候我们就要用别的端口来去代替。
以上,就是ROS的端口映射教程,通过这样的操作,我们还可以去映射远程桌面,映射其他的服务等,不过建议大家映射公网端口时候注意,一定要选一些高位端口来映射,为什么?以后在安全篇再说。
防火墙NAT映射-端口回流
本教程适用于:
在内网里面使用公网地址去访问内网的服务器。
有点拗口,通俗来说,就是用一个公网IP就能内外网通吃,不用内网一个和外网一个的记。
端口回流,学名 Hairpin NAT。望文生义,就是发夹弯一样的NAT,当我们内网电脑使用公网地址访问网站服务器的时候,我们路由器立刻转手帮回送给网站服务器,就不用去走公网。
好处是:这样子不会受制于公网带宽限制,我们也不用记太多的访问方式。
但是在有些下一代防火墙来说,可能会使用DNS-Mapping这种方式,RouterOS自然也能。但是作为一个路由器,我们还是先讲一下IP层面的做法。其实很简单:
1.新加规则
动作设置为masquerade(伪装)
效果显示:
2.原理如图:
192.168.11.251访问公网100.1.1.121的8888端口时,路由器帮助我们的192.168.11.252伪装成公网地址100.1.1.121:8888回复给我们。前提是一定要要有下图的第3条防火墙规则才可以伪装成功,毕竟端口回流依赖于端口映射。
以上就是端口回流的做法,无论在内网还是在外网,我们都只需要记住公网地址就可以通用访问。
防火墙Mangle
RouterOS mangle 简介
Mangle是一个数据包分析,但是很多RouterOS都喜欢称其为标记,但实际上标记只是mangle的一部分功能而已。
Mangle的翻译就是压碎,撕烂的意思,在路由器里面就是拆开包来研究,然后重新组合。我们就是通过mangle规则来分析数据包里面含有的关键信息,然后进行重新归类,标记,或者修改其中部分的参数。在ROS里面Mangle主要分为以下三类,以及对应的动作如下:
1.分析关注,对匹配规则的数据包进行分析关注,不对包进行其他操作
2.分析标记,对匹配规则的数据包进行分析标记,加上标记。
3.分析调整,对匹配的数据包进行拆包修改,修改数据并且重新封装。
Mangle是ROS里面动作(Action)最多的一个表,也是五链最全的,贯穿整个数据流程,见下图橙色部分:
Mangle规则的配置,就需要理解OSI七层模型和常用的数据协议包的组成原理。这样我们才能在配置Mangle规则的时候能最大化的保证数据传输效率。下一章我们以TCP/UDP协议来深入探讨一下网络传输中的一些常见问题。
防火墙Mangle-修改MSS
本章用途:
处理端到端的网络问题,如常见的网页打不开,QQ能上。
网页显示不全,如图片不显示等。
分支互联中的访问问题。
主要理解区域间路由和服务器和客户端的传输过程。
一、应用操作
1.首先说一下如何修改MSS:
进入IP>Firewall>Mangle,点击+号新建一个规则,如下:
然后在高级选项里面:
动作选项
PPPOE的MTU是1480
2.结果对比:
未修改前,SYN请求多少MSS,相应的回包也就是多少的载荷payload
SYN请求
这就是回复的载荷数据大小。
修改1420后,如下三图:
SYN请求:
对应回传的:
二、概念理解:
MTU,Maximum Transmission Unit最大传输单元,工作数据链路层,属于OSI第二层。
IP,Internet Protocol Address互联网协议地址,工作在网络传输层,属于OSI第三层。
TCP,Transmission Control Protocol 传输控制协议,工作在传输层,属于OSI第四层。
UDP,User Datagram Protocol用户数据报协议,工作在传输层,属于OSI第四层。
MSS,Maximum Segment Size,最大报文段长度,是TCP协议一个子项,也是工作在OSI第四层。
MSS=MTU-40 — 40包含了20字节的IP头和20字节的TCP头
三、TCP中MSS原理通俗理解:
服务器有一个货柜,空箱40T,载重1460T,连带货物刚好也是1500T。,要发给我们!
网络就好比有许多的传送转发站(路由器),连接不同的传送带,有1500T的,有1400T的。
1400T传送带上面的货柜空箱还是40T,但是载重只有1360T。
当服务器的货从1500T的传送带转发到1400T的传送带时候,货柜就要拆分重新装柜,1460T的货物就要分为两个柜,一个装1360T,一个装100T,这明显增加了转发站的工作量,进出都要拆包和重新打包,然后在到我们手上的时候,我们的本地的路由器要把这两个柜重新装成1460T的一个柜发给我们。我们就能看到页面了,原理很完美!
但是这个时候就会导致转发站十分繁忙,因为一次的事情要做两次,所以忙中出错导致没封装完整的事情。
另外经过不同的转发站时候,有些转发站会限制你的PIR速率(Peak Information Rate,峰值信息速率),达到PIR速率直接丢包,这样导致了我们本地路由器收到的货不对板,等待了许久也收到不到剩下的包,所以无法在我们的本地的转发站上面将这些货柜按照相应的顺序装好返给我们,只能丢弃。所以我们就半天都打不开网站页面,最后除了一些小货柜能收到(文字)。
问题来了,TCP不是会重传吗?
是的,TCP会重传,但是服务器端发出的数据给我们就开始等我们说收到了(ACK),但是我们收不到包,没发回复ACK,服务器等了一会,基于使命必达原因给我们重传,我没还是没有收到包,没发回复ACK,第一次等1秒,第二次等2秒,第三次等4秒,一般默认重传15次。如此类推,直到重传超时RTO,切断连接。
RTO在Linux最小为200毫秒,最大120秒,可以在内核中设置该项值。
Router OS也可以在防火墙里面设置连接追踪的时间
四、修改MSS的好处
修改了MSS的大小,就是主动向服务器协商发送给我们路由器的每个包有效载荷是多少,这样可以让数据包在传输路径中可以一次性传送回来给我们,降低我们因为被分片所导致丢包问题,如果丢包的话,也好区分丢分了哪些包。简单来说就是在外部转发路径中尽量减少拆分和封装的流程,只在我们路由器上面重组。
五、为什么只建议修改MSS,不修改MTU
很好的问题,别因为我们在OSI四层中,不是只有TCP协议,还有UDP!
MSS是依赖TCP的,修改了MTU可以降低MSS,同时也会降低我们UDP的传输效率。我们还有许多也是基于UDP协议的,如QQ,IP电话,和视频会议等。
所以我们建议修改MSS而不是MTU,除非你的路由不支持MSS修改。
0