概述
策略路由是将符合特定条件的流量引导到特定网关的方法。这可以用于强制来自服务器的某些客户或特定协议(例如HTTP流量)始终被路由到某个网关。它甚至可以用来引导本地和海外的流量到不同的网关。
RouterOS实现了几个可以用来完成上述任务的组件:
路由表
路由规则
防火墙mangle标记
路由表
一台路由器可以有多个路由表,它们有自己的一组路由,将同一个目的地路由到不同的网关。
可以从“/routing/table”菜单中查看和配置表。
缺省情况下,RouterOS只有 main 路由表:
[admin@rack1_b33_CCR1036] /routing/table> print
Flags: D - dynamic; X - disabled, I - invalid; U - used
0 D name="main" fib
如果需要自定义路由表,在使用之前,应该在菜单中定义它。
考虑一个基本的例子,有两个网关172.16.1.1和172.16.2.1,希望只在名为 myTable 的路由表中解析到网关172.16.2.1的8.8.8.8:
/routing table add name=myTable fib
/ip route add dst-address=8.8.8.8 gateway=172.16.1.1
/ip route add dst-address=8.8.8.8 gateway=172.16.2.1@main routing-table=myTable
为了让用户创建的表能够解析目的地,主路由表也应该能够解析目的地。
在示例中,主路由表也应该有一条到目的地址8.8.8.8的路由,或者至少有一条缺省路由,因为缺省路由是由DHCP动态添加的,出于安全考虑,最好在主表中也添加8.8.8.8。
[admin@rack1_b33_CCR1036] /ip/route> print detail Flags: D - dynamic; X - disabled, I - inactive, A - active;
c - connect, s - static, r - rip, b - bgp, o - ospf, d - dhcp, v - vpn, m - modem, y - cop
y;
H - hw-offloaded; + - ecmp
DAd dst-address=0.0.0.0/0 routing-table=main pref-src="" gateway=172.16.1.1
immediate-gw=172.16.1.1%ether8 distance=1 scope=30 target-scope=10
vrf-interface=ether8 suppress-hw-offload=no
0 As dst-address=8.8.8.8/32 routing-table=main pref-src="" gateway=172.16.1.1
immediate-gw=172.16.1.1%ether8 distance=1 scope=30 target-scope=10 suppress-hw-offload=no
DAc dst-address=172.16.1.0/24 routing-table=main gateway=ether8 immediate-gw=ether8
distance=0 scope=10 suppress-hw-offload=no local-address=172.16.1.2%ether8
DAc dst-address=172.16.2.0/24 routing-table=main gateway=ether7 immediate-gw=ether7
distance=0 scope=10 suppress-hw-offload=no local-address=172.16.2.2%ether7
1 As dst-address=8.8.8.8/32 routing-table=myTable pref-src="" gateway=172.16.2.1
immediate-gw=172.16.2.1%ether7 distance=1 scope=30 target-scope=10 suppress-hw-offload=no
但是上面的配置还不够,需要一种方法来强制流量使用新创建的表。RouterOS提供了两种选择:
防火墙mangle-它提供了更多的控制标准,用于引导流量,例如,每个连接或每个包平衡等。有关如何使用mangle标记的更多信息,请参阅 [防火墙标记]
(https://help.mikrotik.com/docs/display/ROS/Firewall+Marking) 示例。
路由规则-一组基本参数,可用于快速引导流量。这就是例子中要用到的方法。
不建议同时使用这两种方法,否则您应该确切地知道自己在做什么。如果确实需要在同一设置中同时使用mangle和路由规则,那么请记住,mangle具有更高的优先级,这意味着如果mangle标记的流量可以在表中被解析,那么路由规则将永远不会看到该流量。
路由表的数量限制为4096个唯一表。
路由规则
路由规则允许基于基本参数(如源地址、目的地址或接口内)以及其他参数来控制流量。
在这个例子中,希望选择目的地址为8.8.8.8的流量,并且不返回到 main 表:
/routing rule add dst-address=8.8.8.8 action=lookup-only-in-table table=myTable
假设知道客户连接到ether4,并且只希望该客户将8.8.8.8路由到特定的网关。可以用以下规则:
/routing rule add dst-address=8.8.8.8 action=lookup-only-in-table table=myTable interface=ether4
如果由于某种原因,表中使用的网关发生故障,那么整个锁将失败,并且目的地将不可达。在active-backup设置中,我们希望流量能够回到 main 表。要做到这一点,将操作从' lookup-only-in-table’更改为' lookup'。
此外,路由规则可以用作“基本的防火墙”。如果不想让连接到ether4的客户访问192.168.1.0/24网络:
/routing rule add dst-address=192.168.1.0/24 interface=ether4 action=drop
路由规则可以使用的所有参数列表:
| 属性 | 说明 |
|---|---|
| action (drop | lookup | lookup-only-in-table | unreachable) | 对匹配数据包采取的动作: - drop -无声地丢弃数据包。 - lookup - 在路由表中进行查找。 - lookup-only-in-table -只在指定的路由表中查找(参见table参数)。 - unreachable - 生成ICMP不可达报文,并返回给源。 |
| comment (string) | |
| disabled (yes | no) | 禁用规则未使用。 |
| dst-address() | 要匹配的报文的目的地址。 |
| interface (string) | 匹配的输入接口。 |
| min-prefix (integer[0..4294967295]) | 相当于Linux IP规则' suppress_prefixlength '。例如,如果要抑制路由决策中的缺省路由,则将该值设置为0。 |
| routing-mark (string) | 匹配特定的路由标记。 |
| src-address (string) | 匹配报文的源地址。 |
| table (name) | 要查找的路由表名。 |