اینم یه تجربه پراکنده دیگه

من تقریبا دو سال میشه که در محل کار و خونه از pfSense به عنوان روتر و فایروال استفاده کردم. حالا میخواستم یکم در مورد درستی یا غلطی استفاده از یه روتر متن باز تو محیط عملیاتی بگم. شاید به درد کسی بخوره و توی تصمیم گیری کمکش کنه.

اگه به شخص من باشه، من در برای کسب و کارهای کوچک و متوسط پیشنهاد میکنم که از pfSense استفاده بشه. چون کیفیت این محصول خوبه و کنترل کافی روی پهنای باند و شبکه رو فراهم میکنه و نگهداریش سربار اضافی برای اون کسب و کار به همراه نداره. هزینه راه‌اندازی به نسبت  کمی هم داره تنها چیزایی که میخواد یه کامپیوتر قدیمی که دارای حداقل دوتا کارت شبکه باشه هست.

اما برای شرکت‌های بزرگ با نیازهای پیچیده جرات نمیکنم که این سیستم رو پیشنهاد بدم چون نیاز به علم زیاد در مورد این فایروال هست که خب معمولا این علم وجود نداره و خب کار یکم سخت میشه. اما سناریوهایی رو هم دیدم که در دنیا شرکت‌های بزرگ اون رو پیاده سازی کردن و موفق هم بودن.

از نظر ویژگی‌ها هم کارهای بسیار خوب زیادی میشه باهاش انجام داد. که من لیست کارهایی که باهاش کردم رو مینویسم:

  • سر هم کردن دوتا اینترنت برای افزایش پهنای باند و افزایش ثبات
  • راه اندازی یک captive portal برای احراز هویت کاربران برای دسترسی به اینترنت
  • استفاده از ویژگی NAT برای تخصیص پورتهایی به یکی از سیستم‌های داخلی
  • پشتیبانی از سیستم تلفنی مبتنی بر IP به نام Asterisk
  • پشتیبانی از محدود کردن پهنای باند و ترافیک کاربران
  • محدود کردن دسترسی عده‌ای یا گروهی از کاربران به اینترنت
  • پشتیبانی از squid‌به منظور افزایش کارایی استفاده از اینترنت
  • امکان بررسی ترافیک عبوری و ویروسیابی آن
  • امکان اعمال سیاستهای تضمین کیفیت

این کارهایی که من انجام دادم اکثرا توسط پکیج‌های جانبی این سیستم انجام شده و اگه عمری بود سناریوی اجرای تک تک این قسمت‌ها رو میگم

همین!

redis

اینم یه تجربه پراکنده دیگه!

معمولا یکی از مشکلات سیستم‌های تحت وب وجود داره اینه که سرعت دسترسی به دیتابیس بسیار کمتر تعداد درخواستهایی است که برای دسترسی به وب وجود داره و راه‌های بسیاری برای افزایش این سرعت وجود داره. یکی از راه‌ها استفاده از cache هاست که خب در سطوح مختلفی وجود داره. اما یکی از راه‌ها استفاده از redis‌ هست که یک دیتابیس key-value است. بدین صورت که توی redis نتایج تمامی query ها به پایگاه داده ذخیره میشه و این باعث میشه که کارایی سیستم افزایش پیدا کنه.

این دیتابیس جزء پایگاه‌های noSQL هست که فقط یک سری ساختمان داده رو بجای جداول و ستون‌ها دخیره میکنه و کل پایگاه داده توی حافظه است و بصورت متناوب روی دیسک نوشته میشه بدون اینکه در عملکرد پایگاه داده اختلالی حاصل بشه. بخاطر قرار گرفتن پایگاه داده توی حافظه سرعتش خیلی بالاست و کارهای زیادی رو هم میتونه انجام بده. یکی دیگه از ویژگی‌هاش اینه که عملیات‌هاش اتمیک هستن. یعنی اینکه هریک از عملیات‌های پایگاه داده به همدیگه گیر نمیکنن و همدیگه رو بلاک نمی‌کنن و این هم باعث میشه یه عملیات وقت گیر وجود نداشته باشه. همین ویژگی‌ حتی باعث میشه که از اون به عنوان یک message broker هم بشه استفاده کرد بدین صورت که برنامه‌های مختلف اطلاعات رو بصورت کلیدهای مختلف روی این پایگاه قرار میدن و یا برمیدارن اما این عملیات‌ها بدون اختلال ایجاد کردن در کار همدیگه انجام میشه و پایگاه داده تضمین میکنه که کسی که اطلاعات رو پردازش میکنه قطعا به اطلاعات درست دسترسی داره و کارش رو درست انجام میده.

