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

Failover دو اینترنت در میکروتیک با recursive routing

failover بین دو اینترنت در RouterOS 7 با recursive routing و ping به آدرس بیرونی؛ روش ساده با distance، NAT، اینترنت PPPoE و DHCP، Netwatch و تست قطعی.

نوشته‌ی تیم پیکوگاید آخرین بازبینی فنی: ۱۱ دقیقه مطالعه
در این صفحه
  1. پیش نیازها
  2. روش ساده: distance و check-gateway
  3. چرا روش ساده کافی نیست
  4. روش پیشنهادی: recursive routing
  5. مرحله‌ی ۱: مسیر ثابت به آدرس‌های probe
  6. مرحله‌ی ۲: مسیرهای پیش فرض با gateway بیرونی
  7. scope و target-scope چه می‌کنند
  8. NAT برای هر دو اینترنت
  9. اینترنت PPPoE یا DHCP
  10. جایگزین: Netwatch
  11. تست failover
  12. ارتباط‌های باز بعد از failover
  13. failover یا load balancing
  14. مشکلات رایج

در failover همه‌ی ترافیک از اینترنت اصلی عبور می‌کند و روتر فقط وقتی اینترنت اصلی قطع شد، خودکار به اینترنت پشتیبان می‌رود. در RouterOS 7 روش قابل اعتماد recursive routing است: روتر به جای gateway سرویس دهنده، یک آدرس عمومی در اینترنت (مثلاً 8.8.8.8) را از مسیر همان اینترنت ping می‌کند و اگر جواب نگیرد، مسیر پیش فرض آن اینترنت را کنار می‌گذارد. به این ترتیب قطعی پشت gateway، یعنی داخل شبکه‌ی سرویس دهنده، هم تشخیص داده می‌شود.

اینترنت ۱ (اصلی) اینترنت ۲ (پشتیبان)
پورت ether1 ether2
gateway 203.0.113.1 198.51.100.1
آدرس probe 8.8.8.8 1.1.1.1

هر دو اینترنت IP ثابت دارند و آدرس هر پورت از قبل تنظیم شده است. شبکه‌ی داخلی 192.168.88.0/24 روی bridge-lan و در فهرست اینترفیس LAN است و ether1 عضو فهرست WAN، مطابق کانفیگ اولیه‌ی روتر میکروتیک. تفاوت اینترنت PPPoE و DHCP در بخش جداگانه‌ای آمده است. بقیه‌ی راهنماهای این خوشه در راهنمای جامع میکروتیک فهرست شده‌اند.

پیش نیازها

  • RouterOS 7. برای روش Netwatch با نوع icmp، نسخه‌ی 7.4 یا بالاتر.
  • دسترسی به Terminal، مستقیم یا از طریق Winbox.
  • یک بازه‌ی زمانی برای قطعی کوتاه؛ تغییر مسیر پیش فرض، اینترنت کاربران را چند ثانیه قطع می‌کند.

روش ساده: distance و check-gateway

اول مسیر پیش فرض دستی قبلی را پیدا و حذف کنید. در دستور دوم، به جای 0 شماره‌ای را بگذارید که print برای همان مسیر نشان می‌دهد:

/ip route print where dst-address=0.0.0.0/0
/ip route remove 0

بعد دو مسیر پیش فرض با distance متفاوت بسازید:

/ip route
add dst-address=0.0.0.0/0 gateway=203.0.113.1 distance=1 check-gateway=ping comment=wan-isp1
add dst-address=0.0.0.0/0 gateway=198.51.100.1 distance=2 check-gateway=ping comment=wan-isp2

از بین مسیرهای هم‌مقصد، مسیری که distance کمتری دارد فعال می‌شود. با check-gateway=ping روتر هر ۱۰ ثانیه gateway را ping می‌کند. اگر ۱۰ ثانیه جواب نیاید، آن درخواست timeout می‌شود و بعد از دو timeout، gateway در دسترس حساب نمی‌شود. پس حدود ۲۰ ثانیه بعد از قطعی، wan-isp1 غیرفعال و wan-isp2 فعال می‌شود. با اولین جواب gateway، مسیر اصلی دوباره فعال می‌شود.

چرا روش ساده کافی نیست

gateway معمولاً اولین دستگاه سرویس دهنده است. اگر مشکل پشت این دستگاه باشد، مثلاً قطعی لینک بالادست یا مشکل مسیریابی داخل شبکه‌ی سرویس دهنده، gateway همچنان به ping جواب می‌دهد و روتر ترافیک را به اینترنتی می‌فرستد که کار نمی‌کند.

