مدیریت لیست سیاه با استفاده از ipset

رضا فرخندگان ۱۰ اردیبهشت ۱۳۹۸ ۰ دیدگاه

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

چرا باید از ipset استفاده کنیم؟

دوستان من به تازگی یک سرور تست راه‌اندازی کردم تا یک سری مسائل امنیتی رو در خصوص بعضی از سرویس‌ها مثل mail-server بررسی کنم. خیلی جالب بود و قتی دیدم روی این سرور تست، تنها دو روز بعد از راه‌اندازی تعداد بالایی حملات مختلف داره انجام می‌شه و خب با توجه به آدرس آی‌پی‌ها مشخص بود که کار نرم‌افزارهای خودکار و bot-net های دوستان عزیز در چین و یکی دو جای دیگه است.

به‌هرحال با fail2ban و یک سری کار دیگه تقریباً این حملات بی معنی شدن، اما به این فکر افتادم که چه کاریه که اصلاً اجازه بدیم این حملات به سرور ما برسن؟ وقتی این‌ها اینقدر شناخته شده‌اند، پس آیا راهی داره که بتونیم این  bot-netها رو کلا بلاکشون کنیم؟ با یکم گشت و گذار متوجه شدم که می‌شه با ipset تعداد زیادی از blacklist ها که شامل ip این حمله‌کنندگان عزیز هست رو بلاک کنیم و کار به‌روزرسانی این ip ها رو به Cron بسپاریم و تا مقدار زیادی از شر این شیاطین اتوماتیک راحت بشیم.

مدیریت لیست سیاه با استفاده از ipset

حالا شاید یه عده بگن می‌شه از مثلاً وب‌سایتمون و سیستم ورود کاربران با گذاشتن CAPTCHA حفاظت کنیم، اما واقعیت اینه که این حمله‌کنندگان حتماً از چندین سرویس ارزان آنلاین برای حل پازل‌های CAPTCHA استفاده می‌کنند.

از طرفی در پشت صحنه‌ی این حملات گاهی اوقات یه تیم با نفرات زیاد وجود دارند (به‌هرحال شما فکر کنید این حملات وقتی از چین و هند میان دیگه مشکل منابع انسانی که ندارن!) و اونا کار حل این پازل‌‎های CAPTCHA رو انجام میدن؛ پس وقت، انرژی و هزینه بیشتر برای پیچیده‌تر کردن این پازل‌ها، تقریباً برای ما یه کار بیهوده‌ست. بنابراین ipset می‌تونه یه راه مناسب و بدون هزینه باشه.

ارتباط Ipset با Netfilter و iptables

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

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

مدیریت لیست سیاه با استفاده از ipset

نکته‌ای که وجود داره در مورد توزیع‌های لینوکس‌ اینه که اونا اکثراً از iptables به عنوان interface اصلی برای netfilter استفاده میکنن. netfilter یک چهارچوب فیلترینگ بسته‌ها بوده که داخل کرنل لینوکس قرار داره و با iptables می‌شه براش یک سری قانون تعریف کرد؛ که برای هر بسته عبوری از شبکه این قوانین بررسی بشه.

حالا مشکلی که در استفاده از iptables برای بلاک کردن این لیست‌های سیاه وجود داره اینه که اگر شما مثلاً یک لیست شامل ۳۰۰ هزار آی‌پی رو بهش بدید، وقتی iptables بخواد برای هر کدوم از این آی‌پی‌ها این قوانین رو بررسی و اعمال کنه، فاجعه‌ی کمبود منابع به وجود میاد و کلاً سیستم میره رو هوا و اصلاً نمی‌تونه جوابگوی این مسئله باشه؛ اینجاست که ipset شما رو نجات میده.

Ipset چیست؟

