
قم بإعداد خادم OpenVPN الخاص بك على Debian وUbuntu وFedora وCentOS وArch Linux والمزيد
مثبّت OpenVPN لأنظمة Debian وUbuntu وFedora وopenSUSE وCentOS وAmazon Linux وArch Linux وOracle Linux وRocky Linux وAlmaLinux.
سيمكّنك هذا السكربت من إعداد وإدارة خادم VPN آمن خاص بك في ثوانٍ معدودة.
صُمم هذا السكربت ليعمل على خادمك الخاص، سواء كان VPS أو خادمًا مخصصًا، أو حتى جهاز كمبيوتر في المنزل.
بعد الإعداد، ستتمكن من إنشاء ملفات إعدادات العميل لكل جهاز تريد توصيله.
سيتمكن كل عميل من توجيه حركة مرور الإنترنت الخاصة به عبر الخادم، مع تشفير كامل.```mermaid graph LR A[Phone] -->|Encrypted| VPN B[Laptop] -->|Encrypted| VPN C[Computer] -->|Encrypted| VPN
VPN[OpenVPN Server]
VPN --> I[Internet]
## لماذا OpenVPN؟
كان OpenVPN المعيار الفعلي لشبكات VPN مفتوحة المصدر عند إنشاء هذا السكربت. جاء WireGuard لاحقًا وهو أبسط وأسرع لمعظم حالات الاستخدام. اطّلع على [wireguard-install](https://github.com/angristan/wireguard-install).
ومع ذلك، لا يزال OpenVPN خيارًا منطقيًا عندما تحتاج إلى:
- **دعم TCP**: يعمل في البيئات التقييدية التي يُحظر فيها UDP (شبكات الشركات، المطارات، الفنادق، إلخ.)
- **مفاتيح خاصة محمية بكلمة مرور**: تخزّن إعدادات WireGuard المفتاح الخاص كنص عادي
- **التوافق مع الأنظمة القديمة**: يتوفر عملاء لكل المنصات تقريبًا، بما في ذلك الأنظمة الأقدم
## الميزات
- تثبيت وإعداد خادم OpenVPN جاهز للاستخدام
- واجهة سطر أوامر للأتمتة والبرمجة النصية (وضع غير تفاعلي مع مخرجات JSON)
- تجديد الشهادات لكل من شهادات العميل والخادم
- عرض ومراقبة العملاء المتصلين
- فصل فوري للعميل عند إبطال الشهادة (عبر واجهة الإدارة)
- استخدام [مستودعات OpenVPN الرسمية](https://community.openvpn.net/openvpn/wiki/OpenvpnSoftwareRepos) عندما يكون ذلك ممكنًا للحصول على أحدث الإصدارات المستقرة
- إدارة قواعد جدار الحماية وإعادة التوجيه بسلاسة (دعم أصلي لـ firewalld و nftables، مع ارتداد إلى iptables)
- شبكات فرعية قابلة للتهيئة لـ VPN (IPv4: الافتراضي `10.8.0.0/24`، IPv6: الافتراضي `fd42:42:42:42::/112`)
- MTU نفق قابل للتهيئة (الافتراضي: `1500`)
- عند الحاجة، يمكن للسكربت إزالة OpenVPN بشكل نظيف، بما في ذلك الإعدادات وقواعد جدار الحماية
- إعدادات تشفير قابلة للتخصيص، مع إعدادات افتراضية محسّنة (انظر [الأمان والتشفير](#security-and-encryption) أدناه)
- استخدام أحدث ميزات OpenVPN عند توفرها (انظر [الأمان والتشفير](#security-and-encryption) أدناه)
- مجموعة متنوعة من محللات DNS ليتم دفعها إلى العملاء
- خيار استخدام محلل مستضاف ذاتيًا عبر Unbound (يدعم تثبيتات Unbound الموجودة مسبقًا)
- الاختيار بين TCP و UDP
- دعم مرن لـ IPv4/IPv6:
- نقطة نهاية الخادم IPv4 أو IPv6 (كيفية اتصال العملاء)
- عملاء IPv4 فقط، أو IPv6 فقط، أو ثنائي الرصة (عنونة VPN والوصول إلى الإنترنت)
- جميع التركيبات مدعومة: 4→4، 4→4/6، 4→6، 6→4، 6→6، 6→4/6
- منع تسرب تلقائي: حظر البروتوكول غير المرغوب فيه في أوضاع الرصة الأحادية
- وضع بصلاحيات منخفضة: التشغيل كـ `nobody`/`nogroup`
- حظر تسريبات DNS على ويندوز 10
- اسم عشوائي لشهادة الخادم
- خيار حماية العملاء بكلمة مرور (تشفير المفتاح الخاص)
- خيار السماح لأجهزة متعددة باستخدام نفس ملف تعريف العميل في نفس الوقت (يعطّل عناوين IP الثابتة)
- **مصادقة بصمة النظير** (OpenVPN 2.6+): مصادقة مبسّطة شبيهة بـ WireGuard بدون مرجعية تصديق (CA)
- والعديد من الأشياء الصغيرة الأخرى!
## التوافق
يدعم السكربت توزيعات Linux التالية:
| | الدعم |
| ------------------- | ------- |
| AlmaLinux >= 8 | ✅ 🤖 |
| Amazon Linux 2023 | ✅ 🤖 |
| Arch Linux | ✅ 🤖 |
| CentOS Stream >= 8 | ✅ 🤖 |
| Debian >= 11 | ✅ 🤖 |
| Fedora >= 40 | ✅ 🤖 |
| openSUSE Leap >= 16 | ✅ 🤖 |
| openSUSE Tumbleweed | ✅ 🤖 |
| Oracle Linux >= 8 | ✅ 🤖 |
| Rocky Linux >= 8 | ✅ 🤖 |
| Ubuntu >= 18.04 | ✅ 🤖 |
مما تجب ملاحظته:
- يتم اختبار السكربت بانتظام ضد التوزيعات الموسومة بـ 🤖 فقط.
- يتم اختباره على بنية `amd64` فقط.
- يتطلب السكربت `systemd`.
### المزوّدون الموصى بهم
- [Vultr](https://umami.stanislas.cloud/q/1HH9Thp8i): مواقع حول العالم، دعم IPv6، يبدأ من \$2.5 شهريًا
- [Hetzner](https://umami.stanislas.cloud/q/HdzaOJWq7): مواقع حول العالم، IPv6، 20 تيرابايت من حركة المرور، يبدأ من €3.59 شهريًا
- [Digital Ocean](https://umami.stanislas.cloud/q/sEVh1l79B): مواقع حول العالم، دعم IPv6، يبدأ من \$4 شهريًا
## الاستخدام
أولاً، نزّل السكربت على خادمك واجعله قابلاً للتنفيذ:```bash
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh
تحتاج إلى تشغيل السكربت بصلاحيات root وتفعيل وحدة TUN.
أسهل طريقة للبدء هي القائمة التفاعلية:```bash ./openvpn-install.sh interactive
سيرشدك هذا خلال عملية التثبيت وإدارة العملاء.
في مجلدك الرئيسي، سيكون لديك ملفات `.ovpn`. هذه هي ملفات إعدادات العملاء. نزّلها من خادمك (باستخدام `scp` على سبيل المثال) واتصل باستخدام عميل OpenVPN المفضل لديك.
إذا كان لديك أي سؤال، توجه إلى [الأسئلة الشائعة](#faq) أولاً. وإذا كنت بحاجة إلى مساعدة، يمكنك فتح [نقاش](https://github.com/angristan/openvpn-install/discussions). يرجى البحث في المشكلات والنقاشات الموجودة أولاً.
### وضع CLI
> [!WARNING]
> لا يُضمن التوافق مع واجهة برمجة التطبيقات (API). قد تحدث تغييرات جذرية بين الإصدارات. إذا كنت تستخدم هذا السكربت برمجيًا (مثلًا في الأتمتة أو CI/CD)، فثبّت الإصدار على commit محدد بدلاً من استخدام فرع master.
للأتمتة والبرمجة النصية، استخدم واجهة سطر الأوامر:```bash
# Install with defaults
./openvpn-install.sh install
# Add a client
./openvpn-install.sh client add alice
# List clients
./openvpn-install.sh client list
# Revoke a client (immediately disconnects if connected)
./openvpn-install.sh client revoke alice
openvpn-install [options]
Commands: install Install and configure OpenVPN server uninstall Remove OpenVPN server client Manage client certificates server Server management interactive Launch interactive menu
Global Options: --verbose Show detailed output --log Log file path (default: openvpn-install.log) --no-log Disable file logging --no-color Disable colored output -h, --help Show help
شغّل `./openvpn-install.sh <command> --help` للحصول على الخيارات الخاصة بالأوامر المحددة.
#### إدارة العملاء```bash
# Add a new client
./openvpn-install.sh client add alice
# Add a password-protected client
./openvpn-install.sh client add bob --password
# Revoke a client
./openvpn-install.sh client revoke alice
# Renew a client certificate
./openvpn-install.sh client renew bob --cert-days 365
قائمة بجميع العملاء:```text $ ./openvpn-install.sh client list ══ Client Certificates ══ [INFO] Found 3 client certificate(s)
Name Status Expiry Remaining
alice Valid 2035-01-15 3650 days bob Valid 2035-01-15 3650 days charlie Revoked 2035-01-15 unknown
مخرجات JSON للبرمجة النصية:```text
$ ./openvpn-install.sh client list --format json | jq
{
"clients": [
{
"name": "alice",
"status": "valid",
"expiry": "2035-01-15",
"days_remaining": 3650
},
{
"name": "bob",
"status": "valid",
"expiry": "2035-01-15",
"days_remaining": 3650
},
{
"name": "charlie",
"status": "revoked",
"expiry": "2035-01-15",
"days_remaining": null
}
]
}
./openvpn-install.sh server renew
./openvpn-install.sh uninstall
عرض العملاء المتصلين (يتم تحديث البيانات كل 60 ثانية):```text
$ ./openvpn-install.sh server status
══ Connected Clients ══
[INFO] Found 2 connected client(s)
Name Real Address VPN IP Connected Since Transfer
---- ------------ ------ --------------- --------
alice 203.0.113.45:52341 10.8.0.2 2025-01-15 14:32 ↓1.2M ↑500K
bob 198.51.100.22:41892 10.8.0.3 2025-01-15 09:15 ↓800K ↑200K
[INFO] Note: Data refreshes every 60 seconds.
يدعم الأمر install العديد من الخيارات للتخصيص:```bash
./openvpn-install.sh install --port 443 --protocol tcp
./openvpn-install.sh install --dns quad9
./openvpn-install.sh install --cipher AES-256-GCM --cert-type rsa --rsa-bits 4096
./openvpn-install.sh install --subnet-ipv4 10.9.0.0
./openvpn-install.sh install --client-ipv4 --client-ipv6
./openvpn-install.sh install --no-client-ipv4 --client-ipv6
./openvpn-install.sh install --endpoint-type 6 --endpoint 2001:db8::1
./openvpn-install.sh install --client-ipv6 --subnet-ipv6 fd00🔢5678::
./openvpn-install.sh install --no-client
./openvpn-install.sh install
--port 443
--protocol tcp
--dns cloudflare
--cipher AES-256-GCM
--client mydevice
--client-cert-days 365
**Network Options:**
- `--endpoint <host>` - عنوان IP عام أو اسم مضيف للعملاء (الافتراضي: يُكتشف تلقائيًا)
- `--endpoint-type <4|6>` - إصدار IP لنقطة الاتصال (الافتراضي: `4`)
- `--ip <addr>` - IP استماع الخادم (الافتراضي: يُكتشف تلقائيًا)
- `--client-ipv4` - تمكين IPv4 لعملاء VPN (الافتراضي: مفعّل)
- `--no-client-ipv4` - تعطيل IPv4 لعملاء VPN
- `--client-ipv6` - تمكين IPv6 لعملاء VPN (الافتراضي: معطّل)
- `--no-client-ipv6` - تعطيل IPv6 لعملاء VPN
- `--subnet-ipv4 <x.x.x.0>` - شبكة فرعية IPv4 لـ VPN (الافتراضي: `10.8.0.0`)
- `--subnet-ipv6 <prefix>` - شبكة فرعية IPv6 لـ VPN (الافتراضي: `fd42:42:42:42::`)
- `--port <num>` - منفذ OpenVPN (الافتراضي: `1194`)
- `--port-random` - استخدام منفذ عشوائي (49152-65535)
- `--protocol <udp|tcp>` - البروتوكول (الافتراضي: `udp`)
- `--mtu <size>` - MTU للنفق (الافتراضي: `1500`)
**DNS Options:**
- `--dns <provider>` - مزود DNS (الافتراضي: `cloudflare`). الخيارات: `system`, `unbound`, `cloudflare`, `quad9`, `quad9-uncensored`, `fdn`, `dnswatch`, `opendns`, `google`, `yandex`, `adguard`, `nextdns`, `custom`
- `--dns-primary <ip>` - DNS أساسي مخصص (يتطلب `--dns custom`)
- `--dns-secondary <ip>` - DNS ثانوي مخصص (يتطلب `--dns custom`)
**Security Options:**
- `--cipher <cipher>` - تشفير البيانات (الافتراضي: `AES-128-GCM`). الخيارات: `AES-128-GCM`, `AES-192-GCM`, `AES-256-GCM`, `AES-128-CBC`, `AES-192-CBC`, `AES-256-CBC`, `CHACHA20-POLY1305`
- `--cert-type <ecdsa|rsa>` - نوع الشهادة (الافتراضي: `ecdsa`)
- `--cert-curve <curve>` - منحنى ECDSA (الافتراضي: `prime256v1`). الخيارات: `prime256v1`, `secp384r1`, `secp521r1`
- `--rsa-bits <2048|3072|4096>` - حجم مفتاح RSA (الافتراضي: `2048`)
- `--hmac <alg>` - خوارزمية HMAC (الافتراضي: `SHA256`). الخيارات: `SHA256`, `SHA384`, `SHA512`
- `--tls-sig <mode>` - وضع TLS (الافتراضي: `crypt-v2`). الخيارات: `crypt-v2`, `crypt`, `auth`
- `--auth-mode <mode>` - وضع المصادقة (الافتراضي: `pki`). الخيارات: `pki` (قائم على CA)، `fingerprint` (بصمة النظير، يتطلب OpenVPN 2.6+)
- `--tls-version-min <1.2|1.3>` - الحد الأدنى لإصدار TLS (الافتراضي: `1.2`)
- `--tls-ciphersuites <list>` - مجموعات التشفير TLS 1.3، مفصولة بنقطتين (الافتراضي: `TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256`)
- `--tls-groups <list>` - مجموعات تبادل المفاتيح، مفصولة بنقطتين (الافتراضي: `X25519:prime256v1:secp384r1:secp521r1`)
- `--server-cert-days <n>` - صلاحية شهادة الخادم بالأيام (الافتراضي: `3650`)
**Client Options:**
- `--client <name>` - اسم العميل الأولي (الافتراضي: `client`)
- `--client-password [pass]` - حماية مفتاح العميل بكلمة مرور (الافتراضي: بدون كلمة مرور)
- `--client-cert-days <n>` - صلاحية شهادة العميل بالأيام (الافتراضي: `3650`)
- `--no-client` - تخطي إنشاء العميل الأولي
**Other Options:**
- `--multi-client` - السماح بنفس الشهادة على أجهزة متعددة (الافتراضي: معطّل)
#### أمثلة الأتمتة
**إنشاء عميل دفعة واحدة:**```bash
#!/bin/bash
for user in alice bob charlie; do
./openvpn-install.sh client add "$user"
done
إنشاء عملاء من ملف:```bash #!/bin/bash while read -r user; do ./openvpn-install.sh client add "$user" done < users.txt
**مخرجات JSON للبرمجة النصية:**```bash
# Get client list as JSON
./openvpn-install.sh client list --format json | jq '.clients[] | select(.status == "valid")'
# Get connected clients as JSON
./openvpn-install.sh server status --format json
هذا السكربت مبني على العمل الرائع لـ Nyr والمساهمين معه.
منذ عام 2016، تباعد السكربتان وأصبحا غير متشابهين بعد الآن، خاصة في ما يتعلق بالتفاصيل الداخلية. كان الهدف الرئيسي للسكربت هو تعزيز الأمان. ولكن منذ ذلك الحين، أُعيدت كتابة السكربت بالكامل وأُضيفت الكثير من الميزات. غير أن السكربت متوافق فقط مع التوزيعات الحديثة، لذا إذا كنت بحاجة إلى استخدام خادم أو عميل قديم جدًا، أنصحك باستخدام سكربت Nyr.
المزيد من الأسئلة والأجوبة في FAQ.md.
س: أي مزوّد تنصح به؟
ج: أنصح بهؤلاء:
س: أي عميل OpenVPN تنصح به؟
ج: إن أمكن، عميل OpenVPN 2.4 الرسمي.
openvpn من توزيعتك. هناك مستودع APT رسمي للتوزيعات المبنية على Debian/Ubuntu.س: هل أنا آمن من وكالة الأمن القومي (NSA) باستخدام سكربتك؟
ج: يرجى مراجعة نماذج التهديدات الخاصة بك. حتى لو كان هذا السكربت يراعي الأمان ويستخدم تشفيرًا حديثًا، لا ينبغي لك استخدام VPN إذا كنت تريد الاختباء من NSA.
س: هل هناك توثيق لـ OpenVPN؟
ج: نعم، يرجى التوجه إلى دليل OpenVPN، الذي يشرح جميع الخيارات.
المزيد من الأسئلة والأجوبة في FAQ.md.
يرجى فتح issue قبل إرسال PR إذا كنت تريد مناقشة تغيير، خاصة إذا كان كبيرًا.
[!NOTE] تم إنشاء هذا السكربت في عام 2016 عندما كانت الإعدادات الافتراضية لـ OpenVPN ضعيفة جدًا. في ذلك الوقت، كان تخصيص إعدادات التشفير ضروريًا لإعداد آمن. ومنذ ذلك الحين، حسّنت OpenVPN إعداداتها الافتراضية بشكل كبير، لكن السكربت ما زال يقدم خيارات تخصيص.
أصدرت OpenVPN 2.3 والإصدارات الأقدم إعدادات افتراضية قديمة مثل Blowfish (BF-CBC) وTLS 1.0 وSHA1. وقد جلبت كل نسخة رئيسية منذ ذلك الحين تحسينات كبيرة:
--peer-fingerprint للإعدادات بدون PKI، وتسريع نواة DCOإذا كنت تريد مزيدًا من المعلومات حول أي خيار مذكور أدناه، توجّه إلى دليل OpenVPN. فهو شامل جدًا.
تتم إدارة الشهادات وPKI بواسطة Easy-RSA. المعلمات الافتراضية موجودة في ملف vars.example.
كان هذا السكربت يدعم خوارزميتي الضغط LZ4 وLZO، لكنه كان يثني عن استخدامهما بسبب ثغرة هجوم VORACLE.
يضبط OpenVPN 2.6+ الخيار --allow-compression على القيمة no افتراضيًا، مما يمنع حتى الضغط الذي يدفعه الخادم. وبما أن OpenVPN تزيل دعم الضغط تمامًا، لم يعد هذا السكربت يدعمه.
[!NOTE] يستخدم OpenVPN 2.6+ إصدار TLS 1.2 كحد أدنى افتراضيًا. أما الإصدارات السابقة فكانت تقبل TLS 1.0 افتراضيًا.
كانت OpenVPN 2.5 والإصدارات الأقدم تقبل TLS 1.0 افتراضيًا، وهو بروتوكول عمره تقريبًا 20 عامًا.
يعيّن هذا السكربت افتراضيًا tls-version-min 1.2 للتوافق مع جميع عملاء OpenVPN 2.4+. يمكنك اختياريًا ضبط tls-version-min 1.3 في البيئات التي تدعم فيها جميع الأجهزة العميلة TLS 1.3.
تمت إضافة دعم TLS 1.3 في OpenVPN 2.5 ويتطلب OpenSSL 1.1.1+. يوفّر TLS 1.3 أمانًا وأداءً محسّنين مع عملية مصافحة مبسّطة.
يهيئ السكربت مجموعات خوارزميات TLS 1.3 عبر --tls-ciphersuites (بشكل منفصل عن خيار --tls-cipher الخاص بـ TLS 1.2). مجموعات خوارزميات TLS 1.3 الافتراضية هي:
TLS_AES_256_GCM_SHA384TLS_AES_128_GCM_SHA256TLS_CHACHA20_POLY1305_SHA256يُدعم TLS 1.2 منذ OpenVPN 2.3.3. ويُدعم TLS 1.3 منذ OpenVPN 2.5.
يستخدم OpenVPN شهادة RSA بمفتاح 2048 بت افتراضيًا.
أضافت OpenVPN 2.4 دعم ECDSA. تشفير المنحنيات الإهليلجية أسرع وأخف وأكثر أمانًا.
يوفر هذا السكربت:
prime256v1/secp384r1/secp521r12048/3072/4096 بتالافتراضي هو ECDSA مع prime256v1.
يستخدم OpenVPN SHA-256 كدالة تجزئة للتوقيع افتراضيًا، وكذلك يفعل السكربت. لا يوفر السكربت أي خيار آخر حاليًا.
يدعم السكربت وضعين للمصادقة:
مصادقة تقليدية قائمة على جهة إصدار الشهادات (CA). يملك الخادم وجميع الأجهزة العميلة شهادات موقّعة من نفس الـ CA. تتم إدارة إبطال شهادة العميل عبر قوائم إبطال الشهادات (CRL).
هذا هو الوضع الموصى به للنشرات الأكبر عندما تحتاج إلى:
نموذج مصادقة مبسّط يشبه WireGuard يستخدم بصمات شهادات SHA256 بدلاً من سلسلة CA. يملك كل نظير (الخادم والأجهزة العميلة) شهادة موقّعة ذاتيًا، وتوثّق الأطراف بعضها البعض عن طريق التحقق من البصمات.```bash
./openvpn-install.sh install --auth-mode fingerprint
الفوائد:
- إعداد أبسط: لا حاجة لبنية تحتية لـ CA
- أسهل للفهم: مشابه لنموذج `known_hosts` في SSH
- مثالي للإعدادات الصغيرة: الشبكات المنزلية، المختبرات، الفرق الصغيرة
كيف يعمل:
1. يُنشئ الخادم شهادة موقعة ذاتيًا ويخزن بصمتها
2. يُنشئ كل عميل شهادة موقعة ذاتيًا
3. تُضاف بصمات العملاء إلى كتلة `<peer-fingerprint>` الخاصة بالخادم
4. يتحقق العملاء من الخادم باستخدام بصمة الخادم
5. يزيل الإبطال البصمة من إعداد الخادم (لا حاجة إلى CRL)
المقايضة: إبطال عميل يتطلب إعادة تحميل OpenVPN (البصمات موجودة في server.conf). في وضع PKI، يُعاد قراءة ملف CRL تلقائيًا عند الاتصالات الجديدة.
### قناة البيانات
> [!NOTE]
> تغيّر تشفير قناة البيانات الافتراضي في OpenVPN 2.5. الإصدارات السابقة كانت تستخدم `BF-CBC` افتراضيًا، بينما OpenVPN 2.5+ يستخدم افتراضيًا `AES-256-GCM:AES-128-GCM`. يتضمن OpenVPN 2.6+ أيضًا `CHACHA20-POLY1305` في قائمة التشفيرات الافتراضية عند توفره.
افتراضيًا، استخدم OpenVPN 2.4 والإصدارات الأقدم `BF-CBC` كتشفير لقناة البيانات. Blowfish خوارزمية قديمة (1993) وضعيفة. حتى التوثيق الرسمي لـ OpenVPN يعترف بذلك.
> الافتراضي هو BF-CBC، وهو اختصار لـ Blowfish في وضع Cipher Block Chaining.
>
> لم يعد يُنصح باستخدام BF-CBC بسبب حجم الكتلة البالغ 64 بت. هذا الحجم الصغير يسمح بهجمات تعتمد على التصادمات، كما أوضحت SWEET32. انظر <https://community.openvpn.net/openvpn/wiki/SWEET32> للتفاصيل.
> باحثو الأمن في INRIA نشروا هجومًا على تشفيرات الكتل ذات 64 بت، مثل 3DES وBlowfish. أظهروا أنهم قادرون على استعادة النص الصريح عندما يتم إرسال نفس البيانات بشكل متكرر كافٍ، وأظهروا كيف يمكنهم استخدام ثغرات البرمجة النصية عبر المواقع (XSS) لإرسال البيانات محل الاهتمام بشكل متكرر كافٍ. يعمل هذا عبر HTTPS، ويعمل أيضًا عبر HTTP-over-OpenVPN. انظر <https://sweet32.info/> للحصول على شرح أفضل وأكثر تفصيلًا.
>
> يتأثر تشفير OpenVPN الافتراضي BF-CBC بهذا الهجوم.
في الواقع، AES هو المعيار اليوم. إنه أسرع وأكثر التشفيرات أمانًا المتاحة اليوم. [SEED](https://en.wikipedia.org/wiki/SEED) و[Camellia](https://github.com/angristan/openvpn-install/blob/master/%3Chttps%3A/en.wikipedia.org/wiki/Camellia_%28cipher)>) غير معرضين للخطر حتى الآن لكنهما أبطأ من AES وأقل موثوقية نسبيًا.
> من بين التشفيرات المدعومة حاليًا، يوصي OpenVPN حاليًا باستخدام AES-256-CBC أو AES-128-CBC. OpenVPN 2.4 والأحدث سيدعم أيضًا GCM. بالنسبة للإصدار 2.4+، نوصي باستخدام AES-256-GCM أو AES-128-GCM.
AES-256 أبطأ بنسبة 40% من AES-128، ولا يوجد أي سبب حقيقي لاستخدام مفتاح 256 بت بدلاً من مفتاح 128 بت مع AES. (المصدر: [1](http://security.stackexchange.com/questions/14068/why-most-people-use-256-bit-encryption-instead-of-128-bit),[2](http://security.stackexchange.com/questions/6141/amount-of-simple-operations-that-is-safely-out-of-reach-for-all-humanity/6149#6149)). علاوة على ذلك، AES-256 أكثر عرضة [لهجمات التوقيت](https://en.wikipedia.org/wiki/Timing_attack).
AES-GCM هو [تشفير AEAD](https://en.wikipedia.org/wiki/Authenticated_encryption)، مما يعني أنه يوفر في الوقت نفسه ضمانات السرية والسلامة والمصادقة على البيانات.
ChaCha20-Poly1305 هو تشفير AEAD آخر يوفر أمانًا مشابهًا لـ AES-GCM. إنه مفيد بشكل خاص على الأجهزة التي لا تحتوي على تسريع AES عبر العتاد (AES-NI)، مثل المعالجات الأقدم والعديد من الأجهزة القائمة على ARM، حيث يمكن أن يكون أسرع بشكل ملحوظ من AES.
يدعم السكربت التشفيرات التالية:
- `AES-128-GCM`
- `AES-192-GCM`
- `AES-256-GCM`
- `AES-128-CBC`
- `AES-192-CBC`
- `AES-256-CBC`
- `CHACHA20-POLY1305` (يتطلب OpenVPN 2.5+)
ويستخدم افتراضيًا `AES-128-GCM`.
أضاف OpenVPN 2.4 ميزة تُسمى "NCP": _معاملات التشفير القابلة للتفاوض_. هذا يعني أنه يمكنك توفير مجموعة تشفيرات كما هو الحال مع HTTPS. يتم ضبطها افتراضيًا على `AES-256-GCM:AES-128-GCM` وتتجاوز معامل `--cipher` عند استخدامها مع عميل OpenVPN 2.4. من أجل البساطة، يضبط السكربت `--cipher` (احتياطي للعملاء غير الداعمين لـ NCP)، و`--data-ciphers` (التسمية الحديثة في OpenVPN 2.5+)، و`--ncp-ciphers` (اسم مستعار قديم للتوافق مع OpenVPN 2.4) على التشفير المختار أعلاه.
### قناة التحكم
سيتفاوض OpenVPN 2.4 افتراضيًا على أفضل تشفير متاح (مثل ECDHE+AES-256-GCM)
#### تشفيرات TLS 1.2 (`--tls-cipher`)
يقترح السكربت الخيارات التالية، اعتمادًا على الشهادة:
- ECDSA:
- `TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256`
- `TLS-ECDHE-ECDSA-WITH-AES-256-GCM-SHA384`
- `TLS-ECDHE-ECDSA-WITH-CHACHA20-POLY1305-SHA256` (يتطلب OpenVPN 2.5+)
- RSA:
- `TLS-ECDHE-RSA-WITH-AES-128-GCM-SHA256`
- `TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384`
- `TLS-ECDHE-RSA-WITH-CHACHA20-POLY1305-SHA256` (يتطلب OpenVPN 2.5+)
يستخدم افتراضيًا `TLS-ECDHE-*-WITH-AES-128-GCM-SHA256`.
#### تشفيرات TLS 1.3 (`--tls-ciphersuites`)
عند التفاوض على TLS 1.3، تُستخدم مجموعة منفصلة من حزم التشفير. يتم تكوينها عبر `--tls-ciphersuites` وتستخدم اصطلاحات تسمية OpenSSL:
- `TLS_AES_256_GCM_SHA384`
- `TLS_AES_128_GCM_SHA256`
- `TLS_CHACHA20_POLY1305_SHA256`
افتراضيًا، يتم تمكين جميع حزم التشفير الثلاث. حزم تشفير TLS 1.3 أبسط لأنها لا تتضمن خوارزمية تبادل المفاتيح (التي يتم التفاوض عليها بشكل منفصل عبر مشاركات المفاتيح).
### تبادل المفاتيح
كان OpenVPN يعتمد تاريخيًا على معاملات DH بحجم 2048 بت لتبادل المفاتيح. اعتاد هذا السكربت على تقديم كل من DH (بأحجام مفاتيح قابلة للتكوين) و ECDH كبدائل.
أضاف OpenVPN 2.4 دعم ECDH، وجعل OpenVPN 2.7 `dh none` (ECDH) هو الافتراضي، نظرًا لأن DH ذات المجال المحدود قيد الإهمال. وبما أن ECDH أصبح مدعومًا ومفضلًا عالميًا الآن، لم يعد هذا السكربت يقدم DH التقليدي.
يقوم السكربت بتكوين `tls-groups` باستخدام قائمة التفضيلات التالية:```
X25519:prime256v1:secp384r1:secp521r1
يمكنك تخصيص هذا باستخدام --tls-groups.
من ويكي OpenVPN، حول --auth:
قم بمصادقة حزم قناة البيانات و(إذا كان مفعّلًا) حزم قناة التحكم tls-auth باستخدام HMAC مع خوارزمية ملخص الرسائل alg. (الافتراضي هو SHA1). HMAC هي خوارزمية مصادقة رسائل شائعة الاستخدام (MAC) تستخدم سلسلة بيانات وخوارزمية تجزئة آمنة ومفتاحًا لإنتاج توقيع رقمي.
إذا تم اختيار وضع تشفير AEAD (مثل GCM)، يتم تجاهل خوارزمية
--authالمحددة لقناة البيانات، ويُستخدم بدلاً من ذلك أسلوب المصادقة الخاص بتشفير AEAD. لاحظ أن alg لا تزال تحدد الملخص المستخدم لـ tls-auth.
يوفر السكربت الخيارات التالية:
SHA256SHA384SHA512الافتراضي هو SHA256.
tls-auth وtls-crypt وtls-crypt-v2من ويكي OpenVPN، حول tls-auth:
يضيف طبقة إضافية من مصادقة HMAC فوق قناة التحكم TLS للتخفيف من هجمات DoS والهجمات على حزمة TLS.
باختصار، يتيح
--tls-authنوعًا من "جدار حماية HMAC" على منفذ TCP/UDP الخاص بـ OpenVPN، حيث يمكن إسقاط حزم قناة التحكم TLS التي تحمل توقيع HMAC غير صحيح فورًا دون استجابة.
حول tls-crypt:
قم بتشفير ومصادقة جميع حزم قناة التحكم باستخدام المفتاح من keyfile. (انظر
--tls-authلمزيد من المعلومات الأساسية.)تشفير (ومصادقة) حزم قناة التحكم:
- يوفر مزيدًا من الخصوصية بإخفاء الشهادة المستخدمة لاتصال TLS،
- يجعل من الصعب تحديد حركة مرور OpenVPN على هذا النحو،
- يوفر أمانًا "لفقراء" ما بعد الكمومي، ضد المهاجمين الذين لن يعرفوا أبدًا المفتاح المشترك مسبقًا (أي لا يوجد سرية تامة للأمام).
إذن كلاهما يوفر طبقة إضافية من الأمان ويخفف هجمات DoS. لا يتم استخدامهما افتراضيًا بواسطة OpenVPN.
tls-crypt هي ميزة من OpenVPN 2.4 توفر التشفير بالإضافة إلى المصادقة (على عكس tls-auth). وهي أكثر خصوصية.
tls-crypt-v2 هي ميزة من OpenVPN 2.5 تبني على tls-crypt باستخدام مفاتيح لكل عميل بدلاً من مفتاح مشترك. يتلقى كل عميل مفتاحًا فريدًا مشتقًا من مفتاح الخادم. يوفر هذا:
يدعم السكربت الخيارات الثلاثة جميعها:
tls-crypt-v2 (الافتراضي): مفاتيح لكل عميل لأمان أفضلtls-crypt: مفتاح مشترك لجميع العملاء، متوافق مع OpenVPN 2.4+tls-auth: مصادقة HMAC فقط (بدون تشفير)، متوافق مع العملاء الأقدمremote-cert-tls)يتم تكوين الخادم باستخدام remote-cert-tls client، الأمر الذي يتطلب من الأقران المتصلين أن يكون لديهم شهادة مع استخدام المفتاح الموسع "مصادقة عميل الويب TLS". يمنع هذا استخدام شهادة خادم للانتحال كعميل.
وبالمثل، يتم تكوين العملاء باستخدام remote-cert-tls server لضمان اتصالهم فقط بالخوادم التي تقدم شهادات خادم صالحة. يحمي هذا من مهاجم يمتلك شهادة عميل صالحة ويقيم خادمًا مارقًا.
تفريغ قناة البيانات (DCO) هي ميزة تسريع على مستوى النواة تعمل على تحسين أداء OpenVPN بشكل كبير من خلال إبقاء تشفير/فك تشفير قناة البيانات في مساحة النواة، مما يلغي عمليات تبديل السياق المكلفة بين مساحة المستخدم ومساحة النواة لكل حزمة.
تم دمج DCO في نواة Linux 6.16 (أبريل 2025).
المتطلبات:
ovpn-dcoAES-128-GCM أو AES-256-GCM أو CHACHA20-POLY1305)الإعدادات الافتراضية للسكربت (AES-128-GCM، UDP) متوافقة مع DCO. عندما يكون DCO متاحًا والتكوين متوافقًا، سيستخدمه OpenVPN تلقائيًا لتحسين الأداء.
ملاحظة: يجب أن يكون DCO مدعومًا على كل من الخادم والعميل للتسريع الكامل. دعم العميل متاح في OpenVPN 2.6+ (Linux وWindows وFreeBSD) وOpenVPN Connect 3.4+ (Windows). لا يدعم macOS حاليًا DCO، لكن يمكن للعملاء الاتصال بالخوادم المفعّلة بـ DCO مع فوائد أداء جزئية على جانب الخادم.
سيعرض السكربت حالة توفر DCO أثناء التثبيت.
يمكنك قول شكرًا إذا أردت!
جزيل الشكر لـ المساهمين والعمل الأصلي لـ Nyr.
هذا المشروع مرخّص بموجب رخصة MIT