MikroTik RouterOS应用事例讲解
防火墙规则 下面是三条预先设置好了的chains,他们是不被能删除的: · input – 用于处理进入路由器的数据包,即数据包目标IP地址是到达路由器一个接口的IP地址,经过路由器的数据包不会在input-chains处理。 · forward – 用于处理通过路由器的数据包 · output – 用于处理源于路由器并从其中一个接口出去的数据包。
他们具体的区别如下:
当处理一个chain(数据链),策略是从chain列表的顶部从上而下执行的。如果一个数据包满足策略的条件,这时会执行该操作。 我们来看看防火墙过滤原则:
现在我来看事例中的防火墙规则: 我先从input链表开始,这里是对所有访问路由的数据进行过滤和处理: 从input链表的第一条开始执行,这里一共有三条规则: 0 ;; 接受你信任的IP地址访问(src-address=填写信任IP,默认允许任何地址) chain=input src-address=192.168.100.2 action=accept 1 ;;; 丢弃非法连接 chain=input connection-state=invalid action=drop 2 ;;; 丢弃任何访问数据 chain=input action=drop 下面是forward链表
forward链表,一共有7条规则,包括两个跳转到自定义链表ICMP和virus链表: 0 ;;; 接受已建立连接的数据 chain=forward connection-state=established action=accept 1 ;;; 接受相关数据 chain=forward connection-state=related action=accept 2 ;;; 丢弃非法数据包 chain=forward connection-state=invalid action=drop 3 ;;; 限制每个主机TCP连接数为80条 chain=forward protocol=tcp connection-limit=80,32 action=drop 4 ;;; 丢弃掉所有非单播数据 chain=forward src-address-type=!unicast action=drop 5 ;;; 跳转到ICMP链表 chain=forward protocol=icmp action=jump jump-target=ICMP 6 ;;; 跳转到病毒链表 chain=forward action=jump jump-target=virus forward工作过程如下:
在自定义链表ICMP中,是定义所有ICMP(Internet控制报文协议),ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。例如:ping、traceroute、trace TTL等。我们通过ICMP链表来过滤所有的ICMP协议: ICMP链表操作过程: 0 ;;; Ping应答限制为每秒5个包 chain=ICMP protocol=icmp icmp-options=0:0-255 limit=5,5 action=accept 1 ;;; Traceroute限制为每秒5个包 chain=ICMP protocol=icmp icmp-options=3:3 limit=5,5 action=accept 2 ;;; MTU线路探测限制为每秒5个包 chain=ICMP protocol=icmp icmp-options=3:4 limit=5,5 action=accept 3 ;;; Ping请求限制为每秒5个包 chain=ICMP protocol=icmp icmp-options=8:0-255 limit=5,5 action=accept 4 ;;; Trace TTL限制为每秒5个包 chain=ICMP protocol=icmp icmp-options=11:0-255 limit=5,5 action=accept 5 ;;; 丢弃掉任何ICMP数据 chain=ICMP protocol=icmp action=drop 在virus链表中过滤常见的病毒,我可以根据需要在该链表中添加新的病毒对他们做过滤:
Tracking设置 这里我们可以设置是否启用tracking连接跟踪,以及TCP、UDP和ICMP等协议的timeout时间,和TCP-syncookie设置,RouterOS在2.9.16中增加了TCP-syncookie参数。 在使用NAT时需要启用Tracking连接跟踪,如果你的RouterOS没有使用NAT(如在使用bridge模式下),可以选择关闭tracking,降低系统资源。 SYN Cookie原理 SYN Flood是一种非常危险而常见的DoS攻击方式。到目前为止,能够有效防范SYN Flood攻击的手段并不多,而SYN Cookie就是其中最著名的一种 SYN Cookie是对TCP服务器端的三次握手协议作一些修改,专门用来防范SYN Flood攻击的一种手段。它的原理是,在TCP服务器收到TCP SYN包并返回TCP SYN+ACK包时,不分配一个专门的数据区,而是根据这个SYN包计算出一个cookie值。在收到TCP ACK包时,TCP服务器在根据那个cookie值检查这个TCP ACK包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。 事例操作 如何实现其中一条线路掉线后,自动切换到另一条线路 RouterOS 2.9中路由规则增加的两点功能: 1、在RouterOS 2.9路由规则中增加了check-gateway的功能,能检测到网关的线路状态,如果网关无法探测到,便认为网关无法连接,会自动禁止访问网关的数据通过,check-gateway功能的探测时间为10s一个周期。 2、在RouterOS 2.9中具备了对缺省网关的判断,在RouterOS 2.9的任何一个路由表中只能存在一个缺省网关,即到任何目标地址为0.0.0.0/0,没有做路由标记(routing-mark)的规则,如果存在另一个缺省网关则认为是错误,路由将不予以执行。如下图:
从上图我们可以看到,所有访问电信的IP段从10.200.15.1出去,其他的数据走网通的缺省网关出去,在我们可以这些网关的前缀都为“AS”,即确定的静态路由,而在第二排可以看到蓝色一行,他也是一个缺省网关,但因为一个路由表中只能存在一个缺省网关,所有前缀为“S”即静态但不确定的网关,被认为位非法的。如果当202.112.12.12.11网关断线,则10.200.15.1会自动启用,变为缺省路由,实现现在的切换,如下: 当202.112.12.11断线后,check-gateway在10s一个周期后探测到,并将10.200.15.11设置为缺省路由,如果202.112.12.11正常后,系统也将会将202.112.12.11设置为缺省路由,因为他是先于10.200.15.1添加入路由表中。 双线应用案例 这是一个典型的通过一个路由器并使用两条ISP线路接入的环境(比如都是两条电线的ADSL或者LAN接入): 成都网大科技有限公司 当然,你可以选择负载均衡!这里有多种方法可以选择,只是根据你的环境,选择最适合你解决方案。 基于用户端IP地址的策略路由 如果你有很多的主机地址,你可以通过IP地址将他们分组。这时,指定源IP地址,发送的传输通过ISP1或者ISP2的网关出去。 让我们假设终端电脑的网络地址段为192.168.100.0/24,IP分配如下: · 192.168.100.1-127分配到A组 · 192.168.100.128-253 分配到B组 · 192.168.100.254路由器本地IP地址(即内网的网关)
现在,我们通过子网划分的方式,将终端电脑进行分组: · A组为192.168.100.0/25,地址范围:192.168.100.0-127 · B组为192.168.100.128/25,地址范围:192.168.100.128-255
如果你不能理解,请你查阅TCP/IP的相关教材或通过网上查找相关的子网划分资料!我们需要添加两个ip firewall mangle的规则,标记来至A组和B组终端电脑的数据包。 定义A组: 链表为chain=prerouting,源地址:src-address=192.168.100.0/25 操作为Action=mark routing并定义新的路由标记GroupA. Copyright . CDNAT - 8 - www.mikrotik.com.cn
最好做一个注释,以便以后便于你自己或者别人查看和处理。 定义B组: 链表为chain=prerouting,源地址:src-address=192.168.100.128/25 操作为Action=mark routing并定义新的路由标记GroupB 所有来至终端电脑的IP传输都通过路由标记为GroupA或者GroupB。这样我们可以标记到路由表中(routing table)。 下面,我们需要定义两个默认路给相应的路由标记和网关:
到这里,如果你没有对路由器做NAT的伪装,请在/ip firewall nat里添加src- Address=192.168.100.0/24 action=masquerade,在终端电脑上测试一下跟踪路由是否正确定义两个分组的默认路由: A组测试如下情况: C:\>tracert -d 8.8.8.8 Tracing route to 8.8.8.8 over a maximum of 30 hops 1 2 ms 2 ms 2 ms 192.168.100.254 2 10 ms 4 ms 3 ms 10.1.0.1 ... B组测试如下情况: C:\>tracert -d 8.8.8.8 Tracing route to 8.8.8.8 over a maximum of 30 hops 1 2 ms 2 ms 2 ms 192.168.100.254 2 10 ms 4 ms 3 ms 10.5.8.1 ... 如何做端口的策略路由: MikroTik RouterOS可以支持多种策略路由,如我们常见的源地址、目标地址,同样支持端口的策略路由,多种规则可以根据用户情况配合使用,如下图:
现在我们通过下面的图解一步步实现端口的策略路由: 我们有两个ISP接入的线路,一个是WAN1: 211.162.172.23,一个是WAN2: 218.112.109.27(地址为假设),我们让默认的数据通过WAN1,让访问网页的数据通过WAN2。 现在我们定义访问网页的端口,访问网页的端口是TCP 80端口,我们进入/ip firewall mangle中做数据标记
首先我们标记80端口的连接,标记名为“http”然后我们从这些连接中提取我们想要的数据: 之后我们从标记中提取路由标记,命名为“web”,因为我们在前面的连接标记中做过了passthrough的设置,在这里就不用在重复设置。 然后我们进入/ip route,配置路由我们让标记好的80端口路由去WAN2的线路:
在这里,我们也可以通过/ip route rule来定义端口的规则: 让定义的web标记在一次回到web路由表中去查找网关。 透明传输整形器(Transparent Traffic Shaper) 这个事例将介绍如何配置一个透明传输整形器。透明整形器是建立在一个桥上,能区分和优先考虑什么样的传输通过。 现在考虑下面的网络拓扑:
在这里配置一组队列限制,一个客户端的总的通过量和三个子队列(HTTP、P2P和其他的传输数据),HTTP传输将优先在其他传输之上。 快速配置 配置代码(可以复制到MikroTik RouterOS执行): / interface bridge add / interface bridge port add interface=ether2 bridge=bridge1 add interface=ether3 bridge=bridge1 / ip firewall mangle add chain=prerouting protocol=tcp dst-port=80 action=mark-connection \ new-connection-mark=http_conn passthrough=yes add chain=prerouting connection-mark=http_conn action=mark-packet \ new-packet-mark=http passthrough=no add chain=prerouting p2p=all-p2p action=mark-connection \ new-connection-mark=p2p_conn passthrough=yes add chain=prerouting connection-mark=p2p_conn action=mark-packet \ new-packet-mark=p2p passthrough=no add chain=prerouting action=mark-connection new-connection-mark=other_conn \ passthrough=yes add chain=prerouting connection-mark=other_conn action=mark-packet \ new-packet-mark=other passthrough=no / queue simple add target-addresses=10.0.0.12/32 max-limit=256000/512000 add parent=main packet-marks=http max-limit=240000/500000 add parent=main packet-marks=p2p max-limit=64000/64000 add parent=main packet-marks=other max-limit=128000/128000 分析 下面将解释每段代码的具体实现: Bridge / interface bridge add / interface bridge port add interface=ether2 bridge=bridge1 add interface=ether3 bridge=bridge1 建立一个新的bridge接口,并分配2个以太网卡给他:这样可以在两个网络间实现透明桥的功能 Mangle / ip firewall mangle add chain=prerouting protocol=tcp dst-port=80 action=mark-connection \ new-connection-mark=http_conn passthrough=yes add chain=prerouting connection-mark=http_conn action=mark-packet \ new-packet-mark=http passthrough=no 所有符合TCP端口80及HTTP协议传输的数据,将标记为数据包标记为http ,注意:第一条规则设置为passthrough=yes,第二条为passthrough=no. / ip firewall mangle add chain=prerouting p2p=all-p2p action=mark-connection \ new-connection-mark=p2p_conn passthrough=yes add chain=prerouting connection-mark=p2p_conn action=mark-packet \ new-packet-mark=p2p passthrough=no add chain=prerouting action=mark-connection new-connection-mark=other_conn \ passthrough=yes add chain=prerouting connection-mark=other_conn action=mark-packet \ new-packet-mark=other passthrough=no 同上面所述,P2P传输被标记为数据包标记 p2p 并将剩下的传输标记为other. Queues / queue simple add target-addresses=10.0.0.12/32 max-limit=256000/512000 创建一个队列,限制所有聪客户端来的流量传输为(指定客户端的target-address)256k/512k. / queue simple
add parent=main packet-marks=http max-limit=240000/500000 add parent=main packet-marks=p2p max-limit=64000/64000 add parent=main packet-marks=other max-limit=128000/128000 所有子队列排列入main 父系, 因此所有的带宽流量不会超过指定的main 队列注意:http 队列优先级高于其他队列,级HTTP流量将优先考虑。 如果配置到电信网通的流量控制 对于电信和网通的IP地址段是已知,那么我们可以通过通过地址标记来实现对这些地址的流量控制,首先我们将电信和网通的地址段导入RouterOS的address-list中(可以在www.mikrotik.com.cn下载到) 通过import命令,导入地址列表: 导入后我们可以在/ip firewall address-list中找到: 配置数据标记mangle 进入/ip firewall mangle设置,这里我们定义访问电信的流量控制,我们的内网地址段为192.168.0.0/24,所有这里我们配置源地址src-address=192.168.0.0/24。在mangle中先标记连接,然后在从连接中提取数据包:
定义标记类型: 源代码: / ip firewall mangle add chain=prerouting src-address=192.168.0.0/24 dst-address-list=Telecom action=mark-connection new-connection-mark=Telecom passthrough=yes comment="" 现在从标记的连接Telecom中提取数据包:
源代码: / ip firewall mangle add chain=prerouting connection-mark=Telecom action=mark-packet new-packet-mark=TEL passthrough=no comment="" 配置simple queue 现在我们进入/queue simple对列中配置流控规则,在这里我们把到电信的带宽控制在1M上行和2M下行 源代码:
/ queue simple add dst-address=0.0.0.0/0 interface=all parent=none packet-marks=TEL direction=both priority=8 queue=default-small/default-small limit-at=0/0 max-limit=1000000/2000000 total-queue=default-small 这样对电信的带宽控制便完成,控制网通带宽同样的 PPTP借线操作 假设一个接入点A有电信和网通两条线路,并做了以网通为主,电信为静态路由策略设置。而另一个接入点B接入了网通的线路,并且想通过PPTP隧道的方式借用接入点A的电信线路,现在看下面的图例 根据上面的案例,接入点A和B他们都是共同使用了网通的线路,这里网通两个点之间的延迟小于10ms,网络延迟小才能保证足够的网速给B做电信的访问。首先建立从接入点B到A的PPTP隧道,我们在接入点A设置PPTP服务器,在接入点B设置客户端。这里接入点A的网通IP地址为202.112.12.10,B网通地址为202.112.12.12。 配置PPPTP-Server 在接入点A启用PPTP-Server,并设置密码传输的加密类型: 在这里Default-Profile我们采用default-encryption,同样你也可以在PPTP-Server的profiles中创建自己的规则。Keepalive-Timeout是PPTP-Server主动使用ICMP协议探测客户端是否在线,如果客户端使用了防火墙或禁止ICMP探测,那无法探测到客户端,Server就会主动断开该客户端的连接,这个设置需要用户自己根据网络情况判断。
设置Profile定义客户和主机的访问地址: 在这里我们给PPTP-Server分配的IP地址为192.168.100.1(local-address) ,给客户端分配的地址为192.168.100.2(remote-address) 。分配IP地址也可以通过账号设置Secrets进行,在这里我们只有一个客户端所有可以直接通过profile中的规则设置,如果有多个客户端也可以通过/ip pool中的地址池做DHCP的分配。 配置limit参数: 在limit参数中,我们可以看到idle-timeout,这个是客户端在没有流量超过1分钟后,就断开客户端。Rate-limit是对该类用户的流量控制这里设置的上行为512K,下行1M的带宽。最后是only-one该账户是否为唯一,这里设置为yes。 设置客户端的账号密码:
进入secret设置账号和密码以及相关信息,设置好name和password后,选择service服务类型为pptp,profile规则为default-encryption。这样PPTP-Server就已经设置完成。 配置PPTP-Client 完成PPTP服务设置后,现在开始设置接入点B的PPTP-Client,进入PPP选项添加PPTP-Client: 进入dial-out设置PPTP拨号信息,在server-address的地址为202.112.12.10级接入点A的网通地址:
设置账号和密码分别为cdnat,设置完成后,便可以与接入点A的PPTP-Server连接。 路由配置 在这里接点A和B都做了IP地址的NAT转换,且接点A已经做了电信的静态路由规则,即A点可以实现访问网通和电信的分流,在A点不需要在做任何设置。B点就需要指定通过AB两点间的PPTP隧道到电信的线路,他指定的网关为A点的PPTP的IP地址(192.168.100.1) 设置电信访问的网关: 通过编辑电信的路由脚本,并导入路由表中,则实现了通过PPTP隧道使用A接入点的电信线路,完成了借线功能。
|
|