防火墙过滤(firewallfilter

RouterOS 通过ip firewall 能对IP数据包过滤、P2P协议过滤、源和目标IP、端口、IP协议、协议(ICMPTCPMSS等)、网络接口、对内部的数据包和连接作标记、ToS字节、内容过滤、顺序优先与数据频繁和时间控制、包长度控制...

从数据传输上分类:分为inputforewardoutput三种链表(chain)过滤,不管是二层或者三层过滤上都包含这三个链表。RouterOS的防火墙包括了对address-listL7-protocol等调用

快速设置向导

 添加一条firewall 规则,将所有通过路由器到目标协议为TCP,端口为135 的数据包丢弃掉:

/ipfirewall filter add chain=forward dst-port=135 protocol=tcp action=drop

 拒绝通过Telnet 访问路由器(协议 TCP, 端口 23)

/ip firewallfilter add chain=input protocol=tcp dst-port=23 action=drop

操作路径/ip firewall filter

网络防火墙始终保持对那些有威胁敏感的数据进入内部网络中,无论怎样网络都是连接在一起的,总是会有某些从外闯入你的LAN,窃取资料和破坏内部网络。适当的配置防火墙可以有效的保护网络。

MikroTikRouterOS 是功能非常强大的防火墙,包括以下特征:

 包过滤功能

 P2P 协议过滤

 层协议过滤

 IPv6 防火墙过滤

 数据传输分类:

源 MAC 地址

IP 地址(网段或列表)和地址类型(广播、本地、组播)

端口或端口长度

IP 协议

协议选择选项(ICMP 类型和代码字段、TCP 标记、IP 选项和MSS)

Interface 的数据包从那里到达或通过那里里去

内部数据流与连接标记

ToS (DSCP)

数据包内容

Connection-rate 连接速率

PCC 分离器

数据包大小

包到达时间

基本过滤规则

防火墙操作是借助于防火墙的策略,一个策略规则是告诉路由器如何处理一个 IP 数据包,每一条策略都由两部分组成,一部份是传输状态配置和定义如何操作数据包。数据链(Chains)是为更好的管理和组织策略。

过滤功能有三个默认的数据链(chains):inputforward output 他们分别负责从哪里进入路由器的、通过路由器转发的与从路由器发出的数据。用户也可用自定义添加链,当然这些链没有默认的传输配置,需要在三条默认的链中对action=jump 策略中相关的jump-target 进行配置。

过滤链

下面是三条预先设置好了的 chains,他们是不被能删除的:

 input – 用于处理进入路由器的数据包,即数据包目标IP 地址是到达路由器一个接口的IP 地址,经过路由器的数

据包不会在input-chains 处理。

 forward – 用于处理通过路由器的数据包

 output – 用于处理源于路由器并从其中一个接口出去的数据包。

他们具体的区别如下:

IP 数据包进入input 链表的数据工作流程:

防火墙过滤简介1.png

IP 数据包进入output 链表的流程:

防火墙过滤简介2.png

IP 数据进入forward 链表的流程

防火墙过滤简介13.png

当处理一个 chain(数据链),策略是从chain列表的顶部从上而下执行的。如果一个数据包满足策略的条件,这时会执行该操作。


防火墙过滤方式

我们明白inputforwardoutput三种链表针对不同方向数据处理功能后,来看看防火墙方式,一般来说只有两种方式,即先接受后丢弃或者先丢弃后介绍。

防火墙过滤方式1.png

防火墙过滤方式2.png

以上两种方式通过图可以很好的理解,在整个filter中,当规则为空时,默认是接收所有数据通过,我们通常情况下最多的方式是加入拒绝那些数据通过,即先丢弃后接收。


防火墙-自定义链表

RouterOS防火墙能自定义链表,即在filter中,可以由管理员自定义防火墙策略,然后通过jump命令调用自定义链表的过滤策略,这样有利于对过滤策略的分类和管理。

防火墙-自定义链表.png

防火墙过滤流程

firewall中,不管是filternatmangle等都遵循一个处理原则FIFOfirst in first out),这个和早期的simple queue一样(V6.0simple queue不在遵循FIFO原则),理解如图:

防火墙过滤流程.png

假设我们有ABCDE等五个数据,当第一个规则处理了A数据,继续向下传递时,第二条规则中,不会出现A数据,第二条规则处理B数据,当然在后面的规则也不会出现B数据。整个流程先处理先通过,规则越靠前,就越优先处理,即从上往下的一个执行过程。

