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

مهمترین نکته هنگام مسدود کردن حملات DDOS این است که هیچ ترافیک قانونی را مسدود نکنید. اگر می‌دانید که سایت شما ترافیک کمی دریافت می‌کند (مانند یک برنامه داخلی با احراز هویت)، می‌توانید قوانین نسبتاً سخت‌گیرانه و خاصی را برای مسدود کردن دسترسی brute force تعیین کنید. اما در اکثر سناریوها برای یک وب سایت عمومی، شما باید نسبتا رفتار ملایم داشته باشید.

خب بیایید در ادامه برخی فرضیات در مورد ترافیک هایی که از سمت مرورگر میآیند را بررسی کنیم:

۱) مرورگرهای وب بیش از ۵ تا ۷ اتصال همزمان در هر دامنه ایجاد نمی کنند.
۲) معمولا کاربران وب در ۱۰ ثانیه بیش از ۱۰ بار صفحه را بارگزاری نمی کنند!
۳) بعید است که کاربران واقعی ۱۰ خطای برنامه را در ۲۰ ثانیه مشاهده کنند - مگر اینکه برنامه شما خراب شود و مشکلات بزرگتری داشته باشید!

بنابراین بیاییم قوانینی را بر اساس محدود کردن آدرس از یک source ip ایجاد کنیم. برای انجام این کار با ابزار HAProxy یک پیکربندی دستی لایه 7 ایجاد می کنیم:

    # Dont allow more than 10 concurrent tcp connections OR 10 connections in 3 seconds
    tcp-request connection reject if { src_conn_rate(Abuse) ge 10 }
    tcp-request connection reject if { src_conn_cur(Abuse) ge 10 }
    tcp-request connection track-sc1 src table Abuse
    tcp-request content reject if { src_get_gpc0(Abuse) gt 0 }
    acl abuse src_http_req_rate(Abuse) ge 10
    acl flag_abuser src_inc_gpc0(Abuse) ge 0
    acl scanner src_http_err_rate(Abuse) ge 10
    http-request deny deny_status 429 if abuse flag_abuser
    http-request deny deny_status 429 if scanner flag_abuser

در ادامه باید مقادیر زیر را به backend سرویس haproxy اضافه نماییم:

backend Abuse
    stick-table type ip size 1m expire 30m store conn_rate(3s),conn_cur,gpc0,http_req_rate(10s),http_err_rate(20s)

با توجه به موارد بالا اگر کاربر با یک IP بیش از 10 اتصال همزمان یا بیش از 10 درخواست در 3 ثانیه داشته باشد (همانطور که در جدول Backend Abuse تعریف شده است) به سادگی اتصال TCP یا http آن را رد می کند.

در تعاریف بالا این ip به صورت موقت تا ۳۰ دقیقه Ban میشود و هیچ پاسخی از سمت سرور دریافت نمیکند.

شما می توانید این را با یک دستور ساده Apache bench تست کنید.

ab -n 11 -c 1 https://<server ip>/

یا برای تست مسدودسازی همزمان:

ab -n 1 -c 10 http://<server ip>/

همچنین جهت بهبود امنیت سرویس های خود میتوانید از یک range ip استفاده کنید. این کار باعث میشود سرویس ها و دامنه های شما فقط از طریق whitelist که تعریف کردید قابل نمایش باشد.

جهت انجام اینکار مقادیر زیر را به backend اضافه میکنیم:

backend mydatabase
    acl whitelist src -f /etc/haproxy/ip.lst
    http-request deny unless whitelist

دستور بالا هر درخواستی که برای سرویس دیتابیس وارد میشود را بررسی میکند. اگر ip مورد نظر جزو لیستی که ایجاد شده است نباشد اجازه دسترسی نمیدهد و با خطا ۴۰۳ مواجه میشود.

منابع :

https://www.loadbalancer.org/