❓#1031 آموزش بستن دامنه های غیر مجاز در فایروال میکروتیک

| 0

یک بسته‌ی کامل از دستورات میکروتیک در ادامه ارائه خواهیم کرد، که هم HTTP و هم HTTPS را (تا حد ممکن) برای دامنه و همه ساب‌دامنه‌های dl-files.com و نیز دو ساب‌دامنه‌ی مشخص‌شده مسدود کند. چون نسخه‌ی RouterOS شما مشخص نیست برای ما، دو حالت جنرال و پیش فرض را در این مقاله پوشش خواهیم داد: دستورات عمومی (که روی v6 و v7 کار خواهد کرد) + یک rule ویژه‌ی SNI که فقط در RouterOS v7 قابل‌استفاده است (اگر v7 دارید از اون استفاده کنید، در غیر این صورت روش‌های جایگزین همینه).

پیش‌فرض‌ها/نکات مهم قبل از اجرا

  • اگر کلاینت‌ها مستقیم از DNS عمومی (مثلاً 8.8.8.8) استفاده کنند، باید دسترسیشان به DNSهای خارجی را مسدود کنیم تا DNS sinkhole/resolve ما کار کنه — در ادامه دستورات لازم برای انجام این کار را خواهیم آورد.

  • اگر این دامنه روی CDN باشه و آی‌پی‌های آن مشترک با سایت‌های سالم دیگری باشند، بلاک آی‌پی ممکن است به سرویس‌های دیگر لطمه بزند. لذا در این صورت ترکیب DNS sinkhole + SNI (در v7) بهترین نتیجه را خواهد داد.

  • تمام کدها را در ترمینال میکروتیک (Winbox/SSH) اجرا کنید. قبل از drop کردن می‌توانید با action=reject یا log تست کنید.

1) اضافه کردن رکوردهای DNS static (DNS sinkhole)

این قسمت وقتی مؤثر است که کلاینت‌ها از میکروتیک به‌عنوان DNS استفاده کنند.

/ip dns static add name=dl-files.com address=0.0.0.0 comment="block dl-files root"
/ip dns static add name=remotesupport.dl-files.com address=0.0.0.0 comment="block remotesupport"
/ip dns static add name=licenseapi.dl-files.com address=0.0.0.0 comment="block licenseapi"
/ip dns static add name=www.dl-files.com address=0.0.0.0 comment="block www (if present)"

توضیح: این‌ها پاسخ DNS را به 0.0.0.0 هدایت می‌کنند و بعبارتی دیگر صفحه/اتصال باز نخواهد شد.


2) جلوگیری از استفاده‌ی کلاینت‌ها از DNS بیرونی (اجبار به استفاده از DNS روتر)

اگر می‌خواهید مطمئن باشید همه DNSها از روتر عبور کنند (مهم برای اثر DNS sinkhole):

/ip firewall filter add chain=forward protocol=udp dst-port=53 action=drop comment="block external DNS UDP"
/ip firewall filter add chain=forward protocol=tcp dst-port=53 action=drop comment="block external DNS TCP"

اگر خودتون DNS خاصی را می‌خواهید allow کنید (مثلاً resolver محلی)، باید قبل از این ruleها برای آن allow بزنید (مثلاً allow از IP شبکه به روتر).


3) لایه‌ی فایروال — بلاک بر اساس IP (dynamic address-list)

حال باید اسکریپتی بسازیم که دامنه‌ها را resolve کند، آی‌پی‌ها را به address-list اضافه کند و rule فایروال ترافیک به آن‌ها را drop کند.

ابتدا یک address-list و rule drop:

/ip firewall address-list add list=blocked_dlfiles address=0.0.0.0 disabled=yes comment="placeholder"

/ip firewall filter add chain=forward dst-address-list=blocked_dlfiles action=drop comment="block traffic to dl-files IPs"

حالا اسکریپت آپدیت‌کننده (نام اسکریپت و دامنه‌ها قابل تغییرند):

Download script code in the text files (swift) 

و یک scheduler برای اجرای هر 10 دقیقه:

/system scheduler add name=sched_update_block_dlfiles interval=10m on-event="/system script run update_block_dlfiles"