不过在firewallaction有一个命令是passthrough,即让该规则直接通过,后面的规则也能对之前处理过的数据再一次处理。


防火墙过滤事例之input事例

对所有访问路由的数据进行过滤和处理,下面是一个对路由器保护的策略配置

、 防火墙过滤事例之input事例.png

配置命令如下:

[admin@MikroTik] /ip firewall filter>print

Flags: X - disabled, I - invalid, D -dynamic

0  ;;;                 

    chain=input action=drop connection-state=invalid

1   ;;;             TCP        80

    chain=forward action=drop protocol=tcp connection-limit=80,32

2  ;;;                       

    chain=input action=drop protocol=tcp psd=21,3s,3,1

3  ;;;     DoS   

    chain=input action=tarpit protocol=tcp src-address-list=black_listconnection-limit=3,32

4  ;;;     DoS   

    chain=input action=add-src-to-address-list protocol=tcpaddress-list=black_list address-list-timeout=1d connection-limit=10,32

5  ;;;                 

    chain=input action=drop dst-address-type=!local

6  ;;;       ICMP   

    chain=input action=jump jump-target=ICMP protocol=icmp

7  ;;;                     

    chain=forward action=drop src-address-type=!unicast

8  ;;;           ICMP   

    chain=ICMP action=drop protocol=icmp

9  ;;;               

    chain=forward action=drop connection-state=invalid

10  ;;;       ICMP   

    chain=forward action=jump jump-target=ICMP protocol=icmp

防火墙过滤事例之forward事例

Input是对进入路由器方向数据处理,即input的作用更多的是在为保护路由器做配置,而forward链表,则是在对由外向内或由内向外的一种过滤方式。

防火墙过滤事例之forward事例.png

命令方式配置如下:

[admin@MikroTik] /ip firewall filter>print

Flags: X - disabled, I - invalid, D -dynamic

0  ;;;                 

    chain=forward action=drop connection-state=invalid

1  ;;;                     

    chain=forward action=drop src-address-type=!unicast

2  ;;;               

    chain=forward action=drop connection-state=invalid

3  ;;;             TCP        80  

    chain=forward action=drop protocol=tcp connection-limit=80,32

4  ;;;       ICMP   

    chain=forward action=jump jump-target=ICMP protocol=icmp

5  ;;;               

    chain=forward action=jump jump-target=virus

forward规则仍然包含了丢弃非法数据包和ICMP,也是我们常用的基本配置,在后面我们增加了一个自定义的病毒过滤链表virus,在这个表里面包含了常见的或及时发现的一些***端口或应用协议

防火墙过滤事例之forward事例2.png

配置命令:

13   ;;; Delta.Source.Trojan-3

     chain=virus action=drop protocol=tcpdst-port=4444

14   ;;; Delta.Source.Trojan-7

     chain=virus action=drop protocol=udpdst-port=44444

15   ;;; Drop Blaster Worm

     chain=virus action=drop protocol=tcpdst-port=139

16   ;;; Drop Blaster Worm

     chain=virus action=drop protocol=tcpdst-port=135

17   ;;; Drop Blaster Worm

     chain=virus action=drop protocol=tcpdst-port=445

使用forward方式限制每个主机TCP/UDP连接数为150条,

Chain=forward action=dropconnection-limit=150,32

使用input方式限制每个主机TCP连接数为10条,

Chain=input action=drop protocol=tcpconnection-limit=20,0

对比这两条规则,限制所有主机连接数connection-limit=20,0。而限制每个主机connection-limit=150,32,即每个主机用32表示,所有主机用0表示。

注:RouterOSV5.0开始支持connection-limitUDP连接的限制,即在次之前RouterOS只能对TCP协议做连接限制。

Output是对有路由器主动发出的数据进行过滤,这类数据需要限制的很少,所以在此就不具体讲解,操作与input类似。


防火墙过滤-jump规则的使用

filter规则中我们多次使用到jump指令,该指令可以让我们将指定的数据转向我们自定义的链表中,进行过滤,下面我们举例forward链表中通过jump工作过程:

防火墙过滤-jump规则的使用1.png

winbox中的jump设置

防火墙过滤-jump规则的使用2.png

虽然我们可以一次将所有规则在forwardinpu等链表中配置,但对于分类管理和查找非常不便,jump操作让我们可以将各类过滤规则分类,如我们企业网络,可以将员工IP地址和经理IP地址段区分开;在校园网络可以将学生IP和教师IP段分开;在ISP网络中可以将应用数据进行特点分类等等

