HAProxy – لود بالانسینگ و جلوگیری از حملات DDOS ساده

HAProxy یک لودبالانسر (HTTP/TCP Load Balancer) متن باز میباشد که با تقسیم بار ترافیکی بین چندین سرور و تنظیمات بسیار قدرتمند, بازدهی و قابلیت اطمینان سمت سرور را به صورت موثری افزایش میدهد. همچنین گرچه این نرم افزار در اصل به منظور جلوگیری از حملات داس ساخته نشده است اما با اعمال تنظیمات صحیح به لایه امنیتی کارامدی برای مقابله با حملات داس ساده (Slowloris , …) تبدیل میشود. از مشتریان مطرح این نرم افزار GitHub, Imgur, Instagram و Twitter را میتوان نام برد. در این مقاله با این نرم افزار آشنا میشویم و نحوه نصب و تنظیم آن را بر روی توزیع های مطرح لینوکس بررسی میکنیم.

> برخی از قابلیت های HAProxy

  • قابلیت فعالیت در لایه ۴ و ۷ (TCP و HTTP)
  • امکان مدیریت و لودبالانس چندین Backend
  • امکان بررسی سلامت بکندها (Backend health check)
  • انعطاف فراوان در تنظیم Timeoutها
  • امکان محدود کردن ترافیک بر اساس پهنای باند مصرفی هر کلاینت
  • امکان محدودسازی موقت هر IP بر اساس شرط های تعیین شده
  • امکان افزودن IP به لیست سیاه و سفید
  • امکان افزودن, حذف و ایجاد تغییرات بر روی Response header و Request header
  • امکان مانیتورینگ سرورها از طریق وب

> پیش از نصب

دقت شود در صورتی که وب سرور شما بر روی “Port: 80” و یا “Port: 443” در حال اجرا میباشد, باید آن را به portهای دیگری نظیر ۸۰۸۰ و ۸۴۴۳ تغییر دهید. در صورت مشغول بودن پرت ۸۰ سرویس HAProxy بعد از نصب به درستی استارت نمیشود.

> نحوه نصب HAProxy در Debian و Ubuntu

sudo apt-get update
sudo apt-get install haproxy

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

> نحوه نصب HAProxy در Fedora و CentOS

yum install haproxy

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

> آموزش راه اندازی و تنظیمات ابتدایی HAProxy

» چگونه تنظیمات HAProxy چرا انجام دهیم؟

بعد از نصب HAProxy میتوانید تنظیمات پیشفرض نرم افزار را در مسیر etc/haproxy/haproxy.cfg/ مشاهده کرده و تغییرات مورد نظر خود را در آن اعمال کنیم. با توجه به تنظیمات مختلف و بیشمار این نرم افزار لازم است که ابتدا با ساختار و مفاهیم کلی نظیر ACL , Backend و Frontend آشنا شویم و سپس با کمک منبع راهنمای تنظیمات تغییرات مورد نظر خود را اعمال کنیم.

اکنون به توضیح مفاهیم کلی ACL , Backend و Frontend میپردازیم.

» ACL چیست؟

Access Control List یا به اختصار ACL به دستور شرطی گفته میشود که در صورت رخ داد آن عملیات خاصی توسط لودبالانسر انجام میشود.

برای مثال:

acl is_static path_end .gif .png .jpg .css .js

توضیح: در صورتی که پسوند فایل js , css , jpg , png و یا gif باشد مقدار is_static برابر True میشود. در خطوط بعدی تنظیمات میتوان بر اساس مقدار is_static اقدامات مختلفی را انجام داد.

برای توضیحات بیشتر راجب ACLها به لینک منبع مراجعه کنید.

» Backend چیست؟

بکند شامل یک یا مجموعه ای از سرورها میباشد که درخواست های فوروارد شده از طرف HAProxy را دریافت کرده و به سرورهای تعریف شده ارسال میکند. همچنین در HAProxy میتوانیم بینهایت بکند تعریف کنیم.

برای مثال:

backend web-backend
balance roundrobin
server web1 web1.yourdomain.com:80 check
server web2 web2.yourdomain.com:80 check
backend blog-backend
balance roundrobin
mode http
server blog1 blog1.yourdomain.com:80 check
server blog1 blog1.yourdomain.com:80 check

توضیح:

در این مثال دو بکند جداگانه برای سایت اصلی (web-backend) و بلاگ (blog-backend) تعریف شده است. در هر کدام از بکندها دو سرور تعریف شده و سلامت سرورها با عبارت check بررسی میشود.

balance roundrobin الگوریتم مورد استفاده جهت انتخاب سرور بهینه و لودبالانسینگ میباشد. (در ادامه مطلب به بررسی انواع الگوریتم های لود بالانسینگ میپردازیم.)

mode http لایه لودبالانسینگ را به HTTP (لایه ۷) تنظیم میکند.

» Frontend چیست؟

فرانتند درگاه ورودی درخواست ها (Requests) میباشد و با کمک ACLها مشخص میکند که هر درخواست به کدام بکند ارسال شود. همچنین قابلیت هایی نظیر فیلترینگ, لیست سفید و سیاه, Rate limiting و … در این بخش قابل تنظیم میباشند.

» پس از ویرایش تنظیمات

به منظور اعمال تنظیمات انجام شده باید سرویس HAProxy را مجددا راه اندازی کنیم.