مشکل دوم: اگر gateway به ping جواب ندهد، مسیر با check-gateway=ping هیچ وقت فعال نمی‌شود. check-gateway=arp این مشکل را ندارد، ولی فقط حضور gateway در شبکه‌ی محلی را می‌سنجد.

روش پیشنهادی: recursive routing

اگر مسیرهای روش ساده را ساخته‌اید، اول حذفشان کنید:

/ip route remove [find comment=wan-isp1]
/ip route remove [find comment=wan-isp2]

مرحله‌ی ۱: مسیر ثابت به آدرس‌های probe

/ip route
add dst-address=8.8.8.8/32 gateway=203.0.113.1 scope=10 comment=probe-isp1
add dst-address=1.1.1.1/32 gateway=198.51.100.1 scope=10 comment=probe-isp2

این دو مسیر تعیین می‌کنند که 8.8.8.8 همیشه از اینترنت ۱ و 1.1.1.1 همیشه از اینترنت ۲ در دسترس باشد. پس ping به هر کدام، سلامت کل مسیر همان اینترنت را می‌سنجد، نه فقط gateway را.

مرحله‌ی ۲: مسیرهای پیش فرض با gateway بیرونی

/ip route
add dst-address=0.0.0.0/0 gateway=8.8.8.8 target-scope=11 check-gateway=ping distance=1 comment=wan-isp1
add dst-address=0.0.0.0/0 gateway=1.1.1.1 target-scope=11 check-gateway=ping distance=2 comment=wan-isp2

gateway این مسیرها مستقیم به روتر وصل نیست. روتر آن را به صورت بازگشتی (recursive) پیدا می‌کند: برای رسیدن به 8.8.8.8 از مسیر probe-isp1 استفاده می‌کند و بسته را به 203.0.113.1 تحویل می‌دهد. check-gateway=ping خود 8.8.8.8 را ping می‌کند. اگر اینترنت ۱ در هر نقطه‌ای تا 8.8.8.8 قطع شود، wan-isp1 غیرفعال و wan-isp2 فعال می‌شود.

scope و target-scope چه می‌کنند

هر مسیر یک scope دارد و یک target-scope. روتر برای پیدا کردن gateway یک مسیر، فقط از مسیرهایی استفاده می‌کند که scope آن‌ها از target-scope همان مسیر بیشتر نباشد.

مسیر scope target-scope
connected (شبکه‌ی خود پورت) 10
مسیر static با مقادیر پیش فرض 30 10
probe-isp1 و probe-isp2 10 10 (پیش فرض)
wan-isp1 و wan-isp2 30 (پیش فرض) 11

در نتیجه gateway مسیرهای پیش فرض فقط از طریق مسیرهای probe (scope برابر 10) پیدا می‌شود، نه از طریق مسیر پیش فرض دیگر (scope برابر 30). همین مقادیر در مثال رسمی میکروتیک برای failover آمده‌اند.

/ip dns set servers=8.8.4.4,1.0.0.1
/ip route
add dst-address=208.67.222.222/32 gateway=203.0.113.1 scope=10 comment=probe2-isp1
add dst-address=208.67.220.220/32 gateway=198.51.100.1 scope=10 comment=probe2-isp2
add dst-address=0.0.0.0/0 gateway=208.67.222.222 target-scope=11 check-gateway=ping distance=1 comment=wan2-isp1
add dst-address=0.0.0.0/0 gateway=208.67.220.220 target-scope=11 check-gateway=ping distance=2 comment=wan2-isp2

NAT برای هر دو اینترنت

ether2 را به فهرست WAN اضافه کنید. قانون masquerade کانفیگ اولیه با out-interface-list=WAN نوشته شده و از این به بعد ترافیک خروجی هر دو پورت را NAT می‌کند:

/interface list member add list=WAN interface=ether2
/ip firewall nat add chain=srcnat out-interface-list=WAN action=masquerade comment="LAN to internet"

دستور دوم را فقط اگر این قانون را ندارید اجرا کنید. عضویت در WAN یک فایده‌ی دیگر هم دارد: قانون drop new from WAN در فایروال میکروتیک حالا از ether2 هم محافظت می‌کند.

اینترنت PPPoE یا DHCP

recursive routing در مسیرهای probe به gateway مشخص نیاز دارد.

PPPoE: gateway مسیر probe را نام اینترفیس PPPoE بگذارید. کلاینت PPPoE به صورت پیش فرض مسیر پیش فرض اضافه نمی‌کند (add-default-route=no) و باید همین طور بماند. اینترفیس PPPoE را هم عضو WAN کنید:

