شبکه / میکروتیک

Load balancing چند اینترنت در میکروتیک با PCC

Load balancing میکروتیک با PCC؛ تقسیم ترافیک بین چند اینترنت در RouterOS 7، جدول‌های مسیریابی جدا، mangle، تقسیم نامساوی، مسیر پشتیبان و خاموش کردن fasttrack.

نوشته‌ی تیم پیکوگاید آخرین بازبینی فنی: ۵ دقیقه مطالعه
در این صفحه
  1. مرحله‌ی ۱: جدول‌های مسیریابی
  2. مرحله‌ی ۲: علامت گذاری ارتباط‌ها
  3. مرحله‌ی ۳: مسیرها
  4. مرحله‌ی ۴: NAT
  5. مرحله‌ی ۵: fasttrack
  6. تقسیم نامساوی
  7. کدام classifier؟
  8. اینترنت PPPoE یا DHCP
  9. بررسی
  10. مشکلات رایج

PCC (Per Connection Classifier) ارتباط‌های جدید را بر اساس یک hash بین اینترنت‌ها تقسیم می‌کند و هر ارتباط تا آخر از همان اینترنتی عبور می‌کند که شروع شده. نتیجه این است که مجموع پهنای باند دو اینترنت استفاده می‌شود، بدون این که یک ارتباط وسط کار IP عوض کند. این راهنما دو اینترنت با IP ثابت را فرض می‌کند؛ تفاوت اینترنت PPPoE و DHCP در انتها آمده است.

اینترنت ۱ اینترنت ۲
پورت ether1 ether2
gateway 203.0.113.1 198.51.100.1

شبکه‌ی داخلی در فهرست اینترفیس LAN قرار دارد (روش ساخت در کانفیگ اولیه‌ی روتر میکروتیک).

مرحله‌ی ۱: جدول‌های مسیریابی

در RouterOS 7 هر مسیر علامت دار به یک جدول مسیریابی جدا نیاز دارد:

/routing table
add name=to-isp1 fib
add name=to-isp2 fib

مرحله‌ی ۲: علامت گذاری ارتباط‌ها

/ip firewall mangle
add chain=prerouting in-interface=ether1 connection-mark=no-mark action=mark-connection new-connection-mark=isp1-conn passthrough=yes comment="inbound via ISP1"
add chain=prerouting in-interface=ether2 connection-mark=no-mark action=mark-connection new-connection-mark=isp2-conn passthrough=yes comment="inbound via ISP2"
add chain=prerouting in-interface-list=LAN dst-address-type=!local connection-mark=no-mark per-connection-classifier=both-addresses:2/0 action=mark-connection new-connection-mark=isp1-conn passthrough=yes comment="PCC 1/2"
add chain=prerouting in-interface-list=LAN dst-address-type=!local connection-mark=no-mark per-connection-classifier=both-addresses:2/1 action=mark-connection new-connection-mark=isp2-conn passthrough=yes comment="PCC 2/2"
add chain=prerouting in-interface-list=LAN connection-mark=isp1-conn action=mark-routing new-routing-mark=to-isp1 passthrough=no
add chain=prerouting in-interface-list=LAN connection-mark=isp2-conn action=mark-routing new-routing-mark=to-isp2 passthrough=no
add chain=output connection-mark=isp1-conn action=mark-routing new-routing-mark=to-isp1 passthrough=no
add chain=output connection-mark=isp2-conn action=mark-routing new-routing-mark=to-isp2 passthrough=no

منطق قانون‌ها:

  • دو قانون اول: ارتباطی که از بیرون از اینترنت ۱ وارد شده (مثلاً port forwarding یا Winbox از راه دور)، جوابش هم باید از اینترنت ۱ برود. بدون این قانون‌ها، جواب ممکن است از اینترنت دیگر برگردد و ارتباط برقرار نشود.
  • قانون‌های PCC: both-addresses:2/0 یعنی hash آدرس مبدأ و مقصد را بر ۲ تقسیم کن؛ باقی مانده‌ی ۰ به اینترنت ۱ و باقی مانده‌ی ۱ به اینترنت ۲. dst-address-type=!local ترافیکی را که مقصدش خود روتر است (مثل DNS روتر) از این تقسیم خارج می‌کند.
  • قانون‌های mark-routing: هر ارتباط علامت دار را به جدول مسیریابی خودش می‌فرستند؛ هم برای ترافیک کاربران (prerouting) و هم برای ترافیک خود روتر (output).

توضیح جدول mangle و connection tracking را در فایروال میکروتیک: filter، NAT و mangle ببینید.

مرحله‌ی ۳: مسیرها