例如:我们定义一个classes分类的过滤链表,下面是通过winbox配置,我们对学生的IP地址段192.168.10.024进行分类跳转。

防火墙过滤-jump规则的使用3.png

设置actionjumpjump-target用于指定链表,也可以用于创建一个新链表,这里取名为classes

防火墙过滤-jump规则的使用4.png

这样我们可以进入classes里设置所需的规则,由于jump规则已经选择了192.168.10.0/24的用户地址,在classes链表中,我们无需设置src-addressIP地址,简化了配置。

防火墙过滤-jump规则的使用5.png

通过点击下拉菜单进入classes链表

防火墙过滤-jump规则的使用6.png

在自定义链表 ICMP 中,是定义所有ICMPInternet控制报文协议),ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(TCPUDP)使用。例如:pingtraceroutetraceTTL 等。我们通过ICMP链表来过滤所有的ICMP协议:

防火墙过滤-jump规则的使用7.png

35  ;;; Ping              5   

    chain=ICMP action=accept protocol=icmp icmp-options=0:0-255 limit=5,5

36  ;;; Traceroute          5   

    chain=ICMP action=accept protocol=icmp icmp-options=3:3 limit=5,5

37  ;;; MTU                  5   

    chain=ICMP action=accept protocol=icmp icmp-options=3:4 limit=5,5

38  ;;; Ping              5   

    chain=ICMP action=accept protocol=icmp icmp-options=8:0-255 limit=5,5

39  ;;; Trace TTL          5   

    chain=ICMP action=accept protocol=icmp icmp-options=11:0-255 limit=5,5

40  ;;;                     

    chain=forward action=drop src-address-type=!unicast

41  ;;;           ICMP   

    chain=ICMP action=drop protocol=icmp

防火墙过滤-ICMP类型:代码值

ICMP协议包括pingtraceroutetraceTTL等网络探测参数,你可以通过配置防火墙限制或拒绝ICMP协议的传输。当我们需要对ICMP某一类参数区分限制时,需要使用到ICMP类型代码。

下面是 ICMP 类型列表:通常下面的ICMP传输建议被允许通过

Ping

8:0 回应请求

0:0 回应答复

Trace

11:0 –TTL 超出

3:3 端口不可到达

路径 MTU 探测

3:4 分段存储Fragmentation-DF-Set

一般ICMP 过滤建议:

 允许ping—ICMP回应请求向外发送和回应答复进入

 允许traceroute—TTL超出和端口不可到达信息进入

 允许路径MTU—ICMPFragmentation-DF-Set 信息进入

 阻止其他任何数据

防火墙过滤-action命令说明

Accept – 接受数据包,例如允许数据包通过;

Add-dst-to-address-list – 根据规则条件,将IP数据包的目标地址IP添加到指定address-list

Address-src-to-address-list – 根据规则条件,将IP数据包的源地址IP添加到指定的address-list

Drop – 丢弃掉数据包(不会发送ICMP拒绝信息);

Jump – 跳转到指定的链表;

Log-与之匹配的操作将会记录到log中。

Passthrough – 忽略该规则,并继续执行下一跳规则;

Reject – 拒绝数据包,并发送ICMP拒绝信息;

Return – 通过放回操作,返回到上一条链表;

Tarpit – 捕捉并控制进入的TCP连接。


防火墙过滤-建立基于协议的自定义链表

基于TCPUDPICMP协议的分类链表:

add chain=forward protocol=tcp action=jumpjump-target=tcp

add chain=forward protocol=udp action=jumpjump-target=udp

add chain=forward protocol=icmp action=jumpjump-target=icmp

建立tcp-chain并拒绝一些TCP端口;

add chain=tcp protocol=tcp dst-port=69action=drop comment="deny TFTP"

add chain=tcp protocol=tcp dst-port=111action=drop comment="deny RPC portmapper"

add chain=tcp protocol=tcp dst-port=135action=drop comment="deny RPC portmapper"

add chain=tcp protocol=tcp dst-port=137-139action=drop comment="deny NBT"

add chain=tcp protocol=tcp dst-port=445action=drop comment="deny cifs"

add chain=tcp protocol=tcp dst-port=2049action=drop comment="deny NFS"

add chain=tcp protocol=tcpdst-port=12345-12346 action=drop comment="deny NetBus"

