防火墙过滤(firewallfilter)
在RouterOS 通过ip firewall 能对IP数据包过滤、P2P协议过滤、源和目标IP、端口、IP协议、协议(ICMP、TCP、MSS等)、网络接口、对内部的数据包和连接作标记、ToS字节、内容过滤、顺序优先与数据频繁和时间控制、包长度控制...
从数据传输上分类:分为input、foreward和output三种链表(chain)过滤,不管是二层或者三层过滤上都包含这三个链表。RouterOS的防火墙包括了对address-list和L7-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 协议过滤
7 层协议过滤
IPv6 防火墙过滤
数据传输分类:
o 源 MAC 地址
o IP 地址(网段或列表)和地址类型(广播、本地、组播)
o 端口或端口长度
o IP 协议
o 协议选择选项(ICMP 类型和代码字段、TCP 标记、IP 选项和MSS)
o Interface 的数据包从那里到达或通过那里里去
o 内部数据流与连接标记
o ToS (DSCP)
o 数据包内容
o Connection-rate 连接速率
o PCC 分离器
o 数据包大小
o 包到达时间
基本过滤规则
防火墙操作是借助于防火墙的策略,一个策略规则是告诉路由器如何处理一个 IP 数据包,每一条策略都由两部分组成,一部份是传输状态配置和定义如何操作数据包。数据链(Chains)是为更好的管理和组织策略。
过滤功能有三个默认的数据链(chains):input, forward 和output 他们分别负责从哪里进入路由器的、通过路由器转发的与从路由器发出的数据。用户也可用自定义添加链,当然这些链没有默认的传输配置,需要在三条默认的链中对action=jump 策略中相关的jump-target 进行配置。
过滤链
下面是三条预先设置好了的 chains,他们是不被能删除的:
input – 用于处理进入路由器的数据包,即数据包目标IP 地址是到达路由器一个接口的IP 地址,经过路由器的数
据包不会在input-chains 处理。
forward – 用于处理通过路由器的数据包
output – 用于处理源于路由器并从其中一个接口出去的数据包。
他们具体的区别如下:
IP 数据包进入input 链表的数据工作流程:
IP 数据包进入output 链表的流程:
IP 数据进入forward 链表的流程
当处理一个 chain(数据链),策略是从chain列表的顶部从上而下执行的。如果一个数据包满足策略的条件,这时会执行该操作。
防火墙过滤方式
我们明白input、forward、output三种链表针对不同方向数据处理功能后,来看看防火墙方式,一般来说只有两种方式,即先接受后丢弃或者先丢弃后介绍。
以上两种方式通过图可以很好的理解,在整个filter中,当规则为空时,默认是接收所有数据通过,我们通常情况下最多的方式是加入拒绝那些数据通过,即先丢弃后接收。
防火墙-自定义链表
RouterOS防火墙能自定义链表,即在filter中,可以由管理员自定义防火墙策略,然后通过jump命令调用自定义链表的过滤策略,这样有利于对过滤策略的分类和管理。
防火墙过滤流程
在firewall中,不管是filter、nat、mangle等都遵循一个处理原则FIFO(first in first out),这个和早期的simple queue一样(V6.0后simple queue不在遵循FIFO原则),理解如图:
假设我们有A、B、C、D、E等五个数据,当第一个规则处理了A数据,继续向下传递时,第二条规则中,不会出现A数据,第二条规则处理B数据,当然在后面的规则也不会出现B数据。整个流程先处理先通过,规则越靠前,就越优先处理,即从上往下的一个执行过程。
不过在firewall中action有一个命令是passthrough,即让该规则直接通过,后面的规则也能对之前处理过的数据再一次处理。
防火墙过滤事例之input事例
对所有访问路由的数据进行过滤和处理,下面是一个对路由器保护的策略配置
、
配置命令如下:
[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链表,则是在对由外向内或由内向外的一种过滤方式。
命令方式配置如下:
[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,在这个表里面包含了常见的或及时发现的一些***端口或应用协议
配置命令:
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表示。
注:RouterOS从V5.0开始支持connection-limit对UDP连接的限制,即在次之前RouterOS只能对TCP协议做连接限制。
Output是对有路由器主动发出的数据进行过滤,这类数据需要限制的很少,所以在此就不具体讲解,操作与input类似。
防火墙过滤-jump规则的使用
在filter规则中我们多次使用到jump指令,该指令可以让我们将指定的数据转向我们自定义的链表中,进行过滤,下面我们举例forward链表中通过jump工作过程:
在winbox中的jump设置
虽然我们可以一次将所有规则在forward或inpu等链表中配置,但对于分类管理和查找非常不便,jump操作让我们可以将各类过滤规则分类,如我们企业网络,可以将员工IP地址和经理IP地址段区分开;在校园网络可以将学生IP和教师IP段分开;在ISP网络中可以将应用数据进行特点分类等等…
例如:我们定义一个classes分类的过滤链表,下面是通过winbox配置,我们对学生的IP地址段192.168.10.0、24进行分类跳转。
设置action为jump,jump-target用于指定链表,也可以用于创建一个新链表,这里取名为classes
这样我们可以进入classes里设置所需的规则,由于jump规则已经选择了192.168.10.0/24的用户地址,在classes链表中,我们无需设置src-address的IP地址,简化了配置。
通过点击下拉菜单进入classes链表
在自定义链表 ICMP 中,是定义所有ICMP(Internet控制报文协议),ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。例如:ping、traceroute、traceTTL 等。我们通过ICMP链表来过滤所有的ICMP协议:
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协议包括ping、traceroute、traceTTL等网络探测参数,你可以通过配置防火墙限制或拒绝ICMP协议的传输。当我们需要对ICMP某一类参数区分限制时,需要使用到ICMP类型代码。
下面是 ICMP 类型列表:通常下面的ICMP传输建议被允许通过
Ping
o 8:0 –回应请求
o 0:0 –回应答复
Trace
o 11:0 –TTL 超出
o 3:3 –端口不可到达
路径 MTU 探测
o 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连接。
防火墙过滤-建立基于协议的自定义链表
基于TCP、UDP和ICMP协议的分类链表:
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菜单下设置content为www.mikrotik.com,设置action=drop
防火墙过滤-域名过滤
在RouterOS中能实现相应的文字内容过滤,即content属性设置,对一些明文传输的字符进行过滤,特别是web中的内容,我们可以通过content过滤掉一个域名或者web页面的一个数字或字母的关键字。
如下过滤掉访问www.mikrotik.com的域名,我们添加一条规则是forward,在advanced菜单下设置content为www.mikrotik.com,设置action=drop
防火墙过滤-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 在防火墙中增加了一个新得功能——7 层协议过滤。针对一些应用程序如skype、QQ、MSN、魔兽世界……网络程序做限制和过滤。
在防火墙Layer7-protocol 目录下,你可以添加正则表达式字符串协议,定义他们的名称,并在防火墙filter 目录下丢弃他们的数据。这个功能将不会查看单独的数据包,会查看整个数据的相关连接,收集数据直到第10 个数据包或者2kb 数据,来执行第一次操作
下面介绍一下具体方法的使用:7 层协议过滤增加在ip firewall 中Layer7 Protocols,我们可以在下面的图中看到:
7 层协议通过Regexp 脚本编写相应应用程序的过滤代码,Regexp 可以通过网上搜索相关资料了解。在这里我们已经提供了一些常用程序的7层协议脚本:
我们就可以在ip firewall 中通过Layer7 Protocols 参数调用,并做相应的规则处理,下面是一个在防火墙得FilterRules里面调用L7脚本
设置禁止QQ:
注意:L7 禁止QQ 的规则设置好后,需要重启才能生效。
其他的操作也同以上设置类似,如果需要对 IP 地址或者IP段控制可以通过src-address或者dst-address进行设置。
防火墙-DMZ配置事例
DMZ 是英文“demilitarized zone”的缩写,中文名称为“隔离区”,也称“非军事化区”。它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区,这个缓冲区位于企业内部网络和外部网络之间的小网络区域内,在这个小网络区域内可以放置一些必须公开的服务器设施,如企业Web 服务器、FTP 服务器和论坛等。另一方面,通过这样一个DMZ 区域,更加有效地保护了内部网络,因为这种网络部署,比起一般的防火墙方案,对***者来说又多了一道关卡。
路由器一般需要3 张网卡(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>