本节包含基于防火墙的负载平衡方法的设置示例。
此示例演示如何使用防火墙管理器、过滤器和NAT规则设置故障转移。
在这个例子中,我们的提供者分配了两个上游链接,一个连接到ether1其他的ether2。我们的本地网络有两个子网192.168.1.0/24和192.168.2.0/24
/ip address add address=10.1.101.18/30 interface=ether1 add address=10.1.200.18/30 interface=ether2 add address=192.168.1.1/24 interface=ether3 add address=192.168.2.1/24 interface=ether4
通过ether1接口的连接被标记为“第一”通过ether2的数据包被标记为“其他”:
/ip firewall mangle add action=mark-connection chain=forward connection-mark=no-mark - new-connection-mark=first out-interface=ether1 passthrough=yes add action=mark-connection chain=forward connection-mark=no-mark - new-connection-mark=other out-interface=ether2 passthrough=yes
当主链路发生故障时,我们将拒绝所有已建立的连接,因此新的连接将通过从链路。当主链路再次返回时也会发生同样的行为,这里我们将防止本地IP泄漏到公共网络,这是其中之一不过缺点:
/ip firewall filter add action=reject chain=forward connection-mark=other out-interface=ether1 reject-with=icmp-network-unreachable添加action=reject chain=forward connection-mark=first out-interface=ether2 reject-with=icmp-network-unreachable
我们将在本地网络中使用src-nat,而不是masquerade,因为我们不想在主链路故障时清除连接,这是masquerade的主要功能之一。我们将用防火墙规则来限制它们(在这个例子的后面):
/ip firewall add action=src-nat chain=srcnat out-interface=ether1 to-address=10.1.101.18 add action=src-nat chain=srcnat out-interface=ether2 to-address=10.1.200.18
我们将添加两条默认路由。与距离我们设置路由优先级的参数:
/ip route add gateway=10.1.101.17 distance=1 check-gateway=ping /ip route add gateway=10.1.200.17
这个例子演示了如果提供程序为所有链接提供来自同一子网的IP地址,如何设置负载平衡。
在这个例子中,我们的提供者分配了两个上游链接,一个连接到ether1另一个是ether2。两条链路的IP地址属于同一子网。我们的本地网络有两个子网192.168.1.0/24和192.168.2.0/2:
/ip address add address=10.1.101.18/24 interface=ether1 add address=10.1.101.10/24 interface=ether2 add address=192.168.1.1/24 interface=ether3 add address=192.168.2.1/24 interface=ether4
IP地址设置好后,连接的路由将被安装为ECMP路由:
[admin@雷竞技网站MikroTik] > /ip route print detail 0 ADC dst-address=10.1.101.0/24 pref-src=10.1.101.18 gateway=ether1,ether2 gateway-status=ether1 reachable,ether2 reachable distance=0 scope=10
在我们的示例中,使用了非常简单的策略路由。让我们开始为每个轧口标记添加路由表:
/路由表add fib name=first add fib name=other
192.168.1.0/24子网的客户端被标记为使用“第一”路由表和192.168.2.0/24使用“其他”子网:
/ip firewall mangle add action=mark-routing chain=prerouting src-address=192.168.1.0/24 new-routing-mark=first add action=mark-routing chain=prerouting src-address=192.168.2.0/24 new-routing-mark=other
伪装我们的本地网络
/ip firewall NAT add action=masquerade chain=srcnat out-interface=ether1 add action=masquerade chain=srcnat out-interface=ether2
同样可以通过设置路由规则来实现。
我们增加了两个网关,一个用于解析“第一”路由表和另一个到“其他”路由表:
/ip route add gateway=10.1.101.1@main routing-table=first add gateway=10.1.101.1@main routing-table=other
PCC匹配器将允许您将流量划分为相等的流,并能够在一个特定的流中保留具有特定选项集的数据包(您可以从src-address, src-port, dst-address, dst-port等指定这组选项)PCC从IP报头中选择字段,并在哈希算法的帮助下将选择的字段转换为32位值。然后将该值除以指定的分母然后将余数与指定的剩余部分,如果相等,则将捕获数据包。可以从报头中选择src-address、dst-address、src-port、dst-port进行操作。
per-connection-classifier= PerConnectionClassifier::= [!ValuesToHash:分母/余数余数::= 0..4294967295(整数)分母:= 1..4294967295(整数)ValuesToHash::= both-address |both-ports|dst-address |src-port|both-address -and-ports|dst-address|dst-port|src-address-and-port
路由器有两个上游节点ether1和ether2的接口10.111.0.2/24和10.112.0.2/24。的ether3接口的IP地址为192.168.1.1/24。
/ip address add address=192.168.1.1/24 network=192.168.0.0 broadcast=192.168.0.255 interface=ether3 add address=10.111.0.2/30 network=10.111.0.0 broadcast=10.111.0.255 interface=ether1 add address=10.112.0.2/30 network=10.112.0.0 broadcast=10.112.0.255 interface=ether2
使用策略路由,可以将所有流量强制到特定的网关,即使流量是从连接的网络发送到主机(而不是网关)。这种方式将产生路由循环,与这些主机的通信将是不可能的。为了避免这种情况,我们需要允许使用默认路由表来连接网络:
/ip firewall mangle add chain=prerouting dst-address=10.111.0.0/30 action=accept in-interface=ether3 add chain=prerouting dst-address=10.112.0.0/30 action=accept in-interface=ether3
首先,有必要管理从外部发起的连接——应答必须通过发出请求的相同接口(来自相同的公共IP)离开。我们将标记所有新进入的连接,以记住接口是什么。
/ip firewall mangle add chain=prerouting in-interface=ether1 connection-mark=no-mark action=mark-connection new-connection-mark=ISP1_conn add chain=prerouting in-interface=ether2 connection-mark=no-mark action=mark-connection new-connection-mark=ISP2_conn
在配置之前mark-routing,我们必须为它们每个创建一个路由表:
/routing/table add fib name=to_ISP1 add fib name=to_ISP2
行动mark-routing只能用在轧轧链上吗输出和prerouting,但轧链prerouting正在捕获所有进入路由器本身的流量。为了避免这种情况,我们将使用dst-address-type = !当地的。在新的PCC的帮助下,我们将根据源地址和目的地址将流量分为两组:
/ip firewall mangle add chain=prerouting in-interface=ether3 connection-mark=no-mark - dest -address-type=!当地的per-connection-classifier=both-addresses:2/0 action=mark-connection new-connection-mark=ISP1_conn add chain=prerouting in-interface=ether3 connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:2/1 action=mark-connection new-connection-mark=ISP2_conn
然后,我们需要用适当的标记标记来自这些连接的所有数据包。由于策略路由只适用于前往互联网的流量,所以不要忘记指定接口内选项:
/ip firewall mangle add chain=prerouting connection-mark=ISP1_conn in-interface=ether3 action=mark-routing new-routing-mark=to_ISP1 add chain=prerouting connection-mark=ISP2_conn in-interface=ether3 action=mark-routing new-routing-mark=to_ISP2 add chain=output connection-mark=ISP1_conn action=mark-routing new-routing-mark=to_ISP1 add chain=output connection-mark=ISP2_conn action=mark-routing new-routing-mark=to_ISP2
由于路由决定已经做出,我们只需要规则来固定所有传出数据包的src地址。如果这个数据包将通过wlan1离开,它将被nat到10.112.0.2,如果通过wlan2,则被nat到10.111.0.2:
/ip firewall NAT add chain=srcnat out-interface=ether1 action=masquerade add chain=srcnat out-interface=ether2 action=masquerade
为每个路由标记创建一条路由
/ip route add gateway=10.111.0.1@main routing-table=to_ISP1 check-gateway=ping add gateway=10.112.0.1@main routing-table=to_ISP2 check-gateway=ping
每条规则都有自己的计数器。当规则接收到数据包时,当前规则的计数器增加1。如果计数器匹配,则“每个”数据包的值将被匹配,并且计数器将被设置为零。
用一条规则匹配50%的流量:
/ip firewall mangle add action=mark-packet chain=prerouting new-packet-mark=AAA n= 2,1;
要将流量分成两个以上的部分,我们可以使用以下配置。第一条规则查看所有数据包并匹配其中的1/3,第二条规则查看2/3的数据包并匹配其中的一半,第三条规则查看并匹配通过前两条规则的所有数据包(所有数据包的1/3):
/ip firewall mangle add action=mark-packet chain=prerouting new-packet-mark=AAA n= 3,1 passthrough=no;add action=mark-packet chain=prerouting - new-packet-mark=BBB n= 2,1 passthrough=no;add action=mark-packet chain= preouting
这个示例是循环负载平衡示例的不同版本。它增加了持久的用户会话,即一个特定的用户将使用相同的源IP地址的所有传出连接。考虑以下网络布局:
路由器有两个上行(WAN)接口,分别为10.111.0.2/24和10.112.0.2/24。LAN接口名称为Local, IP地址为192.168.1.1/24。
/ ip address add address=192.168.1.1/24 network=192.168.1.0 broadcast=192.168.1.255 interface=Local add address=10.111.0.2/24 network=10.111.0.0 broadcast=10.111.0.255 interface=ether2 add address=10.112.0.2/24 network=10.112.0.0 broadcast=10.112.0.255 interface=ether1
所有来自客户的流量,其IP地址之前被放置在地址列表“奇数”立即标记为连接和路由标记“奇数”。然后,根据预路由链中的连续过滤规则,将流量排除在处理之外:
/ ip firewall mangle add chain=prerouting src-address-list=odd in-interface=Local action=mark-connection - new-connection-mark=odd passthrough=yes add chain=prerouting src-address-list=odd in-interface=Local action=mark-routing - new-routing-mark=odd
与上述相同的配置,仅适用于其IP地址先前放置在地址列表“even”中的客户:
/ ip firewall mangle add chain=prerouting src-address-list=even in-interface=Local action=mark-connection - new-connection-mark=even passthrough=yes add chain=prerouting src-address-list=even in-interface=Local action=mark-routing - new-routing-mark=even
首先,我们取每隔一个建立新会话的数据包(注意connection-state=new),并用连接标记“奇数”标记它。因此,属于同一会话的所有连续数据包将携带连接标记“奇数”。注意,我们将这些数据包传递给第二和第三条规则(passthrough=yes)。第二条规则将客户端的IP地址添加到地址列表中,使所有后续会话都通过同一个网关。第三条规则将所有属于“奇数”连接的数据包标记为“奇数”,并停止在预路由链中处理这些数据包的所有其他路由规则:
/ ip firewall mangle add chain=prerouting in-interface=Local connection-state=new nth=2,1 action=mark-connection -mark=odd passthrough=yes add chain=prerouting in-interface=Local action=add-src-to-address-list address-list=odd address-list-timeout=1d connection-mark=odd passthrough=yes add chain=prerouting in-interface=Local connection-mark=odd action=mark-routing - new-routing-mark=odd passthrough=no
这些规则对剩下的一半流量的作用与前三条规则对前一半流量的作用相同。
下面的代码实际上意味着,通过路由器从本地网络发起的每个新连接将被标记为“奇数”或“偶数”,同时带有路由和连接标记。
/ ip firewall mangle add chain=prerouting in-interface=Local connection-state=new nth=2,2 action=mark-connection -mark=even passthrough=yes add chain=prerouting in-interface=Local action=add-src-to-address-list address-list=even address-list-timeout=1d connection-mark=even passthrough=yes add chain=prerouting in-interface=Local connection-mark=even action=mark-routing - new-routing-mark=even passthrough=no
上面的工作很好。然而,在某些情况下,您可能会发现相同的IP地址同时列在ODD和EVEN脚本地址列表中。这种行为会导致需要持久连接的应用出现问题。针对这种情况的一个简单补救方法是将以下语句添加到您的管理规则中,这将确保新连接不会已经是ODD src-address-list的一部分。你必须对ODD规则做同样的处理,这样就可以排除已经是EVEN地址列表一部分的ip:
add chain=prerouting - in-interface=Local connection-state=new n= 2,2 src-address-list=!奇数动作=标记-连接-新连接-标记=偶数直通=是
根据出接口固定源地址:
/ IP firewall NAT add chain=srcnat out-interface=ether1 action=masquerade add chain=srcnat out-interface=ether2 action=masquerade
对于所有标记为“奇数”的流量(因此转换后的源地址为10.111.0.2),我们使用10.111.0.1网关。同样,所有标记为“偶数”的流量都从10.112.0.1网关路由。
/ IP route add st-address=0.0.0.0/0 gateway=10.111.0.1 scope=255 target-scope=10 routing-mark=odd add st-address=0.0.0.0/0 gateway=10.112.0.1 scope=255 target-scope=10 routing-mark=偶数
最后,我们有一个额外的条目,指定来自路由器本身的流量(没有任何路由标记的流量)应该到达10.111.0.2网关:
添加dst-address=0.0.0.0/0 gateway=10.111.0.2 scope=255 target-scope=10