من سعی کردم یک بصورت خلاصه اینجا توضیح بدم که redis چیه و توی چه سناریوهایی ازش استفاده میکنن. سعی میکنم توی یه پست دیگه بیشتر توضیحش بدم.

همین!

اینم یه تجربه پراکنده دیگه.

ایندفعه قراره از یکی از کارهایی که توی خونه برای اثبات خودم به خودم انجام داده بگم. این تجربه تو زمینه شبکه و این حرفاست. من در یکی از جاهایی که کار میکردم با یه سیستم مسیریاب/دیواره آتش متن باز به نام pfSense کار کردم که بسیار به علم شبکه و نرم افزار من اضافه کرد. این یک سیستم عامل freeBSD خاص منظوره برای کارهای شبکه است. یعنی دوستانی در دنیا پیدا شدن که freeBSD رو با برخی ویژگی‌های openBSD که اولی به بهینه بودن معروفه و دومی به امنیت مریض گونه اش ترکیب کردند و یه سیستم عامل سبک برای مدیریت شبکه راه انداختن. البته سیستم های متن باز مشابه این سیستم وجود داره که لیستش اینجاست.

این پروژه از دل یه پروژه دیگه به نام m0n0wall در اومده و با تغییر هدف گزاریش سعی کرده راه متفاوتی از پروژه اصلی بره. هدف پروژه اصلی کار این سیستم عامل رو دستگاه‌های embedded بوده که خب بخاطر محدودیت سخت افزار بسیاری از ویژگی‌ها روی m0n0wall امکان پذیر نیست اما pfSense هدفش رو روی کاربردها گذاشته به همین خاطر با دستگاه‌های embedded زیادی تطبیق نداره. فکر کنم همین مختصر کافی باشه برای رفتن سراغ اصل مطلب. اگه عمری بود شاید بصورت دقیق این سیستم ها رو معرفی کردم.

خب اول بگم که در مجموع میخواستم چه کاری انجام بدم. فکر کنم برای دید بهتر باید بگم که مثل هرجای دیگه خونه من هم دو سمت داره. یه سمت اینترنت که یه ای دی اس ال و یه وایمکس مسئول آوردن اینترنت به خونن و فقط وایمکس در مواردی که ای دی اس ال درست کار نمیکنه مورد استفاده قرار میگیره و توی خونه هم یه لپ تاپ یه پی سی قدیمی و چند تا موبایل وجود داره. همین. وظیفه هر کدوم از دستگاه‌ها هم اینه. پی سی مسئول فایل شرینگ و دانلود شبانه از اینترنت هست. مابقی دستگاه‌ها هم تنها به اینترنت وصل میشن. پس یعنی سرویس خاصی مورد نیاز نیست.

اما بگم چرا رفتم سراغ این سیستم. اول اینکه دوست داشتم! دوم اینکه چند مشکل بود که باید حل میشد. یکی از مشکلاتی که من برخود میکردم اینه که وقتی تورنت در حال اجرا بود مودم دیگه به مابقی درخواست‌ها جواب نمیداد چون بخاطر پردازنده محدودش حداکثر یه تعداد محدودی کانکشن باز میتونست داشته باشه چون وقتی از  NAT استفاده میشه بایستی مودم یا روتر وضعیت کانکشن ها رو نگه داره که وقتی دستگاه محدود باشه این تعداد محدود میشد. دومین مشکل کیفیت بد DNS توی کل خونه بود. چون بعضی وقتا یه درخواست DNS روی سرورهای آی اس پی نبود و باید میرفتم سراغ DNSهای معروف مثل ۴٫۲٫۲٫۴ یا ۸٫۸٫۸٫۸ که خب ایراداتی داشت و یکی از مهمتریناش زمان به نسبت زیاد جواب به این DNS هاست.

