عندما يبدأ سكربت مخترَق أو تطبيق سيئ الإعداد بفحص عناوين 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 بالكامل.
🔍 تحقق أولًا مما يحتاجه خادمك فعلًا
إذا كانت البوابة أو محلِّل DNS في نطاق خاص، فسيقطع الحظر الشامل شبكتك. اطّلع على إعدادك قبل إضافة أي قاعدة:
Baship route ip -6 route cat /etc/resolv.conf resolvectl status | grep -E 'DNS Servers|Link'
إذا كان لمحلِّل أو خدمة تعتمد عليها عنوان خاص (PRIVATE_DNS_IP)، فاسمح به صراحةً وضع هذه القاعدة أولًا كما يلي. وإن كان كل ما تستخدمه عامًا، يمكنك تخطي هذه الخطوة.
🧱 الطريقة 1: 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
📄 الطريقة 2: 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.
🔒 لم يعد خادمك قادرًا على مسح الشبكات الخاصة عن طريق الخطأ: ينبغي أن تتوقف بلاغات الإساءة من هذا النوع.