> انواع لود بالانسینگ

اکنون با شناخت ساختار کلی HAProxy و نحوه انجام تنظیمات بر روی آن, میتوانیم به توضیح و بررسی انواع لود بالانسینگ قابل پیاده سازی در HAProxy بپردازیم.

» بدون لودبالانسر

شکل زیر نمای کلی این حالت میباشد:

بدون لودبالانسر

در این معماری بدون وجود لودبالانسر کاربران به طور مستقیم به وب سرور متصل میشوند. در صورت از کار افتادن یا پر شدن ظرفیت وب سرور, سرویس دهی با تاخیر مواجه شده و یا به طور کامل متوقف میشود. در نتیجه کاربران در دریافت سرویس با اختلال مواجه میشوند.

» لودبالانسینگ لایه ۴ (TCP based)

لودبالانسینگ لایه ۴ شیوه پیشفرض تعریف شده در HAProxy میباشد. در این معماری تمامی درخواست های ارسال شده در لایه انتقال آنالیز شده و بر اساس رنج IP و شماره Port و دامین به بکند تعریف شده فوروارد میشوند.

لودبالانسینگ لایه 4

همانگونه که در شکل مشخص است, تمامی ترافیک دامین yourdomain.com به بکند تعریف شده فوروارد میشود. درون بکند تعریف شده وب سرور بهینه توسط الگوریتم لودبالانسینگ جهت سرویس دهی انتخاب میشود. دقت شود که سرویس دیتابیس مشترک است و تمامی سرورها به دلیل حفظ یکپارچگی داده ها از یک دیتابیس و اپلیکیشن واحد استفاده میکنند.

» لودبالانسینگ لایه ۷ (HTTP based)

لودبالانسینگ لایه ۷ شیوه پیچیده تری جهت مدیریت بار ترافیکی میباشد. در این شیوه درخواست ها بر اساس URI و دیگر پارامترهای پروتکل HTTP به بکندهای متفاوتی فوروارد میشوند. به عبارتی دیگر در این شیوه میتوان قسمت های مختلف یک وب سایت نظیر بلاگ, فروشگاه و … را با بکندها و وب سرورهای جداگانه میزبانی کرد.

لودبالانسینگ لایه 7

اکنون مثالی عملی طبق شکل بالا طرح میکنیم. در مثال پایین درخواست های ارسال شده به yourdomain.com/blog توسط blog-backend میزبانی میشوند و تمامی درخواست های دیگر توسط web-backend میزبانی میشوند.

frontend http
bind *:80
mode http
acl url_blog path_beg /blog
use_backend blog-backend if url_blog
default_backend web-backend

نکته: شماره Port ورودی بر روی ۸۰ تنظیم شده و شیوه لودبالانسینگ بر روی HTTP (لایه ۷) تنظیم شده است.

acl url_blog path_beg /blog در صورتی که URI با blog/ شروع شود این شرط برقرار است.

use_backend blog-backend if url_blog در صورتی که شرط قبلی برقرار شده باشد (url_blog ست شده باشد) درخواست به بکند blog-backend فوروارد میشود.

default_backend web-backend تمامی درخواست های دیگر را به بکند پیشفرض (web-backend) فوروارد میکند.

> الگوریتم های لودبالانسینگ

الگوریتم های لودبالانسینگ به مظنور تشخیص سرور بهینه استفاده میشوند. پس از فوروارد هر درخواست به بکند مورد نظر, HAProxy از یک الگوریتم جهت تشخیص سرور بهینه با بار ترافیکی کمتر استفاده میکند. با توجه به تعداد بالای این الگوریتم ها, در این مقاله به بررسی تعدادی از معروف ترین آنها میپردازیم.

» roundrobin

الگوریتم Round Robin به صورت پیشفرض در تنظیمات نرم افزار فعال است. در این الگوریتم از هر سرور به نوبت به صورت چرخه ای استفاده میشود.

» leastconn

الگوریتم Least Connection درخواست را به سرور با تعداد کانکشن های مشغول به کار کمتر فوروارد میکند. همچنین در صورت برابر بودن بار سرورها همانند roundrobin عمل میکند. این الگوریتم برای فعالیت هایی که نیاز به session طولانی مدت دارند مناسب است.

» source

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

» دیگر الگوریتم ها

برای آشنایی با دیگر الگوریتم ها به لینک منبع مراجعه کنید.

> بررسی سلامت سرورها

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

> جلوگیری از حملات DDOS

با اعمال تنظیمات صحیح میتوانیم از حملات ddos ساده در لایه ۴ یا ۷ جلوگیری کنیم. لازم به ذکر است که استفاده از HAProxy جهت جلوگیری از DDOS به تنهایی کافی نبوده و به این منظور باید با در نظر داشتن نوع حمله, از چندین لایه امنیتی نرم افزاری و سخت افزای بهره گرفت. اما با توجه به تفاوت عمده تنظیمات مورد نیاز هر سرور و اپلیکیشن وارد بحث تنظیمات ضد DDOS در HAProxy نمیشویم. برای آشنایی بیشتر با تنظیمات مرتبط با “جلوگیری از حملات DDOS” به لینک های زیر مراجعه کنید:

Simple Denial of Service DOS attack mitigation using HAProxy

HAProxy DDOS protection + cloudflare

> لینک ها و منابع مفید

HAProxy Configuration guide

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *