
لوحة تحكم جدار الحماية UFW متعددة المضيفين — تشرح القواعد بلغة إنجليزية بسيطة، وتكتشف الثغرات الأمنية، وتوفر تشخيصات الاتصال
لوحة تحكم جدار الحماية UFW متعددة المضيفين. تتصل بمضيفي Linux عبر SSH، وتحلل قواعد جدار الحماية والمنافذ المستمعة، وتشرح كل شيء بلغة إنجليزية بسيطة، وتنبه إلى الفجوات الأمنية.

| المسار | الوصف |
|---|---|
/ | لوحة معلومات عامة تحتوي على بطاقات المضيف، وكبسولات الخدمات، وعدد الفجوات |
Browser --> Cloudflare Tunnel --> Reverse Proxy --> FencePost (:8890)
FastAPI container
|-- SSH --> Host 1 (ufw status, ss -tlnp)
|-- SSH --> Host 2
|-- SSH --> Host N
'-- POST --> Notification webhook
FencePost هو للقراءة فقط -- لا يعدّل قواعد جدار الحماية أبدًا، بل يقتصر على الإبلاغ عنها.
<user> ALL=(ALL) NOPASSWD: /usr/sbin/ufw status verbose, /usr/sbin/ufw status numbered, /usr/bin/ss -tlnp
git clone <repo-url> && cd fencepost
# Add your SSH key
cp ~/.ssh/your_key ssh/id_ed25519
chmod 600 ssh/id_ed25519
# Create your environment file from the template
cp .env.example .env
# Edit .env with real credentials
timezone: Australia/Melbourne
hosts:
- name: My Server
hostname: 192.168.1.10
ssh_user: deploy
ssh_port: 22
is_docker_host: false
networks:
"192.168.1.0/24": "LAN"
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# Load env vars (bash/zsh)
export $(grep -v '^#' .env | xargs)
uvicorn app.main:app --reload --port 8890
افتح http://localhost:8890.
ملاحظة: يستخدم الوضع المحلي مفتاح SSH المحدد في config.yaml (ssh.key_path). للتطوير المحلي، قد ترغب في تجاوز هذا ليشير إلى ssh/id_ed25519 المحلي لديك:
ssh:
key_path: ssh/id_ed25519
timeout: 10
docker compose up -d --build
افتح http://localhost:8890. يقرأ الحاوية بيانات الاعتماد من .env تلقائيًا عبر compose.yaml.
تُخزَّن بيانات الاعتماد في .env (مستثنى من Git) ويُشار إليها عبر compose.yaml. لا تضع الأسرار في المستودع أبدًا.
app/
main.py # FastAPI routes and auth
models.py # HostFirewallState, UFWRule, ListeningPort dataclasses
parser.py # Parses ufw status and ss output
explainer.py # Translates rules to plain English
diagnose.py # Connection diagnostic engine
gap_detector.py # Finds uncovered listening ports
ssh_client.py # Paramiko wrapper, parallel host fetching
eventfeed.py # Change detection and webhook posting
templates/
base.html # Layout, CSS, navigation
overview.html # Host dashboard grid
host_detail.html # Per-host tabbed detail view
diagnose.html # Connection diagnostic form and results
login.html # Authentication page
config.yaml # Host definitions, VLANs, devices, timezone
compose.yaml # Docker Compose service definition
Dockerfile # Python 3.12 slim image
.env.example # Template for environment variables
ssh/ # SSH key directory (key not committed)
data/ # Runtime state (last_state.json, not committed)
config.yaml ضمن hosts:ssh-copy-id -i ssh/id_ed25519.pub user@host/etc/sudoers.d/fencepost على المضيف مع قواعد NOPASSWD المطلوبةdocker compose up -d --buildعند تكوينها في config.yaml مع متغير بيئة NOTIFICATIONS_API_KEY، ينشر FencePost أحداث التغيير عند كل تحديث للوحة المعلومات:
تتضمن الأحداث مفاتيح تكرار (idempotency keys) لمنع التكرار.
MIT
/host/{name} |
| تفاصيل المضيف مع عرض مبوب: القواعد المشروحة، المنافذ المكشوفة، المنافذ المستمعة، الإخراج الخام |
/diagnose | أداة تشخيص الاتصال مع تصور تتبع قاعدة-بقاعدة |
/login | مصادقة قائمة على الجلسات |
| القسم | الغرض |
|---|
timezone | المنطقة الزمنية IANA للطوابع الزمنية المعروضة (مثل Australia/Melbourne، UTC) |
hosts | مصفوفة من أهداف SSH: name، hostname، ssh_user، ssh_port، is_docker_host |
ssh | key_path (مسار المفتاح الخاص) و timeout بالثواني |
networks | تعيين CIDR إلى اسم لشبكات VLAN -- يُستخدم في شروحات القواعد والتشخيص |
devices | عناوين IP مسماة لأزرار التحديد السريع في صفحة التشخيص |
notifications | webhook اختياري: url، channel (يُضبط مفتاح API عبر متغير بيئة) |
| المتغير | الافتراضي | الوصف |
|---|
FENCEPOST_USERNAME | admin | اسم مستخدم تسجيل الدخول |
FENCEPOST_PASSWORD | fencepost | كلمة مرور تسجيل الدخول |
FENCEPOST_SECRET_KEY | change-me | مفتاح توقيع ملفات تعريف الجلسة |
FENCEPOST_CONFIG | config.yaml | المسار إلى ملف الإعدادات |
NOTIFICATIONS_API_KEY | رمز Bearer لـ webhook الإشعارات |