
واجهة ويب لجدار الحماية nftables على لينكس، مكتوبة بلغة Go. تلغي عملية التطبيق نفسها بعد 120 ثانية ما لم تؤكدها — لن تتمكن من حبس نفسك خارج النظام. تثبيت عبر Debian و Docker.
<p align="center">
<img src="https://raw.githubusercontent.com/jp1337/easywall/HEAD/web/static/icon.svg" alt="" width="88" height="88">
</p>
<h1 align="center">easywall</h1>
<p align="center"><em>جدار الحماية الخاص بك. قواعدك الخاصة. بلا مفاجآت.</em></p>
<!-- One badge service, so the set shares a shape, a typeface and a logo
treatment. The three status badges read from the workflows by name; the
version, licence and Go badges read from the repository and go.mod, so
none of them can drift the way a hand-written version number could. -->
<p align="center">
<a href="https://github.com/jp1337/easywall/actions/workflows/test.yml"><img src="https://img.shields.io/github/actions/workflow/status/jp1337/easywall/test.yml?branch=main&label=tests&logo=github&logoColor=white" alt="Tests"></a>
<a href="https://github.com/jp1337/easywall/actions/workflows/build.yml"><img src="https://img.shields.io/github/actions/workflow/status/jp1337/easywall/build.yml?branch=main&label=build&logo=github&logoColor=white" alt="Build"></a>
<a href="https://github.com/jp1337/easywall/actions/workflows/security.yml"><img src="https://img.shields.io/github/actions/workflow/status/jp1337/easywall/security.yml?branch=main&label=security&logo=github&logoColor=white" alt="Security"></a>
<a href="https://codecov.io/gh/jp1337/easywall"><img src="https://img.shields.io/codecov/c/github/jp1337/easywall?logo=codecov&logoColor=white&label=coverage" alt="Coverage"></a>
</p>
<p align="center">
<a href="https://github.com/jp1337/easywall/releases/latest"><img src="https://img.shields.io/github/v/release/jp1337/easywall?logo=github&logoColor=white&label=release" alt="Latest release"></a>
<a href="https://go.dev"><img src="https://img.shields.io/github/go-mod/go-version/jp1337/easywall?logo=go&logoColor=white&label=go" alt="Go version"></a>
<a href="https://www.gnu.org/licenses/gpl-3.0"><img src="https://img.shields.io/github/license/jp1337/easywall?logo=opensourceinitiative&logoColor=white&label=license&color=blue" alt="GPL-3.0"></a>
<a href="https://discord.gg/3zJMvChvUA"><img src="https://img.shields.io/badge/discord-join-5865F2?logo=discord&logoColor=white" alt="Discord"></a>
<a href="https://ko-fi.com/jp1337"><img src="https://img.shields.io/badge/ko--fi-support-13C3FF?logo=kofi&logoColor=white" alt="Support on Ko-fi"></a>
</p>
<p align="center">
<a href="https://demo.easywall-project.org"><strong>عرض حي</strong></a> ·
<a href="https://easywall-project.org"><strong>التوثيق</strong></a> ·
<a href="https://github.com/jp1337/easywall/blob/main/CHANGELOG.md">سجل التغييرات</a>
</p>
nftables عبر واجهة ويب لا يمكنها أن تحجبك عن الوصول: **كل تطبيق يتراجع عن نفسه ما لم تؤكده.**
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/img/screens/dashboard-dark.png">
<img src="https://assets.kitploit.com/production/public/readmes/43596/614cbeca6ebf752bf79ddc8d910eb14f46b45390f1cb5b8f53032578aed5fb40.png" alt="لوحة تحكم easywall: حالة جدار الحماية مع حالة القبول والتغييرات المعلّقة وآخر تطبيق؛ وبلاطات تعد منافذ TCP ومنافذ UDP وقائمة الحظر وقائمة السماح والقواعد المخصصة وإعادة التوجيه؛ وقائمة النشاط الأخير.">
</picture>
## الفكرة
تعديل قاعدة لا يغيّر شيئًا. تطبيقها يغيّر كل شيء — لمدة 120 ثانية.
إذا قطعت القواعد الجديدة اتصالك فلن تستطيع النقر على تأكيد، و*عدم* التأكيد
هو ما يعيد القواعد القديمة.
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/diagrams/apply-flow-dark.svg">
<img src="https://raw.githubusercontent.com/jp1337/easywall/HEAD/docs/assets/diagrams/apply-flow-light.svg" alt="آلة الحالة: التعديل يؤدي إلى مُجهَّز، والتطبيق يؤدي إلى مُفعَّل، والتأكيد خلال النافذة يؤدي إلى مؤكَّد، وترك النافذة تنتهي يؤدي إلى مُتراجَع عنه، ومن هناك تظل التعديلات المُجهَّزة متاحة.">
</picture>
## البنية
عمليتان. العملية المكشوفة للشبكة لا تحمل أي صلاحية تستحق السرقة.
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/diagrams/architecture-dark.svg">
<img src="https://raw.githubusercontent.com/jp1337/easywall/HEAD/docs/assets/diagrams/architecture-light.svg" alt="المتصفح يتحدث HTTPS مع easywall-web، الذي يعمل بلا صلاحيات؛ وeasywall-web يتحدث JSON مُنمَّطًا عبر مقبس Unix مع easywall-core، الذي يعمل بصلاحيات root ويتحدث netlink مع جدول nftables table inet easywall.">
</picture>
إعادة كتابة كاملة لـ easywall الأصلي — Python وFlask و`iptables` عبر
subprocess — الذي أُرشف في 2022 بعد ثغرة CVE. السببان الجذريان زالا:
الصلاحيات تعيش في عملية مختلفة، ومسار التطبيق يبني بنى Go
بدلًا من سطر أوامر. [كيف يعمل ←](https://easywall-project.org/architecture/)
## التثبيت
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/diagrams/install-choice-dark.svg">
<img src="https://raw.githubusercontent.com/jp1337/easywall/HEAD/docs/assets/diagrams/install-choice-light.svg" alt="شجرة قرار: إن كنت تتفرج فقط فانتقل إلى وضع العرض التجريبي؛ وإن كنت على Debian أو Ubuntu فانتقل إلى حزمة .deb؛ وإن كنت تشغّل حاويات بالفعل فانتقل إلى Docker؛ وإلا فابنِ من المصدر.">
</picture>
```bash
# Debian / Ubuntu — amd64 and arm64
ARCH=$(dpkg --print-architecture)
wget https://github.com/jp1337/easywall/releases/latest/download/easywall_$ARCH.deb
sudo dpkg -i easywall_$ARCH.deb && sudo apt-get install -f
# Docker
git clone https://github.com/jp1337/easywall.git && cd easywall && docker compose up -d
# From source — Go 1.27+, nftables
git clone https://github.com/jp1337/easywall.git && cd easywall
make build && sudo make install
sudo systemctl enable --now easywall-core easywall-web
```
ثم افتح `https://localhost:12227`. الزيارة الأولى
[تُعدّ الحساب وتُجهّز القواعد الأولى](https://easywall-project.org/installation/first-run/).
## ما الذي تحصل عليه
| | |
|---|---|
| **المنافذ** | TCP وUDP، منفردة أو نطاق، مع توجيه SSH ضد القوة الغاشمة لكل قاعدة |
| **قائمة الحظر وقائمة السماح** | IPv4 وIPv6 وCIDR، تُقيَّم قبل أي قاعدة منفذ |
| **وحدات الحماية** | اثنتا عشرة، خمس مُفعَّلة افتراضيًا — الفيضانات والمسح وحزم bogon والقطع والبث العام/البث المتعدد/البث الموجّه |
| **إعادة توجيه المنافذ** | إعادة توجيه NAT مع اختيار البروتوكول |
| **قواعد مخصصة** | nftables خام، يُفحص تركيبه قبل تطبيقه |
| **تصدير / استيراد** | مجموعة القواعد كاملة بصيغة JSON |
| **سجل التدقيق** | ما تغيّر ومتى، كائن JSON واحد لكل سطر |
| **التعايش مع Docker** | يملك `table inet easywall`، ولا يمس أي شيء آخر |
| **الإنجليزية والألمانية والفرنسية** | قابلة للتبديل في الواجهة، بما في ذلك قبل تسجيل الدخول. قد تكون اللغة جزئية: ما ينقصها يُعرض بالإنجليزية، وتُبلَّغ الفجوة بدلًا من إخفائها |
| **فاتح وداكن** | يتبع نظام التشغيل، مع مفتاح تبديل يدوي؛ وكلاهما مُفحوص التباين |
## مبني باستخدام
| | |
|---|---|
| Go 1.27، ملف تنفيذي واحد | `go-chi/chi` · `html/template` |
| nftables عبر `google/nftables` | netlink مباشر، بلا subprocess لـ `nft` |
| Argon2id | `golang.org/x/crypto`، ملح 16 بايت لكل كلمة مرور |
| CSRF | `net/http.CrossOriginProtection`، أصلي في Go 1.25 |
| نظام التصميم | [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md) + Tailwind v4 — بلا مكتبة واجهة طرف ثالث |
| الخطوط | Inter + JetBrains Mono، مُستضافة ذاتيًا، ~145 KB — تعمل دون اتصال بالشبكة |
| CI | `govulncheck` و`gosec` وCodeQL و`-race`، ومجموعة تكامل ضد نواة حقيقية |
## الحصول على المساعدة
| | |
|---|---|
| سؤال، أو شيء لا يعمل كما ينبغي | [Discord](https://discord.gg/3zJMvChvUA) |
| خطأ برمجي، أو ميزة تريدها | [GitHub issues](https://github.com/jp1337/easywall/issues) |
| ثغرة أمنية | [Security advisory](https://github.com/jp1337/easywall/security/advisories/new) — **ليس** Discord، وليس issue عامًا |
## المساهمة
الإعداد واصطلاحات الـ commit وقائمة مراجعة المراجعة: [CONTRIBUTING.md](https://github.com/jp1337/easywall/blob/main/CONTRIBUTING.md).
أي شيء بصري يمر أولًا عبر [`DESIGN.md`](https://github.com/jp1337/easywall/blob/main/DESIGN.md).
المشكلات الأمنية: **ليس** كـ issue عام — استخدم
[GitHub Security Advisories](https://github.com/jp1337/easywall/security/advisories/new).
## الترخيص
GPL-3.0 — انظر [LICENSE](https://github.com/jp1337/easywall/blob/main/LICENSE).