خب اگه بخوام بگم چیکار کردم. بصورت مرحله به مرحله این کارها رو انجام دادم. ا

  1. بهینه سازی سیستم فایل سرور موجود: من برای فایل سرورم توی خونه از یه کامپیوتر قدیمی با یه گیگ رم و یه سی پی یوی سمپرون تک هسته ای سه هزار استفاده میکنم. که بنا به صلاح دیدم که بشه از اون کامپیوتر استفاده دیگه ای هم کرد روش یه ubuntu desktop 12.04 نصب کردم و samba سرور رو هم راه اندازی کردم. اما بخاطر استفاده از unity حجم زیادی از رمم مورد استفاده بود. بعد از جستجوهای بسیار یه desktop manager خوب پیدا کردم به نام enlightenment که رم استفاده شده توی سیستم رو از حدود ۷۰۰ مگ به ۱۲۰ مگ کاهش داد که این خودش بسیار کار بزرگی بود.
  2. نصب و راه اندازی virtual box: بعد روی این سرور با دردسر زیاد virtual box رو نصب کردم و یه ماشین مجازی که خود pfSense آماده کرده رو نصب کردم و دو سمت شبکه رو با استفاده subnet mask از هم جدا کردم.
  3. پیکربندی pfSense: حالا نوبت به پیکربندی pfSense میرسه که برای اینکار یه کانکشن pppoe ساختم توی سمت اینترنت و توی سمت شبکه داخلی یه DHCP سرور تنظیم کردم. برای رفع مشکل DNS از DNS masqe استفاده کردم و گفتم که در وهله اول از DNSهای آی اس پی استفاده کنه و در اولویت بعد بره سراغ سرورهای معروف. یه ویژگی دیگه هم اینه که این سیستم به مدت محدود رکوردهای DNS رو Cache میکنه و سرعت DNS بالا میره. برای دانلود تورنت هم یه Inbound NAT استفاده کردم و گفتم یه سری پورت برای تورنت به دانلودر تورنتم وصل بشه. مشکل تعداد کانکشن هم بخاطر قدرت بیشتر این سیستم و رم بالاترش بصورت خودکار رفع شده بود.
  4. تنظیم نهایی Virtual Box: در نهایت باید Virtual Box رو بگونه ای تنظیم کرد که در ابتدا شروع سیستم ماشین مجازی روتر رو روشن کنه و در خاموش شدن سیستم این ماشین مجاز رو خاموش کنه. خود Virtual Box این کار رو انجام میده و فقط نیاز به یه سری تنظیمات داره که اگه عمری بود در موردشون بعدا یه پست کامل مینوسم.

همین! امیدوارم به درد کسی بخوره. مرحله بعدی این سیستم اینه که بتونم از ای دی اس ال و وایمکسم بصورت همزمان و بصورت مدیریت شده استفاده کنم که فعلا وقت نکردم روش وقت بگذارم. باید ببینم کی دوباره وقت خوب پیدا میکنم یکم این اثبات رو پیش ببرم.

خب به نظر میرسه وبلاگ من رو خاک گرفته! میدونم و تنها دلیلی که دارم الان مینویسم اینه دلم رزبری پی میخواد. البته بگم که من یه دونه پاندابرد دارم ولی دلم یکی از اینا رو هم میخواد.

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

این داستانی که میخوام براتون تعریف کنم توی چله تابستون وقتی که کسی دانشگاه نیست اتفاق افتاده و خب ما چون پایه ثابت خوابگاه بودیم! بودیم!اون سالی که من دانشجو بودم و این اتفاق افتاد دانشگاه صنعتی امیرکبیر اینترنتش رو از طریق سه یا چهارتا پروکسی squid به دانشجوها و اساتیدش در مقاطع مختلف ارائه میداد. اون سال بخاطر چله تابستون بودن دوستان انفورماتیک زحمت کشیده بودن و به همه بدون پسورد سرویس میدادن. یعنی هیچ یک از پراکسی ها پسورد نداشت و تنها محدودیت رو روی آی پی آدرس شما اعمال میکردن و شما رو محدود میکردن خب شما هم اگه جای من بودید دوست داشتید از این فرصت بوجود اومده استفاده کنید.

کل کاری که من کردم این بود که اولا تعداد آی پی هام توی لینوکسم که اگه اشتباه نکنم یه فدورا ۱۵ بود زیاد کردم. یه برنامه پیدا کردم که بتونیم بین پراکسی‌های مختلف تقسیم بار انجام بدم و خب یه سری بازی wii داشتم که میخواستم از megaupload خدا بیارمز دانلودش کنم. خب سعی میکنم که مرحله به مرحله توضیح بدم که چیکار کردم