توضیح: این اسکریپت سعی می‌کند آی‌پی‌ها را از DNS cache بردارد (اگر قبلاً رزولو شده باشند) و اگر پیدا نشد از :resolve استفاده می‌کند. آی‌پی‌ها را با timeout 1d اضافه می‌کند تا به‌صورت دوره‌ای تجدید شوند.


4) بلاک میزبان در HTTP (Host header) — برای پورت 80

یک layer7 پروتکل تعریف می‌کنیم که Host header شامل dl-files.com را بگیرد و بعد ترافیک HTTP را drop کنیم (این روش ساب‌دامین‌ها را هم می‌گیرد).

ابتدا layer7:

/ip firewall layer7-protocol add name=block_dlfiles_l7 regexp="^Host: .*dl-files\\.com"

سپس یک rule:

/ip firewall filter add chain=forward protocol=tcp dst-port=80 layer7-protocol=block_dlfiles_l7 action=drop comment="block http host dl-files"

نکته: layer7 ممکن است بار پردازشی CPU روی روتر ایجاد کند؛ اگر تعداد کاربران زیاد است، مراقب بار باش.


5) بلاک SNI برای HTTPS (پیشنهاد شده — فقط RouterOS v7)

اگر RouterOS v7 دارید، می‌تونید از tls-host در rule فایروال استفاده کنید تا TLS SNI را چک کرده و نام میزبان‌های مشخص‌شده را بلاک کنی (ایده‌آل برای HTTPS).

مثال (یک rule برای هر hostname یا چند rule جدا):

/ip firewall filter add chain=forward protocol=tcp dst-port=443 tls-host="dl-files.com" action=drop comment="block SNI dl-files.com"
/ip firewall filter add chain=forward protocol=tcp dst-port=443 tls-host="remotesupport.dl-files.com" action=drop comment="block SNI remotesupport"
/ip firewall filter add chain=forward protocol=tcp dst-port=443 tls-host="licenseapi.dl-files.com" action=drop comment="block SNI licenseapi"

اگر میکروتیک شما tls-host را پشتیبانی نمی‌کند، از ترکیب DNS sinkhole + address-list استفاده کنید (اسکریپت بالا ↑ ) یا از پروکسی SSL inspection بهره بگیرین (پیچیده‌تر، نیاز به CA و cert).


6) نمونه ترتیب کاملِ وارد کردن (ترتیب پیشنهادی اجرا)

  1. اضافه کردن DNS staticها (بخش 1).

  2. اضافه کردن layer7 و rule HTTP (بخش 4).

  3. اضافه کردن ruleهای drop برای پورت 53 خارجی (بخش 2) — مواظب باش که اگر خودت DNS خارجی نیاز داری، قبل از این allow بذار.

  4. اضافه کردن address-list و rule drop (بخش 3). سپس اسکریپت و scheduler را فعال کن.

  5. اگر RouterOS v7 داری، اضافه کن ruleهای tls-host (بخش 5).

  6. مانیتور لاگ / connection tracking تا مطمئن بشی چیزهای مطلوب بلاک شده‌اند و چیزهای دیگر آسیب نبینند.


7) تست و دیباگ

  • برای تست DNS sinkhole از یک کلاینت داخل شبکه:

    • nslookup dl-files.com یا dig dl-files.com باید 0.0.0.0 یا پاسخ نامعتبر نشون بده.

  • برای تست HTTP: از curl داخل شبکه:

    • curl -v http://dl-files.com باید قطع یا ریجکت شود.

  • برای تست HTTPS: اگر v7 و tls-host اضافه کردی، openssl s_client -connect dl-files.com:443 -servername dl-files.com باید connection قطع یا بلاک شود (یا handshake به درستی رد شود).

  • لاگ‌ها را چک کن: /log print یا برای فایروال با action=log یک rule موقت قرار بده تا ببینی درخواست‌ها match می‌خورند یا نه.


8) هشدار نهایی و پیشنهادات

  • این بسته باید در اکثر سناریوها مؤثر باشد، اما اگر کاربرها از VPN یا DNS-over-HTTPS/TLS استفاده کنند (یا اپلیکیشن‌هایی که SNI را ارسال نمی‌کنند)، ممکن است نیاز به قواعد اضافی (مثلاً بلاک کردن VPN ها/پورت‌ها یا DPI) داشته باشید.