
أتمتة إيقاف الروبوتات الضارة من الوصول إلى خادمك
واجهة مستخدم طرفية (TUI)، وواجهة ويب، وواجهة سطر أوامر (CLI) تساعدك على تهيئة خادمك لإيقاف الروبوتات الضارة دون الاختباء خلف شبكة توصيل المحتوى (CDN).
يعمل جنبًا إلى جنب مع NGINX وجدار الحماية الحالي لديك (iptables أو nftables)، على مستويين منفصلين:
يبذل التطبيق قصارى جهده لعدم إغلاق الخادم في وجهك، لكنك تستخدمه على مسؤوليتك الخاصة. ولاحظ أنه مرخّص بموجب AGPL، لذا إذا كنت تستخدمه تجاريًا، فتأكد من الالتزام الحرفي بشروط الترخيص.
من crates.io:``` cargo install stop-bots
أو البناء من نسخة مستخرجة:```
cargo install --path .
يتوفر ملف ثنائي x86_64 جاهز لنظام Linux على إصدارات GitHub.
يتطلب Rust 1.88 أو أحدث للبناء. Linux فقط عملياً: فهو يستدعي
systemctl وnginx -t وnft/iptables، لذا بينما يُترجم في أماكن أخرى لن يكون
ذا فائدة كبيرة هناك.
شغّل الملف الثنائي بدون وسائط لتشغيل واجهة TUI، أو stop-bots web لنفس الشاشات في
متصفح (انظر واجهة الويب)، أو انظر stop-bots --help للحصول على القائمة الكاملة
لأوامر CLI الفرعية. يمكن استخدام TUI وCLI معاً. اضبط كل شيء في TUI
ثم استخدم CLI في crontab لإبقاء القواعد محدّثة.
يمكنك الخروج من التطبيق، أو الرجوع من نافذة منبثقة/قائمة فرعية، باستخدام 'q' أو Escape.
يمكنك التبديل بين السمة الداكنة والفاتحة باستخدام 't'. سيحاول التطبيق اكتشاف السمة تلقائياً، لكن لبعض تركيبات الطرفية والمضاعِف (multiplexer) لا تتوفر معلومات كافية لاتخاذ الخيار الصحيح.
1–4 (أو d/b/s/p) تنتقل مباشرة إلى شاشة؛ Left/Right، أو مرادفاتهما في vim h/l،
تتنقل بينها؛ ? يبدّل مرجعاً كاملاً لارتباطات المفاتيح في أي وقت، و:
يفتح لوحة أوامر تسرد كل إجراء بالاسم. Tab / Shift+Tab تنقل دائماً بين
لوحات الشاشة الحالية، وليس بين الشاشات.
تمتلك لوحة التحكم (Dashboard) كل ما ينتهي به المطاف في سكربت الجدار الناري؛ وتمتلك إعدادات الموقع (Site settings) كل ما ينتهي به المطاف في إعداد NGINX. هذا التقسيم يحدد مكان وجود أي إعداد معيّن.
Up/Down تتنقل بين القوائم الثلاث؛ m تبدّل الوضع الجغرافي. اضغط F لعرض
قواعد الجدار الناري الحالية في سكربت — النافذة المنبثقة تحتوي أيضاً على مفتاح "التطبيق بعد الكتابة" (Space) لفرضه فعلياً
فوراً، بدلاً من تطبيقه يدوياً بعد ذلك. ثلاثة مفاتيح أخرى تعمل على المضيف بأكمله: u ينزّل كل القوائم، a يطبّق كلا المستويين (NGINX، ثم الجدار الناري)، و
w يضع هذه الوحدة خلف NGINX — نفس الثلاثة الموجودة في المتصفح كأزرار ولوحة.Tab للتركيز عليها) تحتوي على الخيارات
على مستوى المضيف التي تشكّل الإعداد المُولَّد — ما الذي يحصل عليه الطلب المحظور (انظر أدناه)،
وما إذا كان سيُقدَّم robots.txt مُولَّد، وتحديد المعدل — فوق كل موقع NGINX
مكتشف على القرص، كل منها بحالة حية "محدّث / قديم / غير موجود" وإجراءات
لتطبيق السياسة الحالية على موقع واحد أو عليها جميعاً. تغيير أي من تلك الإعدادات يقلب
كل موقع مطبَّق إلى ، وهي إشارتك لإعادة التطبيق. فتح موقع يتيح لك
تجاوز سياسة الفئة/الروبوت الخاصة به، وتشغيل أي من قواعد شكل الطلب الست، وسرد
المسارات المعفاة من الحجب.إعدادات الروبوتات، حيث يعيش كل مصدر قائمة وكل روبوت فردي:
إعدادات الموقع، حيث تجلس خيارات NGINX على مستوى المضيف فوق كل موقع موجود على القرص:
الحماية الديناميكية، العرض الحي لما يضرب الخادم الآن:
الروبوتات المعروفة، حسب الفئة (ماسح / محرك بحث / زاحف ذكاء اصطناعي)، مصدرها
ArcJet's Well-Known Bots،
ai.robots.txt و
NGINX Ultimate Bad Bot Blocker
قائمة. حجب فئة يحقن قاعدة if ($http_user_agent ...) في إعداد NGINX لكل موقع
(apply-blocks / a/A في إعدادات الموقع).
طلبات كثيرة جداً، عبر تحديد المعدل الخاص بـ NGINX. على عكس كل شيء آخر هنا، يُفرض هذا بواسطة NGINX وقت الطلب بدلاً من تحليل سجل بعد ذلك. معطّل افتراضياً: حد مضبوط لموقع خاطئ يردّ الزوار الحقيقيين.
بلطف، أولاً — robots.txt مُولَّد اختياري يسرد كل روبوت تحجبه،
للزاحفات التي تحترمه، بالإضافة إلى مسار المصيدة (honeypot) أدناه. معطّل افتراضياً، لأنه
يستبدل ما يقدّمه موقعك على /robots.txt اليوم.
إلا حيث تقول خلاف ذلك — إعفاءات مسارات لكل موقع، حتى تتمكن من حجب زاحفات الذكاء الاصطناعي
في كل مكان إلا /blog.
الطلبات التي لا تبدو كمتصفح، لكل موقع. ست قواعد مستقلة، كل منها مفتاح خاص بها وكلها معطّلة افتراضياً — مفتاح واحد لكل قاعدة حتى إذا توقف شيء يخصك عن العمل، يمكنك معرفة أي قاعدة فعلت ذلك:
خيار واحد على مستوى المضيف، في إعدادات الموقع. هذه ليست رموز حالة قابلة للتبادل — كل منها يقول شيئاً مختلفاً، والفرق يهم أكثر بالنسبة للعملاء الذين لم تقصد الإمساك بهم:
المصيدة (tarpit) هي الخيار الألطف لإنذار خاطئ — عميل أُمسك به خطأً يُبطَّأ،
لا يُرفض — والأقسى في التكلفة على روبوت، حيث يبقى اتصاله خاملاً. أمران يجب
معرفتهما قبل اختياره: إنه يحتفظ بأحد اتصالات عامل NGINX لديك طوال المدة أيضاً، لذا
فإن سيلاً من عملاء المصيدة يتنافس مع الزوار الحقيقيين على worker_connections؛ وكم
يستمر فعلياً يعتمد على كيفية اختيار NGINX لكتابة جسم خطأ صغير، وهو
مذكور في TODO.md كحاجة إلى فحص مقابل خادم حقيقي.
كل من هذه مفتاح مستقل في لوحة "الحجب التلقائي" في لوحة التحكم، وكل منها يضيف حجباً مؤقتاً في الجدار الناري ينتهي من تلقاء نفسه ويُعاد إضافته إذا استمر السلوك.
تعمل على مؤقت داخلي يعيد قراءة سجلات SSH والوصول إلى NGINX كل دقيقة — لكن فقط بينما تكون واجهة TUI أو واجهة الويب قيد التشغيل. أي منهما يحافظ على نفس الجدول، في نفس قاعدة البيانات، لذا يكفي إبقاء واجهة الويب قيد التشغيل؛ لا يُكتشف شيء عندما لا يكون أي منهما قيد التشغيل. لخادم لا توجد عليه عملية stop-bots على الإطلاق، انظر بدون إشراف، من cron أدناه.
/.env أو /.git/config أو
/wp-config.php وما شابه قاطع بحد ذاته، لذا لا يحتاج هذا إلى عتبة. القائمة
المدمجة تحذف عمداً مسارات مشروعة في مكان ما — /wp-login.php،
/wp-admin/، /xmlrpc.php، /phpmyadmin — لأن حجب مسؤولك الخاص
سيكون أسوأ من تفويت ماسح يلتقطه كاشف 404 على أي حال. أضف مساراتك الخاصة باستخدام
set-probe-paths.Disallow: في robots.txt المُولَّد وغير مرتبط
في أي مكان. الوصول إليه يعني تجاهل robots.txt، وهو ما لا يفعله أي شيء مشروع عن طريق الخطأ —
أقوى إشارة هنا، وأطول حجب. يحتاج إلى تشغيل توليد robots.txt ليعمل على الإطلاق.ثلاثة أخرى تنظر إلى كيفية تصرف العميل بدلاً من ما يطلبه. الثلاثة كلها معطّلة افتراضياً، لأن لكل منها إنذاراً خاطئاً لا يمكنه استبعاده بمفرده — وكلها تعفي زاحفات محركات البحث الموثّقة، والتي لولا ذلك ستطابق كل واحدة منها:
304 أصلاً مجلوباً).
لا يمكنه مساعدتك على موقع لا يقدّم أي أصول على الإطلاق — API JSON خالص.Referer. يُضعَف بواسطة
Referrer-Policy: no-referrer وأدوات الخصوصية؛ عتبة المسار المميز هي ما
يجعله قابلاً للاستخدام على الإطلاق./24 IPv4 واحد في نفس الجولة، احجب /24. معطّل افتراضياً — حجب 256 عنواناً لأن ثلاثة
أساءت التصرف هو ضرر جانبي بالتصميم. (IPv6 مختلف ولا يحتاج مفتاحاً: الكشف
يحجب دائماً /64، لأن /64 هي شبكة محلية واحدة، نفس ما يمثله عنوان IPv4 واحد.
حجب العنوان الواحد الذي صادف أن استخدمه مهاجم IPv6 لن يوقف شيئاً
— لديه 2^64 أخرى.)كل ما سبق مُولَّد. ما إذا كان أي منه فعّالاً سؤال
منفصل، وstop-bots status هو ما يجيب عليه:```
stop-bots status
سبع فحوصات، وأولها هو الفحص الجدير بالاهتمام: هل القواعد المُولَّدة موجودة فعلاً في النواة، أم على القرص فقط؟ استمر مضيف حقيقي بالعمل لمدة ثلاثة أسابيع مع 48,860 قاعدة إسقاط في `/etc/stop-bots/firewall.nft` ومجموعة قواعد فارغة، لأن كتابة السكربت وتحميله خطوتان ولم ينظر أحد قط إلى الثانية.
والباقي: هل ستنجو مجموعة القواعد من إعادة التشغيل (`nftables.service` مُفعَّلة؟)، وهل لا يزال السكربت مطابقاً للقواعد، وهل حظر NGINX مُطبَّق، وهل خدمة الطرفية تشغّل الملف التنفيذي الذي تسميه، وهل هناك مساحة لقاعدة البيانات، وهل تستطيع الكواشف قراءة سجلاتها.
يخرج بقيمة غير صفرية إذا كان أي شيء **CRITICAL**، لذا يعمل كفحص مراقبة. `--quiet` يطبع فقط ما يحتاج إلى انتباه، وهو الشكل المناسب لـ cron:```
0 * * * * /usr/local/bin/stop-bots status --quiet
فحص لم يتمكن من العمل — nft list يحتاج صلاحيات root — يُبلّغ عن UNKNOWN، وليس
OK أبدًا. فحص صحي يقول إن كل شيء على ما يرام لأنه لم يستطع النظر أسوأ من عدم وجوده،
لأنه يُصدَّق.
التقرير نفسه موجود على لوحة المعلومات في كل من الطرفية وواجهة TUI، ويُلتقط كل ساعة
بواسطة cron الداخلي بدلًا من كل عملية عرض: nft list على مجموعة قواعد كبيرة يمثل
ميغابايتات من النص.
كل قرار جدار حماية أعلاه يُولَّد، ولا يُطبَّق تلقائيًا أبدًا: render-firewall
(أو مفتاح f في لوحة المعلومات) يكتب سكربت iptables أو nftables لتراجعه وتطبّقه
بنفسك، ويرفض كتابة سكربت قد يقفل جلسة SSH متصلة حاليًا.
ثلاثة أشياء يمكنها تطبيقه نيابة عنك، وكلها تحتاج منك أن تطلب: نافذة العرض في TUI
("apply after writing") أو مفتاح a فيها، لوحة جدار الحماية في وحدة التحكم على الويب
("run it after writing") أو زر "Apply everything" فيها، وbatch --apply من crontab
كتبته أنت — انظر
Unattended, from cron. لا شيء منها أثر جانبي لأي شيء
تلقائي: cron الداخلي يولّد السكربت ولا يشغّله أبدًا.
ينطبق الأمر نفسه على جانب NGINX: تغيير إعداد يغيّر فقط ما سيُكتب.
تُظهر إعدادات المواقع كل موقع كـ STALE حتى تطبّق.
إيقاف كاشف لا يزيل الحظر الذي أضافه بالفعل — تلك تنتهي صلاحيتها من تلقاء نفسها.
"إيقاف الكشف" و"التراجع عما تم كشفه" منفصلان عمدًا؛ الثاني هو شاشة الحماية الديناميكية
أو remove-firewall-rule.
هناك أيضًا إحصاء بسيط لسجل الوصول، مستقل عن الحظر: record-access-stats /
list-access-stats يحصيان عدد مرات ظهور كل user agent في الطلبات الناجحة (غير
الخاطئة)، حتى ترى من يزور فعليًا فوق من يتم حظره.
stop-bots batch هي تمريرة واحدة على كل ما تفعله TUI يدويًا: تحديث كل قائمة،
وفحص السجلات، وكتابة قواعد حظر NGINX وسكربت جدار الحماية.```
0 4 * * * root /usr/local/bin/stop-bots batch --apply --ssh-log /var/log/auth.log
*/10 * * * * root /usr/local/bin/stop-bots batch --apply --no-fetch --ssh-log /var/log/auth.log
لا يقول شيئًا عندما ينجح كل شيء، لذا فإن تشغيلًا ليليًا سليمًا لا يرسل لك بريدًا. الخطوة الفاشلة تطبع إلى stderr وتضبط حالة خروج غير صفرية، وهذا ما يجعل cron يخبرك عنها. شغّله يدويًا مرة واحدة مع `--verbose` أولًا — فهذا يطبع سطرًا لكل خطوة، وهو أسهل طريقة لرؤية ما يفعله فعليًا.
**`--apply` هو ما يجعله يفرض أي شيء.** بدونه، يكتب `batch` إعداد NGINX وسكربت الجدار الناري ثم يتوقف: الإعداد لا يفعل شيئًا حتى إعادة التحميل، والسكربت لا يفعل شيئًا حتى يُشغَّل. هذا هو الافتراضي في هذا المشروع في كل مكان، ويبقى الافتراضي هنا.
يتعايش `batch` مع واجهة أمامية طويلة التشغيل بأمان. تسجّل TUI وواجهة الويب و`batch` جميعها ما فعلته عبر المفاتيح نفسها في قاعدة البيانات نفسها، فأيها يصل إلى مهمة أولًا ينفذها والآخرون يجدونها لم تعد مستحقة — فلا تحصل على جولتي كشف، وتعرض لوحة "Scheduled tasks" في Dashboard ما حدث فعليًا بدلًا من الادعاء بأن كل شيء متأخر. إذا كنت تترك واجهة الويب تعمل بالفعل، فإن إدخال `batch` الليلي يكون احتياطًا إضافيًا وليس متطلبًا؛ وإذا لم تفعل، فهو الشيء الوحيد الذي يبقي الكشف محدثًا.
**مع `--apply`، يمكن لحارس قفل SSH أن يرفض — والرفض يعني عدم تطبيق أي شيء.** يرفض إذا كانت القواعد ستحجب عميلًا متصلًا الآن، *و* إذا لم يكن ممكنًا قراءة أي سجل SSH على الإطلاق، لأنه حينها لا يمكن تشغيل الفحص. الأمر التفاعلي `render-firewall` يطبع فقط ملاحظة في الحالة الثانية، على أساس أن إنسانًا يراقب الطرفية؛ أما من cron فلا أحد. **مرّر `--ssh-log` صراحةً**: يعمل cron بصلاحية root لذا عادةً يُقرأ `/var/log/auth.log` بشكل جيد، لكن على مضيف يعتمد على journald فقط قد يعود `journalctl` تحت cron فارغًا، وهذه بالضبط الحالة التي يرفض فيها. `--force` يتجاوز الحارس إذا كنت تقصد ذلك.
فشل خطوة واحدة لا يوقف الأخريات أبدًا، ونصفا NGINX والجدار الناري مستقلان — إعادة تحميل NGINX الفاشلة تترك الجدار الناري مطبقًا، والعكس صحيح.
يسجّل `batch` كل خطوة مقابل الجدول نفسه الذي يستخدمه cron الداخلي في TUI، فيتفق الاثنان على ما تم تشغيله بالفعل بدلًا من أن يفعله كلاهما، وتعرض لوحة "Scheduled tasks" في Dashboard ما فعله cron الحقيقي لديك.
# واجهة الويب
يقدّم `stop-bots web` الشاشات الخمس نفسها في المتصفح.```
stop-bots web
يستمع على 127.0.0.1:8787 — لا يمكن الوصول إليه إلا من ذلك الجهاز — ويطبع كلمة مرور مُولَّدة مرة واحدة، عند التشغيل الأول. يمكنك الوصول إليه من حاسوبك المحمول عبر نفق SSH:``` ssh -L 8787:127.0.0.1:8787 your-server
ثم افتح <http://127.0.0.1:8787/>.

تتبع وحدة التحكم إعداد الوضع الفاتح أو الداكن لنظام التشغيل، مع مفتاح تبديل في
الترويسة؛ لقطات شاشة TUI أعلاه هي السمة الداكنة، وهذه هي الفاتحة. المفاتيح التي
يستخدمها TUI تعمل هنا أيضًا: `1`–`4` تبدّل الشاشات، `/` تركّز على مربع البحث، `?` يفتح المساعدة.

توجد ثلاثة إجراءات على مستوى المضيف بالكامل في الترويسة، في المتصفح كأزرار وفي TUI
كمفاتيح فردية:
- **تحديث كل شيء** (`u`) ينزّل كل قائمة روبوتات، وكل نطاق IP لعناكب الويب، وكل
تغذية سمعة *مفعّلة* وكل دولة *محددة* — نفس المجموعة التي يجلبها `stop-bots batch`،
من نفس الخطة. فشل مصدر واحد لا يوقف الباقي، ولا يُفرض أي شيء حتى يطبّقه شيء ما.
- **تطبيق كل شيء** (`a`) يكتب ويعيد تحميل إعداد NGINX، ثم يكتب ويشغّل
سكربت الجدار الناري. المستويان مستقلان: أيّهما فشل، يحصل الآخر على
دوره، لأن مضيفًا مطبَّقًا جزئيًا أفضل من مضيف ترك فيه خطأ في صياغة NGINX
الجدار الناري قديمًا أيضًا.
- **الوصول عبر الويب** (`w`) يهيّئ NGINX لخدمة وحدة التحكم نفسها — انظر
[خلف NGINX](#behind-nginx-a-subdomain-or-a-path-prefix).
## كخدمة (Debian)```
sudo stop-bots install web
يكتب /etc/systemd/system/stop-bots-web.service، وينشئ /var/lib/stop-bots (0700 — فهو
يحتفظ بتجزئة كلمة مرور وحدة التحكم) و /etc/stop-bots، ويولّد كلمة مرور إذا لم تكن هناك
واحدة، ويمكّن الوحدة ويشغّلها.
--dry-run يطبع الخطة كاملة ولا يغيّر شيئًا. هذا هو الأمر الوحيد في
المشروع الذي يبدأ خادمًا، لذا ابدأ من هناك. --prefix <dir> يكتب نفس الشجرة في مكان
يمكنك قراءته دون صلاحيات الجذر. إذا كانت الوحدة موجودة بالفعل وقد حرّرتها، فإن
المثبّت يتوقف ويخبرك بذلك بدلًا من استبدال تعديلك؛ استخدم --force إذا كنت تقصد ذلك.
تعمل الخدمة بصلاحيات الجذر، لأن وحدة التحكم تعيد كتابة /etc/nginx، وتكتب سكربت
الجدار الناري، وتشغّل nginx -t و systemctl reload nginx. لا يوجد تقسيم غير مميّز
بالصلاحيات يُبقي مجموعة الميزات سليمة. تحمل الوحدة التقوية التي تصمد أمام هذا الشرط
وتعليقًا يوضّح أي تقوية تم تركها ولماذا.
عنوان الربط، وقائمة المضيفين المسموح بها، وبادئة المسار هي عمدًا ليست في الوحدة —
إذ يعيد الخادم قيد التشغيل قراءتها من قاعدة البيانات، لذا فإن وضعها في ExecStart سيمنحها
مصدرين للحقيقة. غيّرها باستخدام stop-bots web --save ... ثم أعد التشغيل.
هناك شيء واحد يتغيّر بمجرد تشغيل هذا بصلاحيات الجذر: مهمة RenderFirewall اليومية
في cron الداخلي يمكنها الآن كتابة /etc/stop-bots/firewall.nft، وهو ما لم تكن تستطيعه عندما كنت تشغّل
وحدة التحكم يدويًا بنفسك. لا شيء يطبّق ذلك السكربت — تشغيله لا يزال مسؤوليتك.
يتم التحقق من Debian فقط، لأن ذلك ما تم اختباره؛ الوحدة على الأرجح صحيحة على أي توزيعة تستخدم systemd، لكن مسار سجل SSH الذي تفترضه هو مسار Debian.
ربط أي شيء غير loopback يتطلب علمًا ثانيًا متعمدًا، لأن وحدة التحكم هذه يمكنها إعادة كتابة الجدار الناري وإعداد NGINX للمضيف الذي تعمل عليه:``` stop-bots web --bind 0.0.0.0:8787 --expose --allowed-hosts admin.example.com --save
`--allowed-hosts` ليس اختياريًا عمليًا: أي طلب يحمل اسم مضيف غير مُدرَج في القائمة يُرفض. هذا ما يجعل هجوم DNS rebinding ضد وحدة التحكم يفشل، ولهذا يحتاج الخادم المكشوف الذي يُوصَل إليه بالاسم إلى كتابة الاسم صراحةً.
ضعه خلف NGINX مع TLS — نفس NGINX الذي تحميه هذه الأداة. إذا فعلت ذلك، وكان الوكيل يضبط `X-Forwarded-For`، فأخبر وحدة التحكم بأنها قد تثق بهذا الترويسة، وإلا فلن تستطيع تحديد العنوان الذي جاء منه الطلب فعليًا:```
stop-bots web --bind 127.0.0.1:8787 # and set web:trust_forwarded_for
خلف TLS، اضبط أيضًا web:secure_cookie. بدونها سيرسل المتصفح ملف تعريف الجلسة
إلى عنوان http:// لنفس المضيف أيضًا.
web:trust_forwarded_for مهم أكثر مما يبدو. بدونه يصل كل طلب خلف وكيل من 127.0.0.1،
لذا لا تستطيع وحدة التحكم التمييز بين عميل وآخر — مما يعني أن سيلًا من محاولات تسجيل الدخول
يتشارك نفس دلو التقييد معك، ولا يجد الحارس الذي يمنعك من حجب عنوانك الخاص شيئًا يقارن به.
ومعه، يعمل كلاهما لكل عميل على حدة.
يمكن لوحدة التحكم إعداد هذا نيابة عنك، وكذلك واجهة TUI (اضغط w في لوحة المعلومات). كلاهما
يكتب إعداد NGINX، ويسجل بادئة المسار ويضيف اسم المضيف إلى قائمة السماح — وهي
الأمور الثلاثة التي يجب أن تتوافق، لأن بادئة مفقودة تجعل كل رابط يغادر
كتلة location واسم مضيف مفقود يجعل كل طلب 403. يتحقق كلاهما باستخدام
nginx -t قبل أن يصبح الإعداد ساريًا، ويتراجع عنه إذا فشل ذلك، ويسجل
العنوان الجديد فقط بعد التحقق من صحته.
وضعان، والمسار هو الافتراضي لسبب وجيه: فهو يضيف كتلة location إلى موقع
لديك بالفعل، لذا ترث وحدة التحكم شهادة ذلك الموقع. أما النطاق الفرعي فيحتاج شهادته
الخاصة، وإلى أن يتم تشغيل certbot --nginx -d <host>، يعبر نموذج كلمة المرور وملف تعريف
الجلسة في وحدة التحكم هذه الشبكة دون تشفير.
ما تبقى من هذا القسم هو الشيء نفسه يدويًا، ويستحق القراءة مرة واحدة حتى لو استخدمت اللوحة — فمصيدة الشرطة المائلة اللاحقة أدناه هي الخطأ الذي وُجد هذا لمنعه.
النطاق الفرعي هو النشر الأبسط، وهو الخيار الذي يجب اختياره إن أمكنك ذلك:```nginx server { server_name stopbots.example.com; location / { proxy_pass http://127.0.0.1:8787; proxy_set_header Host $host; } }
## ما الجديد في الإصدار 2.0.0
- **إعادة كتابة كاملة بلغة Go** — لم تعد هناك حاجة إلى Python أو pip. ملف تنفيذي واحد بدون تبعيات.
- **دعم بروتوكول SOCKS5** — يمكن الآن توجيه حركة المرور عبر أي وكيل SOCKS5.
- **دعم بروتوكول HTTP/2** — اكتشاف تلقائي للتفاوض عبر HTTP/2 عند توفره.
- **تحسين الأداء** — استخدام goroutines للتنفيذ المتوازي، مما أدى إلى تسريع كبير في عمليات الفحص.
- **تنسيق إخراج محسّن** — إخراج أكثر وضوحًا مع ألوان وملخصات أفضل.
- **دعم متغيرات البيئة** — يمكن الآن تكوين جميع الخيارات عبر متغيرات البيئة.
- **ملف تكوين** — دعم ملف تكوين YAML لعمليات الفحص المتكررة.
- **وضع الفحص الصامت** — خيار `--quiet` لتقليل الإخراج إلى الحد الأدنى.
- **تصدير النتائج** — تصدير النتائج بصيغ JSON وCSV وMarkdown.
## التثبيت
### من الإصدارات الجاهزة
قم بتنزيل أحدث إصدار من [صفحة الإصدارات](https://github.com/example/tool/releases).
```bash
# Linux (amd64)
curl -LO https://github.com/example/tool/releases/latest/download/tool_linux_amd64.tar.gz
tar -xzf tool_linux_amd64.tar.gz
sudo mv tool /usr/local/bin/
git clone https://github.com/example/tool.git
cd tool
go build -o tool .
docker pull example/tool:latest
docker run --rm example/tool --help
tool [flags] <target>
# فحص منافذ شائعة على هدف واحد
tool -t example.com -p 22,80,443,8080
# فحص نطاق منافذ مع زيادة التزامن
tool -t example.com -p 1-65535 -c 500
# استخدام وكيل SOCKS5
tool -t example.com --proxy socks5://127.0.0.1:1080
# تصدير النتائج إلى ملف JSON
tool -t example.com --output results.json --format json
# وضع الفحص الصامت
tool -t example.com -q
يمكن تكوين الأداة عبر ملف تكوين YAML أو متغيرات البيئة أو أعلام سطر الأوامر. الأسبقية كالتالي:
target: example.com
ports: "1-1000"
concurrency: 100
timeout: 5
proxy: socks5://127.0.0.1:1080
output: results.json
format: json
quiet: false
verbose: false
{
"target": "example.com",
"timestamp": "2024-01-15T10:30:00Z",
"results": [
{
"port": 22,
"state": "open",
"service": "ssh",
"banner": "SSH-2.0-OpenSSH_8.9p1"
}
]
}
port,state,service,banner
22,open,ssh,SSH-2.0-OpenSSH_8.9p1
80,open,http,nginx/1.24.0
| المنفذ | الحالة | الخدمة | البانر |
|--------|--------|--------|--------|
| 22 | مفتوح | ssh | SSH-2.0-OpenSSH_8.9p1 |
| 80 | مفتوح | http | nginx/1.24.0 |
هذا المشروع مرخص بموجب رخصة MIT — راجع ملف LICENSE للحصول على التفاصيل.
هذه الأداة مخصصة لأغراض الاختبار الأمني المصرح به والبحث الأكاديمي فقط. يجب عليك الحصول على إذن كتابي صريح قبل فحص أي هدف لا تملكه أو لا تملك تصريحًا صريحًا بفحصه. يتحمل المستخدم المسؤولية الكاملة عن أي إساءة استخدام أو أضرار ناتجة عن هذه الأداة. لا يتحمل المطورون أي مسؤولية عن الاستخدام غير المصرح به أو غير القانوني.``` stop-bots web --allowed-hosts stopbots.example.com --save
**يعمل بادئة المسار أيضًا**، لكن يجب إخبار الطرفية بها — فهي بحاجة إلى
توليد كل رابط وإجراء نموذج وإعادة توجيه ومسار ملف تعريف ارتباط مع البادئة مضمّنة
فيها مسبقًا، ولا يمكنها التخمين:```
stop-bots web --base-path /stop-bots --allowed-hosts example.com --save
git clone https://github.com/yourusername/proxy-checker.git
cd proxy-checker
go build -o proxy-checker .
docker pull yourusername/proxy-checker:latest
docker run --rm yourusername/proxy-checker -f proxies.txt
قم بتنزيل أحدث إصدار من صفحة الإصدارات.
proxy-checker [flags]
Flags:
-f, --file string ملف الإدخال الذي يحتوي على البروكسيات (سطر واحد لكل بروكسي)
-o, --output string ملف الإخراج للبروكسيات الحية (افتراضي "alive.txt")
-t, --threads int عدد الخيوط المتزامنة (افتراضي 100)
-T, --timeout int مهلة الاتصال بالثواني (افتراضي 10)
-u, --url string عنوان URL الهدف للاختبار (افتراضي "http://httpbin.org/ip")
-p, --protocol string نوع البروتوكول: http, socks4, socks5, ss (افتراضي "http")
-c, --config string مسار ملف التكوين (YAML)
--json تصدير النتائج بصيغة JSON
--csv تصدير النتائج بصيغة CSV
--webhook string عنوان URL للـ Webhook للإشعارات
-v, --verbose تمكين الإخراج المفصل
-h, --help عرض المساعدة
فحص قائمة البروكسيات باستخدام الإعدادات الافتراضية:
./proxy-checker -f proxies.txt
فحص بروكسيات SOCKS5 بـ 500 خيط:
./proxy-checker -f proxies.txt -p socks5 -t 500
تصدير البروكسيات الحية إلى JSON:
./proxy-checker -f proxies.txt --json -o alive.json
استخدام ملف تكوين:
./proxy-checker -c config.yaml
يمكن تخصيص الأداة عبر ملف تكوين YAML:
# config.yaml
threads: 200
timeout: 15
protocol: socks5
target_url: "https://api.ipify.org?format=json"
output: "results.txt"
export_format: "json"
webhook: "https://discord.com/api/webhooks/..."
verbose: true
هذا المشروع مرخص بموجب رخصة MIT — راجع ملف LICENSE للتفاصيل.
هذه الأداة مخصصة لأغراض الاختبار الأمني والبحث التعليمي فقط. المستخدمون مسؤولون عن الامتثال لجميع القوانين واللوائح المعمول بها. لا يتحمل المؤلفون أي مسؤولية عن سوء الاستخدام أو الأضرار الناتجة عن استخدام هذه الأداة.```nginx location /stop-bots/ { proxy_pass http://127.0.0.1:8787; # NO trailing slash proxy_set_header Host $host; }
**الشرطة المائلة اللاحقة في `proxy_pass` مهمة، وغيابها هو الحيلة بأكملها.**
بدونها، يمرر NGINX المسار الكامل ويرى `stop-bots` المسار
`/stop-bots/whatever`، وهو ما يخدمه ويولّده الآن. *مع* وجود شرطة مائلة
لاحقة، يزيل NGINX البادئة — وبعد ذلك يحل المتصفح الروابط في الصفحة
مقابل جذر النطاق، فيخرج خارج كتلة `location`، وكل شيء يعطي 404. لا
يمكن لأي قدر من العناية من جانب الخادم إصلاح ذلك، لذا يجب أن تبقى البادئة عبر
الوكيل.
لا شيء يفرض هذا من الخارج، لكن الفشل صارخ وليس خفيًا: مع
تكوين البادئة، يكون الطلب غير المسبوق بـ 404 صريحًا بدلًا من صفحة
تعمل جزئيًا.
## ما لن يفعله
هناك شيئان مفقودان عن قصد، وشاشة المساعدة تقول ذلك مع الأسباب:
- **لن يرفع الحظر عن شيء حظره قائمة تم تنزيلها** — التحديث التالي لتلك
القائمة سيلغيه بصمت.
- **لن يغيّر كلمة مروره الخاصة.** استخدم `stop-bots web --set-password` على المضيف.
كما يرفض حظر العنوان الذي أنت متصل منه، وهو ما سيأخذ منك
الطرفية التي ستستخدمها للتراجع عن ذلك.
**كانت ثلاثة في السابق.** كان تطبيق سكربت الجدار الناري هو الثالث، على أساس أن
تشغيله هو العملية الوحيدة التي يمكن أن تُخرج المضيف من الشبكة. هذا متاح الآن —
"Apply everything" في لوحة التحكم (`a` في TUI)، أو مربع "run it after
writing" في لوحة الجدار الناري — لأن الحارس الذي يجعله آمنًا من cron يجعله آمنًا من
زر: يتم فحص القواعد مقابل العملاء المسجلين حاليًا عبر SSH، بالترتيب
الذي سيقيمها به السكربت نفسه، والقاعدة التي ستحظر أحدهم تكون
رفضًا وليس تحذيرًا. ابدأ الطرفية بـ `--no-apply` لاستعادة سلوك الكتابة فقط القديم.
محاولات تسجيل الدخول محدودة المعدل. ليس لأن كلمة المرور قابلة للتخمين — فهي مولّدة،
144 بت — بل لأن التحقق من واحدة يشغّل Argon2id، والسماح لمتصل غير موثّق
بتشغيل ذلك بأسرع ما يمكنه إرساله هو هجوم حجب خدمة على المضيف الذي يُفترض أن
تحميه هذه الأداة. عشر محاولات خاطئة مجانية؛ بعد ذلك يتراجع العميل
أسيًا، وسقف عام يحدّ من CPU بغض النظر عن عدد العناوين التي تأتي منها
المحاولات.
## تشغيل NGINX في حاوية
إذا كان NGINX في Docker وتكوينه على bind mount، فإن `systemctl reload nginx` لا يعيد
تحميل أي شيء. وجّه الأمرين إلى الحاوية بدلًا من ذلك — وهذا ينطبق على CLI و
TUI أيضًا:```
stop-bots set-nginx-commands \
--test "docker exec web nginx -t" \
--reload "docker exec web nginx -s reload"
يتم تقسيم الأمر إلى كلمات وتشغيله مباشرة. لا يمر أبدًا عبر shell، لذا فإن ;
و | و $VAR هي أحرف عادية وليست صيغة.
كيفية تنظيم الكود، وكيفية اختباره، والقواعد التي كُتب وفقًا لها موجودة في CONTRIBUTING.md. عملية الإصدار موجودة في RELEASING.md.
يمكنك التواصل معي على [email protected].
حقوق النشر (C) 2026 Marko Ivankovic
هذا البرنامج برمجيات حرة: يمكنك إعادة توزيعه و/أو تعديله بموجب شروط رخصة GNU Affero General Public License كما نشرتها مؤسسة البرمجيات الحرة، إما الإصدار 3 من الرخصة، أو (حسب اختيارك) أي إصدار لاحق.
راجع ملف LICENSE للاطلاع على النص الكامل للرخصة.
الترخيص البديل غير متاح.
STALENOT BLOCKED/BLOCKED (يظهر بالأحمر). Tab/Shift+Tab تبدّل أي من اللوحتين
تنطبق عليهما Up/Down؛ f يبدّل مرشحاً مشتركاً (الكل / غير المحظورة فقط / المحظورة فقط)؛
Enter يحجب الصف المحدد NOT BLOCKED، أو يرفع الحجب عنه إذا كان BLOCKED بالفعل.
i يفحص العنوان المحدد: أي من خلاصات السمعة تسرده، وما إذا كان
داخل نطاق زاحف منشور (وهو ما يفصل Googlebot الحقيقي عن وكيل مستخدم
يدّعي ذلك فقط)، وإلى أي دولة ينتمي، وأي حسابات حاول تسجيل الدخول بها. كل ذلك من قوائم نزّلها هذا المضيف بالفعل — لا يوجد بحث عكسي
DNS أو whois هنا، لأن سجل PTR يكتبه من يملك العنوان
وسيكون نصاً مقدَّماً من المهاجم يُقرأ كأنه موثوق.| القاعدة | تردّ، إلى جانب الروبوتات |
|---|
| HTTP/1.0 و HTTP/1.1 | الزاحفات وعملاء API الذين لا يتحدثون HTTP/2 |
لا ترويسة Accept | بعض عملاء API لا يرسلون أي منها |
لا Accept-Language | أدوات الخصوصية تحذفها |
User-Agent فارغ/غائب | السكربتات وفحوصات الصحة غالباً تحذفه |
Host عنوان IP مجرد | يعطّل الوصول إلى الموقع عبر IP |
| TLS 1.0 / 1.1 | العملاء القديمة جداً فقط |
تنطبق ضمانتان على جميعها، ويُفرضان بدلاً من تركها لك:
server الخاصة بـ HTTPS. المتصفحات
لا تستخدم HTTP/2 بدون TLS، لذا على كتلة listen 80 عادية كل طلب هو HTTP/1.1 —
بما في ذلك إعادة التوجيه التي يجريها المتصفح في طريقه إلى HTTPS. كتلتا المنفذ 80 والمنفذ 443 لديك عادةً
تتشاركان server_name، لذا يصل الإعداد إلى كليهما؛ فقط كتلة TLS تحصل على
تلك القواعد. قواعد شكل الترويسة تعمل عبر HTTP العادي وتُكتب إلى كليهما./.well-known/ معفى دائماً بمجرد تشغيل أي قاعدة. هناك يجلب Let's Encrypt
تحدّي HTTP-01 الخاص به، عبر HTTP/1.1 بدون Accept وغالباً بدون User-Agent —
بدون الإعفاء تتوقف شهادتك عن التجديد بعد أسابيع.| الخيار | الغرض منه |
|---|
403 Forbidden (افتراضي) | يقول إن الحجب كان متعمداً؛ الوحيد الذي يمكن لإنسان أُمسك به خطأً التصرف بناءً عليه |
404 Not Found | يخفي أن أي شيء قد حُجب على الإطلاق |
410 Gone | يطلب من الزاحفات حسنة السلوك إسقاط الرابط نهائياً — فضّل هذا على 403 عندما تردّ الزاحفات بدلاً من المهاجمين |
429 Too Many Requests | يخبر عميلاً مهذباً بالتراجع وإعادة المحاولة |
418 I'm a teapot | مزحة RFC 2324. إنها تعمل؛ لكنها غير مسجّلة لدى IANA، وNGINX يرسلها بجسم فارغ |
444 close connection | لا رد على الإطلاق؛ الأرخص، لكن لا يمكن تمييزه عن تعطّل الخادم |
Tarpit | يجيب بـ 403 لكنه يرسل الجسم ببطء بمعدل بايت واحد في الثانية، فينتظر العميل بدلاً من المضي قدماً |
| العلم | الوصف | الافتراضي |
|---|
-t, --target | الهدف المراد فحصه | — |
-p, --ports | المنافذ المراد فحصها | 1-1000 |
-c, --concurrency | عدد العمال المتزامنين | 100 |
--timeout | مهلة الاتصال بالثواني | 5 |
--proxy | عنوان URL لوكيل SOCKS5 | — |
--output | ملف الإخراج | — |
--format | تنسيق الإخراج (json, csv, md) | json |
-q, --quiet | وضع الفحص الصامت | false |
-v, --verbose | إخراج مطوّل | false |
| المتغير | الوصف |
|---|
TOOL_TARGET | الهدف المراد فحصه |
TOOL_PORTS | المنافذ المراد فحصها |
TOOL_CONCURRENCY | عدد العمال المتزامنين |
TOOL_TIMEOUT | مهلة الاتصال بالثواني |
TOOL_PROXY | عنوان URL لوكيل SOCKS5 |
TOOL_OUTPUT | ملف الإخراج |
TOOL_FORMAT | تنسيق الإخراج |
TOOL_QUIET | وضع الفحص الصامت |
TOOL_VERBOSE | إخراج مطوّل |