/interface pppoe-client set pppoe-out1 add-default-route=no
/ip route set [find comment=probe-isp1] gateway=pppoe-out1
/interface list member add list=WAN interface=pppoe-out1

DHCP: کلاینت DHCP به صورت پیش فرض خودش مسیر پیش فرض اضافه می‌کند (add-default-route=yes) و این مسیر با مسیرهای شما رقابت می‌کند. آن را خاموش کنید و با اسکریپت کلاینت، gateway مسیر probe را هر بار که lease گرفته می‌شود به روز کنید:

/ip dhcp-client set [find interface=ether2] add-default-route=no script=":if (\$bound=1) do={ /ip route set [find comment=\"probe-isp2\"] gateway=\$\"gateway-address\" }"
/ip dhcp-client disable [find interface=ether2]
/ip dhcp-client enable [find interface=ether2]

متغیر bound هنگام گرفتن lease برابر 1 است و gateway-address آدرس gateway را از سرور DHCP می‌دهد. دو دستور آخر کلاینت را یک بار از نو راه می‌اندازند تا اسکریپت اجرا شود.

اگر روش ساده برایتان کافی است، به اسکریپت نیاز ندارید: روی کلاینت اینترنت اصلی default-route-distance=1 و روی کلاینت پشتیبان default-route-distance=2 بگذارید. این روش هم قطعی پشت gateway را تشخیص نمی‌دهد.

جایگزین: Netwatch

Netwatch یک آدرس را به صورت دوره‌ای آزمایش می‌کند و هنگام تغییر وضعیت، اسکریپت اجرا می‌کند. از RouterOS 7.4 به بعد، علاوه بر نوع ساده (simple)، آزمون‌های icmp با آمار، tcp-conn، http-get و dns هم دارد. این روش وقتی به کار می‌آید که بخواهید هنگام قطعی کار دیگری هم انجام شود، مثلاً ثبت لاگ یا هشدار، یا بر اساس درصد اتلاف بسته و تأخیر تصمیم بگیرید.

این پیکربندی جایگزین recursive routing است، نه مکمل آن:

/ip route
add dst-address=0.0.0.0/0 gateway=203.0.113.1 distance=1 comment=wan-isp1
add dst-address=0.0.0.0/0 gateway=198.51.100.1 distance=2 comment=wan-isp2
add dst-address=8.8.8.8/32 gateway=203.0.113.1 comment=probe-isp1
/tool netwatch
add host=8.8.8.8 type=icmp interval=10s thr-avg=300ms down-script="/ip route disable [find comment=\"wan-isp1\"]" up-script="/ip route enable [find comment=\"wan-isp1\"]"
  • مسیر probe-isp1 ضروری است. بدون آن، بعد از غیرفعال شدن wan-isp1، ping به 8.8.8.8 از اینترنت ۲ جواب می‌گیرد، up-script مسیر اصلی را دوباره فعال می‌کند و روتر مدام بین دو اینترنت جا به جا می‌شود.
  • آزمون icmp به صورت پیش فرض در هر نوبت ۱۰ بسته با فاصله‌ی ۵۰ میلی ثانیه می‌فرستد. آستانه‌های fail پیش فرض از جمله ۸۵ درصد اتلاف بسته و میانگین تأخیر ۱۰۰ میلی ثانیه است. اگر تأخیر معمول لینک شما تا host بیشتر از ۱۰۰ میلی ثانیه است، thr-avg را بالاتر ببرید (در دستور بالا ۳۰۰ میلی ثانیه)، وگرنه Netwatch لینک سالم را قطع می‌بیند.
  • Netwatch به صورت پیش فرض تا ۵ دقیقه بعد از بوت آزمایش را شروع نمی‌کند (startup-delay).
  • اسکریپت‌های Netwatch فقط به مجوزهای read، write، test و reboot دسترسی دارند.

تست failover

وضعیت فعلی را ببینید:

/ip route print where dst-address=0.0.0.0/0
/ip route print detail where comment=wan-isp1

در خروجی اول، wan-isp1 باید پرچم A (active) داشته باشد و wan-isp2 نه. در خروجی دوم، immediate-gw باید 203.0.113.1%ether1 باشد؛ یعنی gateway بازگشتی درست پیدا شده است.

حالا قطعی بالادست را شبیه سازی کنید. این قانون فقط ping خود روتر به 8.8.8.8 را می‌بندد و لینک ether1 بالا می‌ماند؛ همان حالتی که روش ساده تشخیص نمی‌دهد:

/ip firewall filter add chain=output protocol=icmp dst-address=8.8.8.8 action=drop comment=failover-test