add chain=tcp protocol=tcp dst-port=20034action=drop comment="deny NetBus"

add chain=tcp protocol=tcp dst-port=3133action=drop comment="deny BackOriffice"

add chain=tcp protocol=tcp dst-port=67-68 action=dropcomment="deny DHCP"

udp-chain中拒绝非法的udp端口 deny udp ports in udp chain

add chain=udp protocol=udp dst-port=69action=drop comment="deny TFTP"

add chain=udp protocol=udp dst-port=111action=drop comment="deny PRC portmapper"

add chain=udp protocol=udp dst-port=135action=drop comment="deny PRC portmapper"

add chain=udp protocol=udp dst-port=137-139action=drop comment="deny NBT"

add chain=udp protocol=udp dst-port=2049 action=dropcomment="deny NFS"

add chain=udp protocol=udp dst-port=3133 action=dropcomment="deny BackOriffice"

icmp-chain允许相应的icmp连接:

add chain=icmp protocol=icmpicmp-options=0:0 action=accept

comment="drop invalidconnections"

add chain=icmp protocol=icmpicmp-options=3:0 action=accept \

comment="allow establishedconnections"

add chain=icmp protocol=icmpicmp-options=3:1 action=accept \

comment="allow alreadyestablished connections"

add chain=icmp protocol=icmpicmp-options=4:0 action=accept \

comment="allow sourcequench"

add chain=icmp protocol=icmpicmp-options=8:0 action=accept \

comment="allow echo request"

add chain=icmp protocol=icmpicmp-options=11:0 action=accept \

comment="allow timeexceed"

add chain=icmp protocol=icmpicmp-options=12:0 action=accept \

comment="allow parameterbad"

add chain=icmp action=drop comment="deny all othertypes"add chain=icmp action=drop comment="allowall other types"

防火墙过滤-域名过滤

RouterOS中能实现相应的文字内容过滤,即content属性设置,对一些明文传输的字符进行过滤,特别是web的内容,我们可以通过content过滤掉一个域名或者web页面的一个数字或字母的关键字。

如下过滤掉访问www.mikrotik.com的域名,我们添加一条规则是forward,在advanced菜单下设置contentwww.mikrotik.com,设置action=drop

防火墙过滤-域名过滤1.png

防火墙过滤-域名过滤2.png


防火墙过滤-域名过滤

RouterOS中能实现相应的文字内容过滤,即content属性设置,对一些明文传输的字符进行过滤,特别是web的内容,我们可以通过content过滤掉一个域名或者web页面的一个数字或字母的关键字。

如下过滤掉访问www.mikrotik.com的域名,我们添加一条规则是forward,在advanced菜单下设置contentwww.mikrotik.com,设置action=drop

防火墙过滤-域名过滤1.png

防火墙过滤-域名过滤2.png


防火墙过滤-P2P协议过滤

Peer-to-peer协议即我们所说的用于主机间点对点传输p2p。这个技术有许多优秀的应用如Skype,但同时也带了需要的为许可的软件和媒体在网络中泛滥。甚至影响到http e-mail 的正常使用。RouterOS能识别大多P2P 协议的连接,并能通过QOS 进行过滤,丢弃所有的P2P 协议:

[admin@MikroTik] /ip firewall filter>add chain=forward p2p=all-p2p action=drop

[admin@MikroTik] /ip firewall filter>print chain=forward

Flags: X - disabled, I - invalid, D -dynamic

0 chain=forward action=drop p2p=all-p2p

能探测到该协议的列表:

 Fasttrack (Kazaa,KazaaLite, Diet Kazaa, Grokster, iMesh, giFT, Poisoned, mlMac)

 Gnutella (Shareaza,XoLoX, , Gnucleus, BearShare, LimeWire (java), Morpheus, Phex,Swapper,Gtk-Gnutella (linux), Mutella (linux), Qtella (linux), MLDonkey, Acquisition(MacOS), Poisoned, Swapper, Shareaza, XoloX, mlMac)

 Gnutella2 (Shareaza,MLDonkey, Gnucleus, Morpheus, Adagio, mlMac)

 DirectConnect (DirectConnect(AKA DC++), MLDonkey, NeoModus Direct Connect,

BCDC++, CZDC++ )

 eDonkey (eDonkey2000,eMule, xMule (linux), Shareaza, MLDonkey, mlMac, Overnet)

 Soulseek (Soulseek,MLDonkey)

 BitTorrent (BitTorrent,BitTorrent++, uTorrent, Shareaza, MLDonkey, ABC, Azureus,BitAnarch, SimpleBT,BitTorrent.Net, mlMac)

 Blubster (Blubster,Piolet)

 WPNP (WinMX)

 Warez (Warez, Ares; starting from 2.8.18) –该协议能被丢弃掉(drop),但不能被限制速度