درواقع ipset میتونه یک لیست بسیار بزرگی از ip ها، پورت‌ها و مک آدرس‌ها رو بگیره و اون‌ها رو به شکل hash/bitmap در یک حافظه‌ی خیلی کوچیک ذخیره کنه. بعد خیلی راحت می‌تونید داخل قوانین iptables فقط به نام این لیست اشاره کنید و در زمان نیاز کل این لیست بلند‌بالا با یک قانون ساده داخل netfilter با سرعت خیلی بالا چک و اعمال بشه.

 همینطور می‌تونید محتویات لیست رو حتی در زمان اجرای فایروال سیستم هم تغییر بدید. ipset  باید در سطح کرنل فعال بشه و اکثر توزیع‌ها خودشون ipset رو در این سطح فعال می‌کنن (البته اونایی که امنیت خیلی براشون مهمه). قسمت خیلی خوب این داستان اینه که شما می‌تونید به‌راحتی کار به‌روزرسانی این لیست رو هم به Cron بسپرید و به بقیه‌ی کارهاتون برسید. خب بریم سراغ نصب و راه‌اندازی.

  • پیش‌‎نیازهای لازم برای شروع نصب یک سرور آماده (rpm base/debian base) با یک کاربر که دسترسی sudo ، و ارتباط با اینترنت باید برقرار باشه.

آموزش نصب ipset

برای نصب ipset روی سیستم‌های Debian,Ubuntu دستور زیر رو وارد کنید:

sudo apt-get install ipset

همینطور برای نصب روی سیستم‌های RHEL/CentOS,Fedora

sudo yum install ipset

 

تنظیمات و نحوه عملکرد ipset

با یه مثال شروع می‌کنیم:

اول بیایید یه ipset جدید به اسم my-banlist (یا هر اسمی که شما دوست دارید) بسازیم:

sudo ipset create my-banlist hash:net

hash:net در دستور بالا باید وجود داشته باشه (Required) و نشون میده که چه اطلاعاتی به چه نحوی باید ذخیره بشه. انواع مختلفی از ip set وجود داره. در حالت عادی hash:net ، ipset از یک hash استفاده می‌کنه تا چندین بلوک از CIDR ها رو ذخیره کنه. حالا اگر شما بخواهید یک ip مشخص رو در یک set ذخیره کنید، می‌تونید بجای hash:net از hash:ip استفاده کنید.

حالا اگر این دستور رو اجرا کنید:

sudo ipset list

یک همچین خروجی خواهید دید:

Name: my-banlist

Type: hash:net

Revision: 6

Header: family inet hashsize 1024 maxelem 65536

Size in memory: 344

References: 0

Number of entries: 0

Members:

این اطلاعات چی هستن؟ این دستور یک لیست از آی‌پی‌‌های در دسترس رو نشون میده. در ادامه اطلاعاتی از هر set و اینکه چه اعضایی دارن نمایش داده شده. به صورت پیش‌فرض هر کدوم از set آی‌پی‌ها می‌تونن ۶۵۵۳۶ عنصر (element)، که در واقع در اینجا همون بلوک‌های CIDR هستند رو ذخیره کنن. شما می‌تونید این مقدار رو با اضافه کردن maxelem به آخر دستور ساختن یک ipset مشخص کنید، مثل این:

sudo ipset create my-banlist hash:net  maxelem 1000000

بیایید یک سری بلوک آی‌پی (کاملا فرضی) رو به این set اضافه کنیم:

sudo ipset add my-banlist 1.1.1.1/32

sudo ipset add my-banlist 1.1.2.0/24

sudo ipset add my-banlist 1.1.3.0/24

sudo ipset add my-banlist 1.1.4.10/24

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

sudo ipset list

در انتهای خروجی نمایش داده شده می‌تونید در قسمت members آی‌پی‌های وارد شده رو ببینید.

اعمال قوانین بر روی iptables

حالا با استفاده از این لیست آی‌پی وارد شده به ipset می‌تونیم با استفاده از iptables قوانینی رو برای محدود کردنشون اعمال کنیم. برای این‌کار می‌تونیم از گزینه‌ی”-m set –match-set ” استفاده کنیم.

بیایید فرض کنیم می‌خواهیم یک قانون برای iptables بنویسیم که دسترسی آی‌پی‌های داخل ipset رو به پورت ۸۰ و در نتیجه دسترسی به وب سرور رو محدود کنه. برای این‌کار می‌تونیم این دستور رو وارد کنیم:

sudo iptables -I INPUT -m set –match-set my-banlist src -p tcp –destination-port 80 -j DROP

در صورت تمایل می‌تونید یک ipset مشخص رو داخل یک فایل ذخیره کرده و بعداً ازش استفاده کنید. با این دستورها:

sudo ipset save my-banlist -f my-banlist.txt

sudo ipset destroy my-banlist

