اسکریپت پیشرفته Failover

در قسمت قبل پیاده سازی اسکریپت ساده failover را بررسی کردیم.

گفتیم که اگر ارتباط ما با isp برقرار باشد ولی ارتباط isp تا اینترنت بنا به هردلیلی قطع شود، اسکریپت پیشرفته تر failover نیاز است.

برای این منظور اسکریپتهایی نوشته شده مانند نمونه زیر:
http://wiki.mikrotik.com/wiki/Failover_Scripting

یا استفاده از روش زیر:
http://wiki.mikrotik.com/wiki/Advanc…hout_Scripting

هرکدام از روش های بالا مزایا و معایبی دارند، مثلا برای اجرای اسکریپت اول هر نوع روتی جواب نمی دهد، یا روش دوم کاملا بصورت دستی است.

اسکریپت زیر را مشاهده کنید:

کد:

#------------------------------------
# script by [email protected]
#------------------------------------ #edit gateways
:global gw1 10.10.10.1;
:global gw2 20.20.20.1; #edit hosts
:global host1 217.218.155.155;
:global host2 217.218.127.127; #edit warning messages
:global gw1msg "route changed to gateway1";
:global gw2msg "route changed to gateway2"; #---------Begin Of Method-----------#
:global gw;
:foreach i in=[ip route find where dst-address=0.0.0.0/0] do={:set gw [ip route get $i gateway]};
:global gw1ping [ping $host1 count=5];
:global gw2ping [ping $host2 count=5];
:if ($gw1ping > $gw2ping) do={if ($gw1 != $gw) do={foreach i in=[ip route find where dst-address=0.0.0.0/0] do={ip route set $i gateway=$gw1}; /log warning $gw1msg;}};
:if ($gw2ping > $gw1ping) do={if ($gw2 != $gw) do={foreach i in=[ip route find where dst-address=0.0.0.0/0] do={ip route set $i gateway=$gw2}; /log warning gw2msg;}};

شیوه به این صورت است که قبل از ایجاد هر نوع روتی ، دو سرور مشخص می کنیم برای چک کردن ارتباط دو isp مختلف که از طریقشان به اینترنت متصل می شویم. سروری که انتخاب می شود باید uptime بالایی داشته باشد.

در اینجا دو سرور 217.218.155.155 و 217.218.127.127 مربوط به dns مخابرات را استفاده می کنیم.

دو روت با distance=1 به دو سرور انتخاب شده از دو مسیر مختلف (isp1 و isp2) می نویسیم:

کد:

ip route add dst-address=217.218.155.155 distance=1 gateway=10.10.10.1
ip route add dst-address=217.218.127.127 distance=1 gateway=20.20.20.1

یک روت هم با distance بالاتر برای 0.0.0.0/0 (هدف از انتخاب distance بالاتر این است که برای چک کردن سرور های انتخاب شده از روت های قبل استفاده شود)

کد:

ip route add dst-address=0.0.0.0/0 distance=2 gateway=10.10.10.1

فعلا برای 0.0.0.0/0 ها از isp1 استفاده می کنیم تا بعد که اسکریپت failover مسیر بهتر را تشخیص دهد و در روت بالا جایگزین کند.

پس routing table ما چیزی شبیه تصویر زیر است:

سپس اسکریپت بالا را در قسمت system > script ایجاد کرده، و توسط ابزار scheduler که در بخش های قبل توضیح داده شد ، در زمانهای تعیین شده اجرا می کنیم.

توضیح اسکریپت

  1. قسمتهایی که با کاراکتر # شروع می شوند، توضیحات یا comment هستند و اجرا نمی شوند.
  2. gateway مربوط به دو isp را بعنوان مقدار دو متغیر وارد می کنیم.

    کد:

    :global gw1 10.10.10.1;
    :global gw2 20.20.20.1;

  3. سرورهایی که بعنوان ping شونده انتخاب کردیم را وارد دو متغیر می کنیم

    کد:

    :global host1 217.218.155.155;
    :global host2 217.218.127.127;

  4. دو پیغام متناظر با تعویض gateway روت اصلی در نظر میگیریم، برای نمایش در log میکروتیک

    کد:

    :global gw1msg "route changed to gateway1";
    :global gw2msg "route changed to gateway2";

  5. متغیری برای نگهداری مقدار فعلی gateway روت اصلی 0.0.0.0/0 ایجاد میکنیم برای مقایسه های بعدی.

    کد:

    :global gw;

  6. با استفاده از حلقه foreach تمام روتهای با مقصد 0.0.0.0/0 را پیدا میکنیم و مقدار gateway فعلیشان را در متغیر آرایه ای gw وارد می کنیم. در اینجا فقط یک روت 0.0.0.0/0 داریم

    کد:

    :foreach i in=[ip route find where dst-address=0.0.0.0/0] do={:set gw [ip route get $i gateway]};

  7. پنج دستور ping به دو سرور تعیین شده ارسال می کنیم، و تعداد پکت های موفق را وارد دو متغیر gw1ping و gw2ping می کنیم. هر کدام از دستور ها از لینک isp های مربوط به خود ارسال می شود.

    کد:

    :global gw1ping [ping $host1 count=5];
    :global gw2ping [ping $host2 count=5];

  8. اگر مقدار پکت های موفق ارسال شده به سرور اول از طریق isp1 بیشتر از پکت های موفق ارسال شده به سرور دوم از طریق isp2 بود، چک می کنیم که اگر مقدار gateway روت اصلی 0.0.0.0/0 برابر با isp1 نبود، gateway مربوطه را جایگزین می کنیم.

    کد:

    :if ($gw1ping > $gw2ping) do={if ($gw1 != $gw) do={foreach i in=[ip route find where dst-address=0.0.0.0/0] do={ip route set $i gateway=$gw1}; /log warning $gw1msg;}};

  9. عمل قبلی را برای isp2 انجام میدهیم.

    کد:

    :if ($gw2ping > $gw1ping) do={if ($gw2 != $gw) do={foreach i in=[ip route find where dst-address=0.0.0.0/0] do={ip route set $i gateway=$gw2}; /log warning gw2msg;}};

  10. کد زیر پیامی که قبلا در متغیر gw1msg یا gw2msg ذخیره شده بود را وارد log میکروتیک می کند.

    کد:

    log warning $gw1msg;

موفق باشید.

نوشته های مشابه