防火墙过滤-L7协议过滤

RouterOSV3.0 在防火墙中增加了一个新得功能——层协议过滤。针对一些应用程序如skypeQQMSN、魔兽世界……网络程序做限制和过滤。

在防火墙Layer7-protocol 目录下,你可以添加正则表达式字符串协议,定义他们的名称,并在防火墙filter 目录下丢弃他们的数据。这个功能将不会查看单独的数据包,会查看整个数据的相关连接,收集数据直到第10 个数据包或者2kb 数据,来执行第一次操作

下面介绍一下具体方法的使用:层协议过滤增加在ip firewall Layer7 Protocols,我们可以在下面的图中看到:

防火墙过滤-L7协议过滤1.png

层协议通过Regexp 脚本编写相应应用程序的过滤代码,Regexp 可以通过网上搜索相关资料了解。在这里我们已经提供了一些常用程序的7层协议脚本:

我们就可以在ip firewall 中通过Layer7 Protocols 参数调用,并做相应的规则处理,下面是一个在防火墙得FilterRules里面调用L7脚本

防火墙过滤-L7协议过滤2.png

设置禁止QQ

防火墙过滤-L7协议过滤3.png

防火墙过滤-L7协议过滤4.png

注意:L7 禁止QQ 的规则设置好后,需要重启才能生效。

其他的操作也同以上设置类似,如果需要对 IP 地址或者IP段控制可以通过src-address或者dst-address进行设置。


防火墙-DMZ配置事例

DMZ 是英文“demilitarized zone”的缩写,中文名称为隔离区,也称非军事化区。它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区,这个缓冲区位于企业内部网络和外部网络之间的小网络区域内,在这个小网络区域内可以放置一些必须公开的服务器设施,如企业Web 服务器、FTP 服务器和论坛等。另一方面,通过这样一个DMZ 区域,更加有效地保护了内部网络,因为这种网络部署,比起一般的防火墙方案,对***者来说又多了一道关卡。

路由器一般需要张网卡(Public 公网,Local 本地网络,DMZ-Zone 非军事区):

[admin@gateway] interface> print

Flags: X - disabled, D - dynamic, R -running

# NAME TYPE RX-RATE TX-RATE MTU

0 R Public ether 0 0 1500

1 R Local ether 0 0 1500

2 R DMZ-zone ether 0 0 1500

[admin@gateway] interface>

 给相应的 Interface 添加对应的IP 地址,如下:

[admin@gateway] ip address> print

Flags: X - disabled, I - invalid, D -dynamic

# ADDRESS NETWORK BROADCAST INTERFACE

0 192.168.0.2/24 192.168.0.0 192.168.0.255Public

1 10.0.0.254/24 10.0.0.0 10.0.0.255 Local

2 10.1.0.1/32 10.1.0.2 10.1.0.2 DMZ-zone

3 192.168.0.3/24 192.168.0.0 192.168.0.255Public

[admin@gateway] ip address>

 添加静态默认路由到本地路由器上

[admin@MikroTik] ip route> print

Flags: X - disabled, I - invalid, D -dynamic, J - rejected,

C - connect, S - static, r - rip, o - ospf,b - bgp

# DST-ADDRESS G GATEWAY DISTANCE INTERFACE

0 S 0.0.0.0/0 r 10.0.0.254 1 ether1

1 DC 10.0.0.0/24 r 0.0.0.0 0 ether1

[admin@MikroTik] ip route>

 配置 DMZ 服务器的IP 地址为IP 地址10.1.0.2,网络地址段10.1.0.1/24,以及网关10.1.0.1

 配置能从因特网访问DMZ 服务的dst-nat 规则,将地址192.168.0.3 配置给DMZ 服务器:

[admin@gateway] ip firewall nat> addchain=dst-nat action=dst-nat \

\... dst-address=192.168.0.3to-dst-address=10.1.0.2

[admin@gateway] ip firewall dst-nat>print

Flags: X - disabled, I - invalid, D – dynamic

0 Chain=dst-nat dst-address=192.168.0.3action=dst-nat to-dst-address=10.1.0.2

[admin@gateway] ip firewall nat>