PCC匹配器允許分離傳輸流做到平衡流量的功能(能指定這個屬性選擇src-address, src-port,dst-address,dst-port)
PCC原理
PCC從一定範圍內分析選擇IP數據包頭,通過哈西散列算法的幫助下,將選定的區域轉換爲32bit值。這個值除以指定Denominator(分母),餘數將比較一個指定的餘數(Remainder),如果相等這時數據包將會被捕獲,你可以選擇src-address,dst-address, src-port, dst-port等使用此操作。
per-connection-classifier=
PerConnectionClassifier::= [!]ValuesToHash:Denominator/Remainder
Remainder ::= 0..4294967295 (integer number)
Denominator ::= 1..4294967295 (integer number)
ValuesToHash ::=src-address|dst-address|src-port|dst-port[,ValuesToHash*]
per-connection-classifier分類器,通過判斷源地址、目標地址、源端口和目標端口,對數據進行分類,如
事例:
這個配置將所有連接基於源地址和端口分類的3個組:
/ipfirewall mangle add chain=prerouting action=mark-connectionnew-connection-mark=1st_conn per-connection-classifier=both-addresses:3/0
/ipfirewall mangle add chain=prerouting action=mark-connectionnew-connection-mark=2nd_conn per-connection-classifier=both-addresses:3/1
/ipfirewall mangle add chain=prerouting action=mark-connectionnew-connection-mark=3rd_conn per-connection-classifier=both-addresses:3/2
per-connection-classifier=both-addresses:3/0,這條規則的含義爲我們對原地址的端口進行分類,3/0爲一共有3條出口,定義第一條,3/1則是第二條,以此類推。
注意:
PCC從RouterOS v3.24開始支持,這個功能解決了多網關的負載均衡問題。
PCC的負載均衡事例
一、雙向地址負載均衡
通分組源地址和源端口實現負載平衡,這裏我們建立2個WAN出口分別是wan1和wan2,網絡環境如下:
·ISP1地址10.200.15.99/24,網關:10.200.15.1;
·ISP2地址10.200.100.99/24,網關:10.200.100.2;
·內網IP地址192.168.100.1/24;
·啓用DNS緩存功能,用192.168.100.1作內網DNS解析;
基本配置
首先進入ip address配置IP地址:
在ip dns setting中配置好DNS緩存,DNS爲:61.139.2.69
Mangle標記配置
接下來我們進入ip firewall mangle標記連接和路由,我們使用per-connection-classifier雙向地址進行分類做連接分類標記。
首先我們需要將進入路由的的鏈接進行標記
如下圖,我們進入一條mangle規則,中的advanced標籤內容可以看到per-connection-classifier分類器,選擇both-addresses的分類:
然後選擇dst-address-type=!local,即除了目標地址是本地以前的地址:
注:2條線的分類代碼定義是第一條線爲2/0,第二條爲2/1
同樣選擇一下地址類型:
下面命令是提取走第一條線路的連接標記取名位1st_conn,並從連接裏提取路由標記名位1st_route,設置:per-connection-classifier=both-addresses:2/0,設置in-interface=lan
/ipfirewall mangle
addaction=mark-connection chain=prerouting comment="" disabled=no \
in-interface=lannew-connection-mark=1st_conn passthrough=yes \
per-connection-classifier=both-addresses:2/0
addaction=mark-routing chain=prerouting comment=""connection-mark=1st_conn \
disabled=no in-interface=lannew-routing-mark=1st_route passthrough=yes
提取走第二條線路的連接標記取名位2nd_conn,並從連接裏提取路由標記名位2nd_route,設置:per-connection-classifier=both-addresses:2/1,設置in-interface=lan:
/ipfirewall mangle
addaction=mark-connection chain=prerouting comment="" disabled=no \
in-interface=lannew-connection-mark=2nd_conn passthrough=yes \
per-connection-classifier=both-addresses:2/1
addaction=mark-routing chain=prerouting comment=""connection-mark=2nd_conn \
disabled=no in-interface=lannew-routing-mark=2nd_route passthrough=yes
在winbox在mangle中設置完成後如下:
回程路由設置
我們需要將從那個口進入就從相應的口回去,即保證每個外網口的數據能得到正確的路由
/ipfirewall mangle
addchain=input in-interface=wan1 action=mark-connectionnew-connection-mark=1st_conn
addchain=input in-interface=wan2 action=mark-connectionnew-connection-mark=2nd_conn
winbox設置
標記完進入接口的鏈接後,將這些鏈接指定到相應的路由標記上:
addchain=output connection-mark=1st_conn action=mark-routingnew-routing-mark=1st_route
addchain=output connection-mark=2nd_conn action=mark-routing new-routing-mark=2nd_route
winbox設置
路由配置
配置完標記後路由後,我們進入ip route配置路由,首先設置負載均衡的標記路由,首先設置第一條線路的路由標記,設置routing-mark=1st_route:
設置第二條線路的路由標記,設置routing-mark=2nd_route:
配置默認網關和備份網關,默認網關的distance設置爲1,並設置check-gateway=ping,通過ping監測網關狀態:
備份網關的distance設置爲2,並設置check-gateway=ping,通過ping監測網關狀態:
配置完成後的路由標如下圖:
配置nat
最後配置nat轉換規則,進入ip firewall nat中配置action=masquerade,分別對2條線路做僞裝:
/ipfirewall nat
addaction=masquerade chain=srcnat out-interface=wan1
addaction=masquerade chain=srcnat out-interface=wan2