حدود ۲۰ ثانیه بعد دوباره print بگیرید. wan-isp1 باید غیرفعال (پرچم I) و wan-isp2 فعال باشد. از یک کامپیوتر داخل شبکه سایتی را باز کنید؛ اینترنت باید از اینترنت ۲ کار کند.

قانون تست را حذف کنید. با اولین جواب 8.8.8.8، مسیر اصلی برمی‌گردد:

/ip firewall filter remove [find comment=failover-test]

برای تست قطعی فیزیکی، کابل ether1 را جدا کنید و همین بررسی‌ها را تکرار کنید.

ارتباط‌های باز بعد از failover

failover فقط روی ارتباط‌های جدید اثر دارد. ارتباطی که از اینترنت ۱ شروع شده، با IP اینترنت ۱ NAT شده است. بعد از سوییچ، بسته‌هایش از ether2 بیرون می‌روند ولی جواب باید به IP اینترنت ۱ برگردد که قطع است. پس این ارتباط‌ها قطع می‌شوند و برنامه‌ها (دانلود، VPN، SSH، تماس صوتی) باید دوباره وصل شوند. وقتی اینترنت ۱ برمی‌گردد، همین اتفاق برای ارتباط‌هایی می‌افتد که در زمان قطعی از اینترنت ۲ ساخته شده‌اند.

طبق مستندات NAT میکروتیک، هر بار که اینترفیس قطع شود یا IP آن عوض شود، روتر همه‌ی ارتباط‌های masquerade شده‌ی آن اینترفیس را از connection tracking پاک می‌کند. در قطعی بالادست که لینک ether1 بالا می‌ماند، این پاک سازی انجام نمی‌شود و ارتباط‌های قدیمی تا پایان timeout در جدول می‌مانند.

/ip firewall nat disable [find comment="LAN to internet"]
/ip firewall nat
add chain=srcnat out-interface=ether1 action=src-nat to-addresses=203.0.113.2 comment="NAT ISP1"
add chain=srcnat out-interface=ether2 action=src-nat to-addresses=198.51.100.2 comment="NAT ISP2"

failover یا load balancing

در failover اینترنت ۲ تا زمان قطعی بیکار است. اگر می‌خواهید از پهنای باند هر دو اینترنت هم‌زمان استفاده کنید، load balancing با PCC را ببینید. در آن راهنما هر جدول مسیریابی یک مسیر پشتیبان از اینترنت دیگر دارد و failover هم انجام می‌شود، ولی چون check-gateway=ping روی خود gateway است، همان محدودیت روش ساده را دارد.

یک نکته از PCC در failover هم لازم است: اگر روی اینترنت ۲ port forwarding دارید، جواب ارتباط‌های ورودی از مسیر پیش فرض فعال، یعنی اینترنت ۱، خارج می‌شود و ارتباط برقرار نمی‌شود. ارتباط‌های ورودی از ether2 را مثل دو قانون اول mangle در راهنمای PCC علامت بزنید و به جدول مسیریابی اینترنت ۲ بفرستید.

مشکلات رایج

  • هر دو مسیر پیش فرض غیرفعال‌اند: مسیرهای probe را بدون scope=10 ساخته‌اید (scope پیش فرض 30 از target-scope برابر 11 بیشتر است)، یا آدرس probe از آن اینترنت به ping جواب نمی‌دهد. با /ping 8.8.8.8 از خود روتر بررسی کنید؛ این ping به خاطر مسیر probe از اینترنت ۱ می‌رود.
  • با قطع اینترنت ۱ سوییچ انجام نمی‌شود: یک مسیر پیش فرض dynamic از کلاینت DHCP یا PPPoE هنوز فعال است. add-default-route=no را بررسی کنید.
  • روتر مدام بین دو اینترنت جا به جا می‌شود: آدرس probe گاهی جواب نمی‌دهد. probe دوم اضافه کنید، یا در Netwatch آستانه‌ها را با وضعیت واقعی لینک تنظیم کنید.
  • در زمان قطعی بعضی سایت‌ها باز نمی‌شوند ولی IP کار می‌کند: DNS روی آدرس probe است؛ هشدار بخش recursive routing را ببینید.
  • port forwarding روی اینترنت ۲ کار نمی‌کند: بخش قبل را ببینید.

منابع

  1. MikroTik Documentation — Failover (WAN Backup) help.mikrotik.com
  2. MikroTik Documentation — IP Routing help.mikrotik.com
  3. MikroTik Documentation — Netwatch help.mikrotik.com
  4. MikroTik Documentation — NAT help.mikrotik.com
  5. MikroTik Documentation — DHCP help.mikrotik.com
  6. MikroTik Documentation — PPPoE help.mikrotik.com