sudo ipset restore -f my-banlist.txt

در این دستورات ما در واقع سعی کردیم که ipset قبلی رو با استفاده از دستور destroy از بین ببریم و ببینیم آیا می‌شه با استفاده از فایل ذخیره شده اون رو برگردوند یا نه؟

AutoBan

خب تا به اینجا باید یک ایده کلی در مورد قدرت بالای ipset به دست آورده باشید؛ اما همچنان اگر بخواهید تعداد بالایی آی‌پی رو به صورت موردی بلاک کنید، بازم کار سختی خواهد بود. دقیقاً برای همینه که شرکت‌های مختلف لیست‌های بلند بالایی از این آی‌پی‌ها دارن و کار شما رو راحت کردن.

برای امتحان کردن این blacklist ها ما قصد داریم بهتون نشون بدیم که چطور میشه به صورت خودکار این لیست‌های سیاه موجود رو به setهای آی‌پی ترجمه کرد. برای امتحان کردن این مسئله ما قصد داریم یکی از لیست‌های رایگان موجود در وب‌سایت iblocklist.com رو امتحان کنیم. اما نسخه‌های رایگان این وب‌سایت به فرمت P2P نوشته شده‌اند. برای اینکه بتونیم نسخه‌های P2P رو به IP-sets تبدیل کنیم، به یک ابزار متن‌باز پایتون به نام iblocklist2ipset  نیاز داریم. اول باید pip رو نصب کنید:

  • فقط دوستان یادتون نره که شما صرفاً به iblocklist2ipset فقط برای ترجمه فایل‌ها نیاز خواهید داشت. حالا اگر خودتون از وب‌سایت‌های دیگه لیست‌های دیگه‌ای رو تهیه کنید، می‌تونید قسمت نصب iblocklist2ipset رو رد کرده و فقط نام فایل لیست آی‌پی‌ها رو به ipset بدید و بعد براش داخل iptables یک قانون تعریف کنید.

آموزش نصب pip

آموزش نصب pip

برای debian/Ubuntu

sudo apt-get install python-pip

برای CentOS اول باید مخازن EPEL رو فعال کنید، بعد این دستور رو اجرا کنید:

sudo yum install python-pip

بعد از نصب کردن pip حالا میتونیم بریم برای نصب iblocklist2ipset روی اوبونتو:

sudo pip install iblocklist2ipset

و در توزیع‌هایی مثل fedora یا CentOS باید این دستور رو اجرا کنید:

sudo python-pip install iblocklist2ipset

حالا به وب‌سایت iblocklist.com برید و هر کدوم از لیست‌های موجود رو بررسی کرده و آدرس موجود برای نسخه P2P رو کپی کنید. ما در اینجا نسخه dshield رو انتخاب کردیم و آدرسش این هست:

http://list.iblocklist.com/?list=xpbqleszmajjesnzddhv&fileformat=p2p&archiveformat=gz

 و اگر این آدرس رو به iblocklist2ipset بدید، تقریباً دیگه کاری لازم نیست انجام بدید. دقت کنید که کل خطوط زیر یک دستوره:

sudo iblocklist2ipset generate –ipset=my-banlist “http://list.iblocklist.com/?                                                                                list=xpbqleszmajjesnzddhv&fileformat=p2p&archiveformat=” > banthis.txt.1

  • به دستور بالا دقت کنید. وقتی آدرس رو از وب‌سایت iblocklist.com بگیرید، در انتهای آدرس … p2p&archiveformat=gz … پسوند gz. رو می‌بینید که نکته‌ی مهم اینجاست : وقتی دارید دستور رو اجرا می‌کنید، حتماً این پسوند رو حذف کنید تا به خطاهای پایتون برنخورید.

بعد از اجرای دستور بالا شما یک فایل خواهید داشت به نام banthis.txt.1 که شامل تمامی ip های مورد نظر شما در اون لیست قرار گرفته. اگر محتویات این فایل رو بررسی کنید، خودتون لیست آی‌پی‌های موجود رو خواهید دید.

حالا باید این لیست رو به ipset بدیم تا کار رو شروع کنه:

sudo ipset restore -f banthis.txt

و در پایان می‌تونید با دادن یک قانون ساده و یک خطی به iptables حجم بزرگ ip های داخل لیست رو به راحتی بلاک کنید. مثلاً ما می‌خواهیم دسترسی این ip ها رو کلا به سرورمون بلاک کنیم:

