استفاده از چندین لینک اینترنت در میکروتیک به روش 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
- می توانیم سرعت اینترنت بسیار بالاتری را داشته باشیم.
- اگر خط اینترنتی به هر دلیلی از کار بیفتد کلیه ترافیک بر روی خط یا خطوط اینترنت دیگر قرار می گیرد (failover)
- یک توازن بار بسیار عالی خواهیم داشت که باعث بهبود شبکه خواهد شد.
- مشکلات استریمینگ و … را نخواهیم داشت.
سناریو عملی 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