اول : تقسیم بار روی سرور ها اولین کاری که کردم با استفاده از یه دستور خوب لینوکس به اینترفیس شبکه ام به تعداد کافی آی پی دادم

خب مرحله بعد این بود که بتونم با استفاده از هریک از این آدرسها به اون پروکس‌ها وصل بشم. تحقیقات بسیاری در این زمینه انجام دادم که چطوری این عمل امکان پذیره اما نمیدونم چطور (پیری و هزار عیب) به این نتیجه رسیدم که یه ابزار بسیار خوب برای این کار که خیلی هم ساده عمل میکنه وجود داره به اسم balance که این کار رو به شکل ساده و خیلی راحتی انجام میده تنها نیاز بود که من بگم روی کدوم آدرس به کدوم یک از پروکسی ها وصل بشه. کاری که بالانس میکنه یه پروکسی دیگه بوجود میاره که هر درخواست به اون روی مابقی پروکسی ها تقسیم میشن به همین سادگی. پس کاری که من کردم این بود که به ازای هر آی پی یک بالانس بالا آوردم و در نهایت یک بالانس در لایه بالاتر همه این بالانسهای رو به هم متصل میکرد که کدش تو پایین اومده

خب حالا ما یه لود بالانسر داریم که اگه تعداد زیادی کانکشن بهش برسه اون رو روی آی پی های مختلف روی پروکسی‌های مختلف تقسیم میکنه. بخش اول کار تمومه

دوم: دانلود بدون نظارت از megaupload چند تا مشکل توی دانلود از megaupload وجود داشت. یکی اینکه مگا آپلود فی…ل…تر بود. خب راه حلش چی میتونست باشه. من گشتم و گشتم تا متوجه شدم که میشه آدرس سایت رو به این صورت هم استفاده کرد whateveryoucouldthinkof.megaupload.com خب این کشف بزرگی بود و خوشبختانه اکثر این آدرسا فیلتر نبود. پس اول مشکل به حول و قوت خود مگا آپلود حل شد. مشکل بعدی این بود که این سایت برای اینکه بگذاره ما ازش دانلود کنیم نیاز به یوزر نیم و پسورد داشت که معنیش این بود که باید یه بروزر بصورت دستی لاگین بشه تا بشه ازش استفاده کرد. راه حل این مساله هم خدا رو شکر ساده بود. با استفاده از گوگل و یکم سرک کشیدن اینور اونر متوجه شدم اگه بتونم کوکی لاگین رو بسازم میتونم به خیلی از برنامه های دانلود که از خط فرمان پشتیبانی میکنن این کوکی رو میخونن و کارشون رو انجام میدن. خط فرمانی که من برای لاگین کردن به مگا آپلود پیدا کردم این بود

که یه فایل کوکی به نام cook میساخت. حالا میموند اینکه من از یه برنامه با تعداد کانکشن زیاد و بصورت همزمان فایلها رو دانلود کنم. اونم به کمک دانلودر قوی aria2 حل شد. با استفاده از این دانلودر میتونستم لیستی از فایلها رو بهش بدم و بگم به چند تا کانکشن همزمان اونها رو دانلود کن. دستور دانلودم هم این بود

خب بعدش واسه اینکه کل فایلها رو یکجا بتونم دانلود کنم از یه شل اسکریپت دیگه استفاده کردم که اونم اینجا میارمش

خب حالا بریم سراغ مرحله بعد.

مرحله سوم : استخراج اتوماتیک لیست فایلها از متن یک صفحه وب بسیاری از جزئیات این بخش رو یادم نمیاد و خب خیلی هاش رو هم دستی انجام دادم. اما کلیت این بود که متن‌های تکرار شونده (تگ های html و …) توی لیست رو پیدا کردم و حذف کردم. بعدش یه پارسر با سی پلاس پلاس نوشتم‌(اون زمان به awk و sed و …) مسلط نبودم و فایلها رو استخراج کردم که توی هر کردوم یه چیری شببه این بود

همین به کسی پیشنهاد نمیکنم که این کار رو انجام بده اما من انجام دادم و لذتش رو بردم. یادم رفت بگم من اون زمان میتونستم توی یک شب تا صبح (چون در طول روز نامردی بود استفاده از این تریک) میتونستم نزدیک به ۸۰ گیگ از اینترنت دانلود کنم و بخاطر این موفقیت به خودم و لینوکسم میبالم!