View RSS Feed

مجتبی شمس نجاتی

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

امتیاز
توسط - 2014-02-25 - 09:09 PM (بازدید: 4894)
  
در قسمت قبل پیاده سازی اسکریپت ساده failover را بررسی کردیم.

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



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

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

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

اسکریپت زیر را مشاهده کنید:
کد:
#------------------------------------
# script by mojtaba.shams@hotmail.com
#------------------------------------


#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;


موفق باشید.
mohsenhvac، gamazuf، Hanif و 10 نفر دیگر سپاسگزاری کرده‌اند.

Updated 2014-02-27 at 12:14 PM by mojtaba461

دسته ها
میکروتیک

نظر

  1. شناسه تصویری mjzaret
    من روش بهتری برای این کار مد نظرم هست.

    خودم هم دارم از همین روش استفاده میکنم و نیازی به اسکریپت نیست.

    در صورتی که ارتباط شما با ISP برقرار باشه و اینترنت وجود نداشته باشه به صورت خودکار تغییر روت صورت میگیره.

    ابتدا از یک آدرس که مطمئن هستید آپتایم بالایی داره استفاده می‌کنم.

    روت برای هر لینک به صورت زیر هست.



    بعد از اینکه به تعداد هر لینک روت نوشتید حالا نوبت اینه که از این لینک‌ها استفاده کرد.

    برای استفاده از لینکها به صورت زیر عمل می‌کنیم.



    اگر ارتباط با 4.2.2.4 به هر عنوان قطع بشه به لینک و ارتباطی که در Distance تعریف نموده‌اید مراجعه می‌کنه.
    sajadnar سپاسگزاری کرده است.
  2. شناسه تصویری sajadnar
    سلام ممنون از چوابتون من در شرکت 2 تا خط اینترنت دارم الان مشکلم دقیقا اینکه میخوام وقتی شارژ یکی تموم شد سوییچ کنه رو اون یکی ولی الان این کار رو زمانی انجام میده که ارتباط ppoe قطع شده باشد امکان داره راهنمایی کنید . ممنون
  3. شناسه تصویری moesland
    خیلی عالی بود
  4. شناسه تصویری mojtaba461
    نقل قول نوشته اصلی توسط sajadnar
    سلام ممنون از چوابتون من در شرکت 2 تا خط اینترنت دارم الان مشکلم دقیقا اینکه میخوام وقتی شارژ یکی تموم شد سوییچ کنه رو اون یکی ولی الان این کار رو زمانی انجام میده که ارتباط ppoe قطع شده باشد امکان داره راهنمایی کنید . ممنون
    وقتی نتونه با ip هایی که بعنوان تست ارتباط ست شده ارتباط یرقرار کنه سوییچ میکنه. حتما درست راه اندازی نکردید اسکریپت رو
  5. شناسه تصویری taha001
    سلام من می خوام فقط یک یوزر به پسورد های وی پی ان دسترسی داشته باشه و راه حلی نداره ایا میشه با نوشتن اسکریپ یوزر های دیگه رو محدود کرد؟
  6. شناسه تصویری mojtaba461
    نقل قول نوشته اصلی توسط taha001
    سلام من می خوام فقط یک یوزر به پسورد های وی پی ان دسترسی داشته باشه و راه حلی نداره ایا میشه با نوشتن اسکریپ یوزر های دیگه رو محدود کرد؟
    خیر
  7. شناسه تصویری poloto4u
    سلام. من طبق این آموزش جلو رفتم، همه چیز عالی و مرتبه.

    فقط یه سوال!

    کاربرای LAN که میخوان از این اینترنت استفاده کنن، باید چه تنظیماتی براشون انجام بدم ؟

    من DHCP تعریف کردم، Gateway اون رو هم گذاشتم آی پی اینترفیس LAN، ولی فکر کنم باید یه روت هم بنویسم! نمیدونم یا شاید نیازه کار دیگه ای بکنم!

    لطفا راهنمایی بفرمایین
  8. شناسه تصویری mthm
    نقل قول نوشته اصلی توسط poloto4u
    سلام. من طبق این آموزش جلو رفتم، همه چیز عالی و مرتبه.

    فقط یه سوال!

    کاربرای LAN که میخوان از این اینترنت استفاده کنن، باید چه تنظیماتی براشون انجام بدم ؟

    من DHCP تعریف کردم، Gateway اون رو هم گذاشتم آی پی اینترفیس LAN، ولی فکر کنم باید یه روت هم بنویسم! نمیدونم یا شاید نیازه کار دیگه ای بکنم!

    لطفا راهنمایی بفرمایین
    سلام
    همین کاری که انجام دادید کافیه. اونها از طریق روتر تو گام بعدی به اینترنت متصل میشن و نیازی نیست خبر داشته باشن چه اتفاقی داره میفته
  9. شناسه تصویری mthm
    سلام
    ممنون از متن ساده و مفیدی که گذاشتید. در مورد نحوه استفاده از عملگرهای منطقی هم توضیح بفرمایید.
  10. شناسه تصویری mthm
    البته الان اینها رو پیدا کردم
    https://wiki.mikrotik.com/wiki/Manua...ical_Operators