هر جدول یک مسیر اصلی و یک مسیر پشتیبان از اینترنت دیگر دارد تا با قطع یک اینترنت، ارتباط‌های جدید از اینترنت سالم عبور کنند:

/ip route
add dst-address=0.0.0.0/0 gateway=203.0.113.1 routing-table=to-isp1 check-gateway=ping distance=1
add dst-address=0.0.0.0/0 gateway=198.51.100.1 routing-table=to-isp1 check-gateway=ping distance=2
add dst-address=0.0.0.0/0 gateway=198.51.100.1 routing-table=to-isp2 check-gateway=ping distance=1
add dst-address=0.0.0.0/0 gateway=203.0.113.1 routing-table=to-isp2 check-gateway=ping distance=2
add dst-address=0.0.0.0/0 gateway=203.0.113.1 check-gateway=ping distance=1 comment="main table"
add dst-address=0.0.0.0/0 gateway=198.51.100.1 check-gateway=ping distance=2 comment="main table backup"

check-gateway=ping هر ۱۰ ثانیه gateway را ping می‌کند و اگر جواب ندهد، مسیر را غیرفعال می‌کند. توجه کنید این فقط سالم بودن gateway را می‌سنجد، نه دسترسی واقعی به اینترنت؛ اگر مشکل پشت gateway (در شبکه‌ی سرویس دهنده) باشد، تشخیص داده نمی‌شود. برای تشخیص دقیق‌تر باید به جای gateway یک آدرس بیرونی را با recursive routing بسنجید؛ روش کامل در Failover دو اینترنت در میکروتیک آمده است.

مرحله‌ی ۴: NAT

/ip firewall nat
add chain=srcnat out-interface=ether1 action=masquerade
add chain=srcnat out-interface=ether2 action=masquerade

مرحله‌ی ۵: fasttrack

/ip firewall filter disable [find action=fasttrack-connection]

تقسیم نامساوی

اگر اینترنت ۱ دو برابر اینترنت ۲ پهنای باند دارد، ارتباط‌ها را به سه بخش تقسیم کنید و دو بخش را به اینترنت ۱ بدهید:

قانون مقدار PCC اینترنت
۱ both-addresses:3/0 ۱
۲ both-addresses:3/1 ۱
۳ both-addresses:3/2 ۲

کدام classifier؟

مقدار رفتار مناسب برای
both-addresses یک کاربر با یک سایت همیشه از یک اینترنت بیشتر شبکه‌ها؛ سایت‌های بانکی و سامانه‌هایی که نشست را به IP وابسته می‌کنند
both-addresses-and-ports هر ارتباط جدا تقسیم می‌شود توزیع یکنواخت‌تر، با احتمال خطا در سایت‌های حساس به IP
src-address هر کاربر همیشه از یک اینترنت ساده‌ترین رفتار قابل پیش بینی

اینترنت PPPoE یا DHCP

  • PPPoE: به جای IP، نام اینترفیس را به عنوان gateway بدهید؛ مثلاً gateway=pppoe-out1. قانون‌های mangle و NAT را هم با pppoe-out1 بنویسید، نه ether1.
  • DHCP: gateway ممکن است عوض شود. در /ip dhcp-client گزینه‌ی add-default-route=no را بگذارید و با اسکریپت dhcp-client مسیرهای جدول‌ها را هنگام تغییر gateway به روز کنید.

بررسی

/ip firewall connection print where connection-mark=isp1-conn
/ip firewall connection print where connection-mark=isp2-conn
/interface monitor-traffic ether1,ether2

دو خروجی اول نشان می‌دهند ارتباط‌ها تقریباً مساوی بین دو اینترنت تقسیم شده‌اند؛ خروجی سوم ترافیک زنده‌ی هر پورت را.

مشکلات رایج

  • همه‌ی ترافیک از اینترنت ۱ می‌رود: fasttrack هنوز روشن است، یا قانون‌های PCC به خاطر شرط in-interface-list=LAN اجرا نمی‌شوند (اینترفیس داخلی در فهرست LAN نیست).
  • بعضی سایت‌ها مدام از حساب کاربری خارج می‌شوند: از both-addresses-and-ports به both-addresses برگردید.
  • port forwarding فقط روی یکی از اینترنت‌ها کار می‌کند: دو قانون اول mangle (علامت گذاری ارتباط‌های ورودی) را جا انداخته‌اید.

مسیر کامل راهنماهای میکروتیک در راهنمای جامع میکروتیک آمده است.

منابع

  1. MikroTik Documentation — Mangle help.mikrotik.com
  2. MikroTik Documentation — Policy Routing help.mikrotik.com