استفاده از چندین لینک اینترنت در میکروتیک به روش pcc

استفاده از چندین لینک اینترنت در میکروتیک به روش pcc

PCC یا per connection classifier

این ویژگی از نسخه 3.24 به بعد به routeros میکروتیک اضافه شد و یک قانون مسیریابی (policy routing) ایجاد می کند. به کمک policy routing می توان گفت که کانکشن ها از یک gateway مشخص برقرار شوند و بدین وسیله یک کامیپوتر می تواند از چندین خط اینترنت استفاده کند. به عنوان مثال اینترنت دانلود منیجر را فرض کنید که هشت connection ایجاد می کند و ما هم 4 خط اینترنت داریم بدین صورت اینترنت دانلود منیجر می تواند کانکشن های خود رو از خطوط مختلف ایجاد شود که در نتیجه سرعت دانلود آن افزایش چشمگیری خواهد داشت، برای درک بهتر به شکل زیر توجه کنید:

در تصویر بالا  ترافیک هر رنگ از gateway همرنگ خود خارج می شود.

در واقع pcc به کمک hashing algorithm فیلد های موجود در ip header را تبدیل به فیلدهای 32 بیت می کند و این مقدار تقسیم به یک مقدار مشخص که ما تعیین می کنیم (بهتر است بگوییم تعداد خطوط اینترنت) و باقی مانده این تقسیم اگر با عددی که ما تعیین می کنیم یکسان بود پکت ها capture و به سمت یک gateway مشخص ارسال می شود.

برای مثال اگر باقی عدد 32 bit تولید شده توسط hashing algorithm تقسیم بر 2 شود و باقی مانده آن برابر 0 شود ارتباط و ترافیک از isp1 و اگر برابر 1 شد از isp2 عبور می کند.

درک بهتر از خروجی hashing algorithm

فرض کنید ما دو لینک اینترنت داریم و شرایطی ایجاد کرده ایم که اگر باقیمانده برابر 0 باشد ارتباط با isp1 و اگر برابر 1 باشد ارتباط از طریق isp2 انجام شود و آی پی مقصد ما 1.1.1.1 و پورت TCP ما 10000 باشد و آی پی مقصد ما 2.2.2.2 و پورت TCP برابر با 80 باشد، در این حالت hashing algorithm به شیوه زیر عمل میکند:

1+1+1+1+10000+2+2+2+2+80=10092

خروجی hashing algorithm از حاصل جمع بالا عدد 10092 می باشد، بنابراین خروجی را تقسیم بر 2 (تعداد لینک های اینترنت) می کنیم و باقیمانده 10092 تقسیم بر 2 برابر 0 می باشد، بنابراین ترافیک ما به سمت ISP1 هدایت می شود. (اگر برابر 1 میشد به سمت isp2 ارسال می شد)

توضیح داده شده در بالا مرتبط با گزینه both-addresses-and-ports در pcc می باشد که با انتخاب گزینه های دیگر می توان خروجی متفاوتی از hashing algorithm گرفت ولی به دلیل اینکه گزینه ذکر شده بهترین گزینه انتخابی می باشد بنابراین در مثال از آن استفاده کردیم.

اگر به زبان ساده بخواهیم pcc را تعریف کنیم

چند جدول routing درست می کنیم که هر connection بر اساس  یکسری شرایط تعریف شده از یک gateway مشخص برقرار شود و این گونه ما یک load balance و افزایش سرعت عالی خواهیم داشت، PCC یا per connection classifier یک ویژگی از firewall قدرتمند میکروتیک می باشد.

فواید استفاده از PCC

  1. می توانیم سرعت اینترنت بسیار بالاتری را داشته باشیم.
  2. اگر خط اینترنتی به هر دلیلی از کار بیفتد کلیه ترافیک بر روی خط یا خطوط اینترنت دیگر قرار می گیرد (failover)
  3. یک توازن بار بسیار عالی خواهیم داشت که باعث بهبود شبکه خواهد شد.
  4. مشکلات استریمینگ و … را نخواهیم داشت.

سناریو عملی pcc

همان گونه که در تصویر مشاهده می کنید 4 خط اینترنت داریم و یک شبکه local و یک DMZ، که می خواهیم به کمک PCC تجمیع چندین لینک اینترنت به همراه failover را پیاده سازی کنیم، همچنین لینک چهارم اینترنت ما دارای 8 مگ سرعت می باشد که به دلیل سرعت زیادتر آن نسبت به بقیه لینک ها می خواهیم ترافیک بیشتری از آن عبور کند.

در حل این سناریو از دستورات زیر استفاده میکنیم و تصویری از یک دستور مربوط به هر بخش را در winbox گذاشته ایم که با مشاهده آن بتوانید بدون استفاده از دستورات نیز کانفیگ ها را اعمال کنید.

اختصاص IP های مورد نیاز سناریو به تمامی اینترفیس های روتر:

ip address add address=192.168.10.1/24 interface=LAN

ip address add address=172.16.0.1/24 interface=DMZ

