وقتی یک اسکریپت آلوده یا برنامهای با پیکربندی نادرست شروع به کاوش آدرسهای 10.x یا 192.168.x میکند، این ترافیک از سرور شما خارج میشود و اغلب باعث گزارش سوءاستفاده از سوی شبکه میشود. مسدود کردن اتصالهای خروجی به محدودههای خصوصی یک اقدام پیشگیرانه ساده روی هر VPS Linux Infrawire است. این راهنما نشان میدهد چگونه با UFW این کار را بدون خراب کردن DNS یا اتصال خودتان انجام دهید.
📋 پیشنیازها
- یک VPS با دسترسی SSH بهعنوان root و سیستم Ubuntu 24.04 یا Debian 12 (UFW روی هر دو موجود است).
- آشنایی پایه با UFW. اگر هنوز نصب نیست:
Bashsudo apt update && sudo apt install -y ufw
- یک نشست SSH دوم که هنگام تغییر فایروال باز بماند.
🧭 کدام محدودهها را مسدود کنیم
| محدوده | کاربرد |
|---|---|
10.0.0.0/8 | خصوصی طبق RFC1918 |
172.16.0.0/12 | خصوصی طبق RFC1918 |
192.168.0.0/16 | خصوصی طبق RFC1918 |
100.64.0.0/10 | NAT در سطح اپراتور (RFC6598) |
169.254.0.0/16 | link-local در IPv4 |
192.0.0.0/24 | تخصیصهای پروتکلی IETF |
198.18.0.0/15 | آزمون کارایی |
fc00::/7 | آدرسهای محلی یکتا در IPv6 |
fe80::/10 را مسدود نکنید: IPv6 برای کشف همسایه و اغلب برای گیتوی پیشفرض از آدرسهای link-local استفاده میکند و مسدود کردن آن IPv6 را کاملاً قطع میکند.
🔍 ابتدا بررسی کنید VPS واقعاً به چه چیزی نیاز دارد
اگر گیتوی یا حلکننده DNS شما در یک محدوده خصوصی باشد، مسدودسازی کلی شبکهتان را قطع میکند. پیش از افزودن هر قاعده پیکربندی را ببینید:
Baship route ip -6 route cat /etc/resolv.conf resolvectl status | grep -E 'DNS Servers|Link'
اگر حلکننده یا سرویسی که به آن وابستهاید آدرس خصوصی دارد (PRIVATE_DNS_IP)، آن را صریحاً مجاز کنید و این قاعده را مطابق زیر اول قرار دهید. اگر همهچیز عمومی است، این مرحله را رد کنید.
🧱 روش ۱: ufw deny out
مطمئن شوید SSH در دسترس میماند و سپس سیاستهای پیشفرض را تنظیم کنید. پاسخهای نشستهای SSH ورودی تحت تأثیر قواعد خروجی به محدودههای خصوصی نیستند.
Bashsudo ufw allow 22/tcp sudo ufw default deny incoming sudo ufw default allow outgoing
اگر استثنایی لازم دارید، آن را در موقعیت 1 درج کنید تا پیش از قواعد مسدودسازی ارزیابی شود:
Bashsudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53
حالا قواعد مسدودسازی را اضافه کنید، یکی برای هر محدوده (قواعد UFW به ترتیب ارزیابی میشوند و اولین تطابق برنده است):
Bashsudo ufw deny out to 10.0.0.0/8 sudo ufw deny out to 172.16.0.0/12 sudo ufw deny out to 192.168.0.0/16 sudo ufw deny out to 100.64.0.0/10 sudo ufw deny out to 169.254.0.0/16 sudo ufw deny out to 192.0.0.0/24 sudo ufw deny out to 198.18.0.0/15 sudo ufw deny out to fc00::/7 sudo ufw enable
ممکن است ufw enable هشدار دهد که اتصالهای SSH را مختل میکند؛ چون پورت 22 مجاز است، با y پاسخ دهید. ترتیب را با این دستور مرور کنید:
Bashsudo ufw status numbered
📄 روش ۲: before.rules
اگر یک بلوک واحد از قواعد را ترجیح میدهید که پیش از قواعد کاربر اعمال شود، فایل /etc/ufw/before.rules را ویرایش کنید. ابتدا نسخه پشتیبان بگیرید:
Bashsudo cp /etc/ufw/before.rules /etc/ufw/before.rules.bak sudo nano /etc/ufw/before.rules
در بخش *filter، بعد از خطوطی که loopback و اتصالهای برقرارشده را میپذیرند، اینها را اضافه کنید:
TEXT1# مسدود کردن ترافیک خروجی به شبکههای خصوصی 2-A ufw-before-output -d 10.0.0.0/8 -j REJECT 3-A ufw-before-output -d 172.16.0.0/12 -j REJECT 4-A ufw-before-output -d 192.168.0.0/16 -j REJECT 5-A ufw-before-output -d 100.64.0.0/10 -j REJECT 6-A ufw-before-output -d 169.254.0.0/16 -j REJECT
IPv6 فایل جداگانهای به نام /etc/ufw/before6.rules دارد که زنجیره ufw-before-output در آن است:
TEXT-A ufw-before-output -d fc00::/7 -j REJECT
استثنای PRIVATE_DNS_IP را درست بالای این خطوط با -A ufw-before-output -d PRIVATE_DNS_IP -j ACCEPT بگذارید. سپس بارگذاری مجدد کنید:
Bashsudo ufw reload
REJECT بلافاصله با خطا پاسخ میدهد، پس برنامهها بهجای انتظار برای پایان مهلت، سریع شکست میخورند. اگر سکوت را ترجیح میدهید از -j DROP استفاده کنید.
✅ بررسی
قواعد باید بارگذاری شده باشند و مقصدهای مسدود شکست بخورند، در حالی که مقصدهای عمومی کار کنند:
Bashsudo ufw status verbose ping -c 1 10.0.0.1 # باید شکست بخورد ping -c 1 192.168.1.1 # باید شکست بخورد curl -m 5 http://10.0.0.1 # باید شکست بخورد ping -c 2 1.1.1.1 # باید موفق شود dig +short example.com # باید حل شود curl -I https://www.debian.org
با ufw deny out ping ناموفق معمولاً Operation not permitted نشان میدهد. شمارندههای بسته برخوردها را تأیید میکنند:
Bashsudo iptables -L ufw-user-output -n -v sudo iptables -L ufw-before-output -n -v
🛠️ رفع اشکال
DNS از کار افتاد. حلکننده شما در محدوده خصوصی است. ترتیب را با sudo ufw status numbered بررسی کنید و سپس sudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53 را اضافه کنید. میتوانید در پیکربندی شبکه به یک حلکننده عمومی هم تغییر دهید.
پس از تغییر IPv6 خراب شد. احتمالاً fe80::/10 یا گیتویی در fc00::/7 را مسدود کردهاید. قاعده را با sudo ufw delete deny out to fc00::/7 حذف کنید و فقط آنچه لازم است دوباره اضافه کنید.
به سرویسی در شبکه خصوصی (VPN یا API داخلی) دسترسی ندارید. برای همان آدرس دقیق یک قاعده مجاز با ufw insert 1 allow out to PRIVATE_IP اضافه کنید. اگر دسترسی به خود SSH قطع شد، از هر دسترسی کنسولی به سرور استفاده کنید و sudo ufw disable را اجرا کنید.
🔒 VPS شما دیگر بهطور تصادفی شبکههای خصوصی را اسکن نمیکند: گزارشهای سوءاستفاده از این نوع باید متوقف شوند.