sudo iptables -t raw -I PREROUTING -m set –match-set my-banlist src -j DROP

دقت کنید که شما می‌تونید به دلخواه دسترسی کل این آی‌پی‌ها رو به سرور محدود کنید. فقط یادتون نره که اسم ipset ما اینجا my-banlist هست که باید در زمان تنظیم کردن قانون iptables نام اون رو وارد کنید.

استفاده از cron

خب حالا اگر دلتون خواست این لیست مداوم به‌روز‌رسانی بشه چه کاری باید بکنید؟

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

 

اسکریپت کلی برای پروسه دریافت لیست

اگر به صفحه‌ی ما در گیت‌هاب سر بزنید و اسکریپت موجود در فایل ipset_update.sh را در سیستم خودتون ذخیره کنید (یا فقط محتویات این صفحه رو select کرده و کپی کنید)، می‌توانید با اجرایی کردن این فایل و سپردن اون به crontab یک وظیفه‌ی روزانه یا ساعتی رو تعریف کنید تا این فایل به شکل مداوم به‌روزرسانی بشه:

اول root بشید:

sudo su –

vim ipset_update.sh

اسکریپت رو اینجا paste کرده و ذخیره کنید. بعد باید به این فایل دسترسی اجرایی بدید:

chmod  ۷۵۵ ipset_update.sh

برای اینکه فیلترینگ رو بر اساس فایل ساخته شده برای ipset فعال کنیم، لازمه یک قانون در iptables بنویسیم که اون‌ها رو هم به انتهای فایل اسکریپت اضافه کردیم.

  • حتماً به انتهای اسکریپت نگاهی بندازید و در قسمتYOUR_IP_ADDRESS آی‌پی آدرس مد نظر خودتون رو وارد کنید تا هیچوقت شامل این قوانین نشه. اگر کلاینت هستید این آی‌پی می‌تونه آی‌پی Public شما باشه. و اگر آی‌پی خاصی مدنظرتون نیست، اون خط رو می‌تونید پاک کنید.

حالا فایل رو اجرا کنید:

./ipset_update.sh

اگر هیچ خطایی دریافت نکردید، یعنی فایلی به نام  block درست ساخته شده. برای اینکه مطمئن بشید که این لیست به ipset اضافه شده، این دستور رو اجرا کنید:

ipset list block

به شما لیست دریافت شده از dshield رو نمایش خواهد داد.

تنظیمات Cron

خب می‌رسیم به بخش اجرای روزانه‌ی این اسکریپت تا بتونیم فایلمون رو به‌روز نگه داریم و آی‌پی‌های جدید و خطرناک رو هر روز بلاک کنیم. اول باید فایل cron رو داخل etc/cron.daily/update_block/ رو می‌سازیم:

vim /etc/cron.daily/update_block

بعد این تنظیمات رو وارد کنید:

#/etc/cron.daily/update_block 

#Global variables

SHELL=/bin/bash 

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin 

MAILTO=root

HOME=/

#Every day at 4 a.m , poll for update to dshield

#block list, and update firewall blacklist.

۰ ۴ * * * * root /root/ipset_update.sh &>/dev/null

فایل رو ذخیره کنید و خارج بشید.

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

امیدوارم از این مطلب آموزشی خوشتون اومده باشه و از مفاهیم ساده‌ی اون لذت برده باشید.

جمع‌آوری شده توسط حمید نبی زاده

فناوران شبکه سینداد (آهنگ نوآوری)

سینداد یعنی هدیه‌ی سیمرغ، یا فرزند سیمرغ؛ به عبارتی یعنی خود سیمرغ، با همه ی شگفتی هایش، اما جوانتر و سرزنده تر. و این چیزی است که ما سعی می کنیم در سینداد باشیم. از سال ۱۳۸۵ دانش مان را به صورت خدماتی در حوزه ی هاستینگ، شبکه و تولید نرم افزار در اختیار مشتریان مان قرار داده ایم و به این افتخار می کنیم که تک تک آنها تا به امروز همراه ما مانده اند. باور داریم که سینداد صرفاً یک شرکت نیست، بلکه نوعی باور است به ارائه ی شگفت انگیز از هر چیز.