ip address add address=10.1.1.1/30 interface=ISP1

ip address add address=10.2.2.1/30 interface=ISP2

ip address add address=10.3.3.1/30 interface=ISP3

ip address add address=10.4.4.1/30 interface=ISP4

نکته: هنگامی که ما pcc را پیکربندی می کنیم policy routing ایجاد شده بر روی کلیه پکت هایی که شبکه داخلی تولید می کند تاثیر میگذارد و باعث می شود که connected network های ما نتوانند با یکدیگر در ارتباط باشند، برای حل این مشکل قبل از ایجاد policy routing PCC یک address-list درست می کنیم و تمام IP هایی که در شبکه داریم را به این address-list اضافه می کنیم سپس یک رول mangle به صورتی که مبدا و مقصد ما همین address-list ایجاد شده باشد با action=accept می نویسیم تا ترافیک بر اساس جدول main routing  ما مسیریابی شود و تحت تاثیر policy routing pcc نشود.

ip firewall address-list add list=local-networks address=10.1.1.0/30

ip firewall address-list add list=local-networks address=10.2.2.0/30

ip firewall address-list add list=local-networks address=10.3.3.0/30

ip firewall address-list add list=local-networks address=10.4.4.0/30

ip firewall address-list add list=local-networks address=192.168.0.0/24

ip firewall address-list add list=local-networks address=172.16.0.0/24

ip firewall mangle add chain=prerouting src-address-list=local-networks dst-address-list=local-networks action=accept

حالا اقدام به ایجاد policy routing مربوط به PCC میکنیم :

ابتدا نیاز داریم هر connection ای که از بیرون شبکه ایجاد میشود از یک ip public یکسان پاسخ داده شود تا مشکلی در برقراری ارتباط و رد و بدل داده ها رخ ندهد، بدین منظور مانند زیر کلیه ترافیک ورودی به اینترفیس های روتر از لینک های اینترنت را مارک می کنیم.

نکته: connection-mark=no-mark به این معنی که connection های ما هیچ مارکی ندارند.

ip firewall mangle add chain=prerouting in-interface=ISP1 connection-mark=no-mark     action=mark-connection new-connection-mark=ISP1_conn

ip firewall mangle add chain=prerouting in-interface=ISP2 connection-mark=no-mark action=mark-connection new-connection-mark=ISP2_conn

ip firewall mangle add chain=prerouting in-interface=ISP3 connection-mark=no-mark action=mark-connection new-connection-mark=ISP3_conn

ip firewall mangle add chain=prerouting in-interface=ISP4 connection-mark=no-mark action=mark-connection new-connection-mark=ISP4_conn

همانطور که میدانیم actionهای مرتبط با mark-routing فقط در دو chain به نام های output و prerouting قابل استفاده می باشد، ما نیاز داریم که از prerouting استفاده کنیم ولی این chain کلیه ترافیک های ورودی به روتر را capture میکند که شامل ترافیک های ایجاد شده با مبدا شبکه داخلی و مقصد شبکه داخلی به عنوان مثال در اینجا ترافیک ایجاد شده از شبکه local به سمت DMZ و برعکس نیز capture میشود که در اینجا ما هیچگونه نیازی به همچین کاری نداریم و همچنین بار بیشتری بر cpu روتر ما می گذارد. جهت رفع این مشکل ما در رول mangle از dst-address-type=!local استفاده میکنیم بدین معنی که مبدا و مقصد شبکه ما جزو شبکه داخلی نباشد.

تنظیم PCC:

در اینجا ما 4 لینک داریم که با توجه به توضیحات قبلی تعیین میکنیم که باقی مانده مقایسه شود و طبق شرایط تعریف شده ترافیک را بر روی لینک های مختلف ارسال کند.

نکته: با توجه به اینکه در سناریو لینک 8 مگ داریم و میخواهیم ترافیک بیشتری توسط این لینک منتقل شود  پس رول مربوط به link چهارم را دوبار مینویسم.

ip firewall mangle add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:4/0 action=mark-connection new-connection-mark=ISP1_conn

ip firewall mangle add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:4/1 action=mark-connection new-connection-mark=ISP2_conn

ip firewall mangle add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:4/2 action=mark-connection new-connection-mark=ISP3_conn

ip firewall mangle add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:4/3 action=mark-connection new-connection-mark=ISP4_conn

ip firewall mangle add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:4/3 action=mark-connection new-connection-mark=ISP4_conn

 

ip firewall mangle add chain=prerouting  in-interface=DMZ connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:4/0 action=mark-connection new-connection-mark=ISP1_conn

ip firewall mangle add chain=prerouting  in-interface=DMZ connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:4/1 action=mark-connection new-connection-mark=ISP2_conn

ip firewall mangle add chain=prerouting  in-interface=DMZ connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:4/2 action=mark-connection new-connection-mark=ISP3_conn

ip firewall mangle add chain=prerouting  in-interface=DMZ connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:4/3 action=mark-connection new-connection-mark=ISP4_conn

