مقدمه
دو لینک ۱۰۰ و ۵۰ مگابیتی با یک default route تکرارشده، توزیع ظرفیت قابل تضمین ندارند. PCC اتصالها را وزندهی میکند؛ failover باید در هر routing table و مسیر پاسخ آزموده شود.
چرا مثال اجرایی از PCC استفاده میکند؟
| معیار | ECMP | PCC |
|---|---|---|
| مکانیزم | انتخاب مسیر بین Next Hopهای همهزینه | تقسیم Connectionها با Hash و Connection Mark |
| کنترل توزیع | وابسته به Routing و Hash پیادهسازی | قابل طراحی با Bucketهای Classifier |
| مسیر پاسخ | برای Sessionهای NAT نیازمند بررسی مستقل است | با Connection Mark و Routing Mark کنترل میشود |
موضوع نسخه قدیمی، Load Balancing نامتقارن با Failover بود و ECMP را راهکار معرفی میکرد. این هدف حفظ شده است؛ مثال RouterOS v7 برای تقسیم ۲ به ۱ از PCC استفاده میکند تا نسبت Bucket و مسیر پاسخ صریح باشد. نسبت Connectionها تضمین نسبت پهنای باند نیست؛ رفتار Hash، NAT و Failover باید روی همان نسخه آزموده شود.
مثال عملی
LAN برابر 10.10.10.0/24 است. WAN1:192.168.30.2/30 با GW .1 و WAN2:172.30.30.2/30 با GW .1. این آدرسها فقط lab هستند؛ روی Production با نقشه IPAM جایگزین شوند.
پیشنیازها
RouterOS v7؛ patch دقیق و architecture را با /system resource print ثبت کنید. دستورات v6 را بدون بازبینی وارد v7 نکنید.
سختافزار و ظرفیت: روتر یا CHR آزمایشگاهی با پورتهای مجزا؛ ظرفیت CPU، RAM و connection tracking باید زیر بار واقعی اندازهگیری شود.
نرمافزار و دسترسی: Terminal از شبکه مدیریت، حساب دارای policy لازم برای write؛ Safe Mode با Ctrl+X، export خارج دستگاه و console مستقل پیش از تغییر. نمونه روی lab بدون routing policy و DNAT موجود؛ ether1=WAN1، ether2=WAN2، ether3=LAN با IP و gatewayهای زیر از قبل تنظیم شوند.
Architecture / Design
LAN new connection → PCC buckets 0/1→WAN1 و 2→WAN2 → connection mark → routing table → srcnat. پاسخ ورودی از هر WAN باید همان WAN را انتخاب کند. وزن تعداد اتصال است، نه تضمین نسبت بایت یا جمع سرعت یک دانلود.
Installation / Configuration
پیش از تغییر export، route و ruleهای FastTrack را بررسی کنید. در canary FastTrack را برای اتصالهای marked مستثنا کنید؛ در lab میتوان rule fasttrack موجود را موقت disable کرد.
/ip address print
/ip route print detail
/ip firewall mangle print detail
/ip firewall filter print where action=fasttrack-connection
/routing table add name=ent-wan1 fib
/routing table add name=ent-wan2 fib
/ip firewall address-list add list=ent-local address=10.10.10.0/24
/ip firewall address-list add list=ent-local address=192.168.30.0/30
/ip firewall address-list add list=ent-local address=172.30.30.0/30
/ip firewall mangle add chain=prerouting in-interface=ether3 dst-address-list=ent-local action=accept comment="ENT-PCC local bypass"
/ip firewall mangle add chain=prerouting in-interface=ether1 connection-state=new connection-mark=no-mark action=mark-connection new-connection-mark=ent-c1 comment="ENT-PCC incoming WAN1"
/ip firewall mangle add chain=prerouting in-interface=ether2 connection-state=new connection-mark=no-mark action=mark-connection new-connection-mark=ent-c2 comment="ENT-PCC incoming WAN2"
/ip firewall mangle add chain=prerouting in-interface=ether3 dst-address-type=!local connection-state=new connection-mark=no-mark per-connection-classifier=both-addresses-and-ports:3/0 action=mark-connection new-connection-mark=ent-c1 comment="ENT-PCC bucket0"
/ip firewall mangle add chain=prerouting in-interface=ether3 dst-address-type=!local connection-state=new connection-mark=no-mark per-connection-classifier=both-addresses-and-ports:3/1 action=mark-connection new-connection-mark=ent-c1 comment="ENT-PCC bucket1"
/ip firewall mangle add chain=prerouting in-interface=ether3 dst-address-type=!local connection-state=new connection-mark=no-mark per-connection-classifier=both-addresses-and-ports:3/2 action=mark-connection new-connection-mark=ent-c2 comment="ENT-PCC bucket2"
/ip firewall mangle add chain=prerouting in-interface=ether3 dst-address-type=!local connection-mark=ent-c1 action=mark-routing new-routing-mark=ent-wan1 passthrough=no comment="ENT-PCC route1"
/ip firewall mangle add chain=prerouting in-interface=ether3 dst-address-type=!local connection-mark=ent-c2 action=mark-routing new-routing-mark=ent-wan2 passthrough=no comment="ENT-PCC route2"
/ip firewall mangle add chain=output connection-mark=ent-c1 action=mark-routing new-routing-mark=ent-wan1 passthrough=no comment="ENT-PCC reply1"
/ip firewall mangle add chain=output connection-mark=ent-c2 action=mark-routing new-routing-mark=ent-wan2 passthrough=no comment="ENT-PCC reply2"
/ip route add dst-address=0.0.0.0/0 gateway=192.168.30.1 routing-table=main distance=1 check-gateway=ping comment="ENT-PCC main1"
/ip route add dst-address=0.0.0.0/0 gateway=172.30.30.1 routing-table=main distance=2 check-gateway=ping comment="ENT-PCC main2"
/ip route add dst-address=0.0.0.0/0 gateway=192.168.30.1@main routing-table=ent-wan1 distance=1 check-gateway=ping comment="ENT-PCC table1 primary"
/ip route add dst-address=0.0.0.0/0 gateway=172.30.30.1@main routing-table=ent-wan1 distance=2 check-gateway=ping comment="ENT-PCC table1 backup"
/ip route add dst-address=0.0.0.0/0 gateway=172.30.30.1@main routing-table=ent-wan2 distance=1 check-gateway=ping comment="ENT-PCC table2 primary"
/ip route add dst-address=0.0.0.0/0 gateway=192.168.30.1@main routing-table=ent-wan2 distance=2 check-gateway=ping comment="ENT-PCC table2 backup"
/ip firewall nat add chain=srcnat src-address=10.10.10.0/24 out-interface=ether1 action=masquerade comment="ENT-PCC nat1"
/ip firewall nat add chain=srcnat src-address=10.10.10.0/24 out-interface=ether2 action=masquerade comment="ENT-PCC nat2"
rules بالا روی lab پاک با firewall از قبل امن اجرا شوند؛ در سایت موجود با ruleهای قبلی merge و duplicate route/NAT حذف شود. subnetهای VPN/DC به ent-local افزوده شوند. ابتدا چند صد اتصال تازه بسازید؛ counters bucket0+1 باید تقریباً دو برابر bucket2 باشد، نه الزاماً bytes. WAN1 را در lab قطع و route فعال هر table و برقراری اتصال تازه را بررسی کنید.
Security Hardening
NAT جای firewall نیست. input WAN default deny و forward فقط LAN مجاز باشد. مسیر داخلی نباید به policy WAN فرستاده شود. مدیریت روتر از LAN/console برقرار بماند؛ DNAT موجود نیازمند آزمون symmetry مستقل است.
Monitoring
برای هر WAN availability، packet loss، latency و utilization مستقل ثبت شود. check-gateway=ping فقط gateway را میسنجد؛ قطع بالادست ISP با gateway زنده را کشف نمیکند. recursive probe یا کنترل چند مقصد مستقل نیاز طراحی و آزمون جدا دارد.
Troubleshooting
توزیع دیده نمیشود: اتصالهای قدیمی و FastTrack را بررسی کنید. پاسخ از WAN غلط: connection-mark و output/prerouting counters. route inactive: next-hop در main و gateway scope. banking session حساس به public IP: مقصد را pin یا classifier both-addresses انتخاب کنید و وزن را دوباره بسنجید.
Backup / Recovery
export قبل تغییر حفظ شود. rollback به ترتیب disable mangleهای ENT-PCC، restore route/NAT قبلی و disable route/NAT جدید است؛ tableها فقط پس از نبود reference حذف شوند. connection state را کورکورانه flush نکنید. با تغییر public IP، نشست TCP ممکن است قطع شود و reconnect لازم است؛ failover حفظ همه sessionها را تضمین نمیکند.
Best Practices
ECMP equal-cost و PCC weighted را تفکیک کنید؛ یک flow سرعت دو لینک را جمع نمیکند. gateway failure و upstream failure دو آزمون جدا باشند.
نسخههای قدیمی و Compatibility
routing-mark در دستور /ip route نسخه v6 با routing-table v7 یکسان نیست. تکرار gateway برای وزندهی در نسخه جدید مبنای قابل اتکای طراحی نیست؛ مقاله با URL تاریخی حفظ و طراحی به PCC ارتقا یافته است.
پرسشهای متداول
آیا وزن ۲ به ۱ یعنی پهنایباند دقیق ۲ به ۱؟
خیر؛ وزن بر اتصالها اعمال میشود و اندازه flowها متفاوت است.
آیا failover نشست TCP را حفظ میکند؟
با تغییر public IP ممکن است نشست قطع شود و اتصال دوباره لازم باشد.
منابع رسمی
تاریخ بررسی منابع: 2026-09-30. اعتبارسنجی عملی روی محیط هدف باید پیش از انتشار تغییر زیرساخت انجام شود.