ip firewall mangle add chain=prerouting  in-interface=DMZ connection-mark=no-mark dst-address-type=!local per-connection-classifier=both-addresses:4/3 action=mark-connection new-connection-mark=ISP4_conn

 

در این مرحله ما به ایجاد جداول routing مورد نظر و همینطور تمام پکت های کانکشن های مارک شده قبلی را مارک کنیم (در chain prerouting) و سپس با توجه به اینکه فقط این routing policy را میخواهیم به سمت اینترنت داشته باشیم در chain output نیز تعیین میکنیم که هر connection به سمت لینک اینترنتی مورد نظر ارسال شود.

ip firewall mangle add chain=prerouting connection-mark=ISP1_conn in-interface=LAN action=mark-routing new-routing-mark=to_ISP1

ip firewall mangle add chain=prerouting connection-mark=ISP2_conn in-interface=LAN action=mark-routing new-routing-mark=to_ISP2

ip firewall mangle add chain=prerouting connection-mark=ISP3_conn in-interface=LAN action=mark-routing new-routing-mark=to_ISP3

ip firewall mangle add chain=prerouting connection-mark=ISP4_conn in-interface=LAN action=mark-routing new-routing-mark=to_ISP4

ip firewall mangle add chain=prerouting connection-mark=ISP1_conn in-interface=DMZ action=mark-routing new-routing-mark=to_ISP1

ip firewall mangle add chain=prerouting connection-mark=ISP2_conn in-interface=DMZ action=mark-routing new-routing-mark=to_ISP2

ip firewall mangle add chain=prerouting connection-mark=ISP3_conn in-interface=DMZ action=mark-routing new-routing-mark=to_ISP3

ip firewall mangle add chain=prerouting connection-mark=ISP4_conn in-interface=DMZ action=mark-routing new-routing-mark=to_ISP4

ip firewall mangle add chain=output connection-mark=ISP1_conn action=mark-routing new-routing-mark=to_ISP1

ip firewall mangle add chain=output connection-mark=ISP2_conn action=mark-routing new-routing-mark=to_ISP2

ip firewall mangle add chain=output connection-mark=ISP3_conn action=mark-routing new-routing-mark=to_ISP3

ip firewall mangle add chain=output connection-mark=ISP4_conn action=mark-routing new-routing-mark=to_ISP4

حالا برای هر یک از routing mark ها که ساختیم یک default route مناسب ایجاد می کنیم. منظور از عبارت check-gateway=ping یعنی طرف مقابل را ping کن که اگر down شد متوجه شوی.

ip route add dst-address=0.0.0.0/0 gateway=10.1.1.1 routing-mark=to_ISP1 check-gateway=ping

ip route add dst-address=0.0.0.0/0 gateway=10.2.2.1 routing-mark=to_ISP2 check-gateway=ping

ip route add dst-address=0.0.0.0/0 gateway=10.3.3.1 routing-mark=to_ISP2 check-gateway=ping

ip route add dst-address=0.0.0.0/0 gateway=10.4.4.1 routing-mark=to_ISP2 check-gateway=ping

ip route add dst-address=0.0.0.0/0 gateway=10.1.1.1 distance=1 check-gateway=ping

ip route add dst-address=0.0.0.0/0 gateway=10.2.2.1 distance=2 check-gateway=ping

ip route add dst-address=0.0.0.0/0 gateway=10.3.3.1 distance=3 check-gateway=ping

ip route add dst-address=0.0.0.0/0 gateway=10.4.4.1 distance=4 check-gateway=ping

جهت برقراری ارتباط روترها بر روی اینترفیس های خروجی NAT تنظیم می کنیم.

ip firewall nat add chain=srcnat out-interface=ISP1 action=masquerade

ip firewall nat add chain=srcnat out-interface=ISP2 action=masquerade

ip firewall nat add chain=srcnat out-interface=ISP3 action=masquerade

ip firewall nat add chain=srcnat out-interface=ISP4 action=masquerade

در اینجا کار تمام می شود. امیدوارم از این آموزش استفاده لازم رو برده باشید. در صورت داشتن هر گونه مشکل در کامنت ها مطرح کنید تا در زمان مناسب به آن پاسخ دهیم.

منابع:

https://wiki.mikrotik.com/wiki/Manual:PCC

https://wiki.mikrotik.com/wiki/How_PCC_works_(beginner)

https://wiki.mikrotik.com/wiki/PCC_exemptions

 

2 دیدگاه
  1. Arlie می گوید

    خیلی مطلب خوبی بود. ممنون از به اشتراک گزاری.

  2. هموطن می گوید

    سلام و تشکر
    ببخشید آیا با این روش، پهنای باند آپلود هم تجمیع میشه؟!
    ipما روی اینترنت از کدام isp نشان داده می شود؟

    چون نمیشه که دوتا ip برای ما توی اینترنت ثبت بشه!

ارسال یک پاسخ

آدرس ایمیل شما منتشر نخواهد شد.