Wireguard
هو تطبيق VPN مفتوح المصدر (open-source).
أسرع وأبسط وأكثر فاعلية من بروتوكولات IPSec و OpenVPN.
يعمل على Linux و Windows و macOS و iOS و Android و BSD والعديد من الأنظمة الأساسية الأخرى.
$ sudo dnf update
تثبيت وتمكين EPEL repo
$ sudo dnf install epel-release
$ sudo dnf config-manager --set-enabled PowerTools
قمنا أيضًا بتمكين مستودع PowerTools نظرًا لأن حزم EPEL تعتمد عليه.
تثبيت Wireguard
$ sudo dnf copr enable jdoss/wireguard
قم بتثبيت Wireguard:
$ sudo dnf install wireguard-dkms wireguard-tools
تقوم هذه الخطوة أيضًا بتثبيت GNU GCC compiler المطلوب لبناء Linux Kernel modules.
إعداد خادم Wireguard
$ sudo mkdir /etc/wireguard
$ sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
ينشئ الأمر Touch ملف wg0-server.conf الملف في المجلد /etc/wireguard.
قم بإنشاء زوج private/public key لخادم Wireguard:
$ cd /etc/wireguard
$ sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'
اعرض private key الذي أنشأناه للتو:
$ sudo cat privatekey
لاحظ private key وانسخه لأننا سنحتاجه لتهيئة Wireguard.
بعد ذلك ، قم بتعديل ملف الإعداد:
$ sudo nano /etc/wireguard/wg0.conf
أضف الكود التالي.
[Interface]
## VPN server private IP address ##
Address = 192.168.10.1/24
## VPN server port - You can choose any port ##
ListenPort = 37822
## VPN server's private key i.e. /etc/wireguard/privatekey - the one from above ##
PrivateKey = GCEXafeZKqSsuLfvuHE+zLzMYwoH4qQyBh7MZ4f/3kM=
## Save and update this config file when a new peer (vpn client) added ##
SaveConfig = true
يحتوي كل إعداد على قسم واحد يسمى [Interface] حيث يتم تعريف جزء من الخادم.
ويحتوي على الـ private key لخادم WireGuard المحلي ومنفذ UDP الذي يجب أن يستمع إليه للاتصالات الواردة وعناوين IP VPN الخاصة به.
نحن ايضا اعددنا SaveConfig لـ true.
سيخبر هذا خدمة Wireguard بحفظ الإعدادات النشطة تلقائيًا لهذا الملف عند إيقاف التشغيل.
اضغط على Ctrl + W لإغلاق الملف وأدخل Y عندما يُطلب منك حفظ الملف.
إعداد جدار الحماية (Firewall)
نحتاج إلى تعريف خدمة Wireguard لجدار الحماية.
قم بإنشاء ملف wireguard.xml باستخدام المحرر Nano:
$ sudo nano /etc/firewalld/services/wireguard.xml
قم بلصق الـ code التالية في الملف:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>wireguard</short>
<description>WireGuard open UDP port 37822 for client connections</description>
<port protocol="udp" port="37822"/>
</service>
اضغط على Ctrl + W لإغلاق الملف وأدخل Y عندما يُطلب منك حفظ الملف.
قم بتمكين خدمة Wireguard في جدار الحماية:
$ sudo firewall-cmd --permanent --add-service=wireguard
قم بتشغيل masquerading بحيث يتم توجيه كل حركة المرور القادمة (traffic coming) والخروج (going) من 192.168.10.0/24 عبر عنوان IP العام الخاص بنا للخادم 203.1.114.98/24:
$ sudo firewall-cmd --permanent --add-masquerade
أعد تحميل جدار الحماية لتنشيطها:
$ sudo firewall-cmd --reload
اعرض قواعد firewall rules الحالية للتأكيد:
$ sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: wireguard ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
تشغيل IPv4 Forwarding
$ sudo nano /etc/sysctl.d/99-custom.conf
قم بلصق الـ code التالي في الملف:
## Turn on bbr ##
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
## for IPv4 ##
net.ipv4.ip_forward = 1
## Turn on basic protection/security ##
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
## for IPv6 ##
net.ipv6.conf.all.forwarding = 1
اضغط على Ctrl + W لإغلاق الملف وأدخل Y عندما يُطلب منك حفظ الملف.
أعد تحميل التغييرات:
$ sudo sysctl -p /etc/sysctl.d/99-custom.conf
افتراضيا، وجدار الحماية لا تسمح لـ wg0 و eth0 بالتحدث مع بعضهم البعض.
لذلك نحن بحاجة إلى إضافة واجهة Wireguard إلى الشبكة الداخلية وتشغيل masquerading:
$ sudo firewall-cmd --add-interface=wg0 --zone=internal
$ sudo firewall-cmd --permanent --zone=internal --add-masquerade
تمكين وبدء خدمة Wireguard
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0
تحقق مما إذا كانت واجهة Wireguard wg0 قيد التشغيل باستخدام الأمر التالي:
$ sudo wg
interface: wg0
public key: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
private key: (hidden)
listening port: 37822
$ sudo ip a show wg0
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 192.168.10.1/24 scope global wg0
valid_lft forever preferred_lft forever
تثبيت وإعداد WireGuard Client
$ sudo mkdir /etc/wireguard
$ sudo sh -c 'umask 077; touch /etc/wireguard/wg0.conf'
$ cd /etc/wireguard/
$ sudo sh -c 'umask 077; wg genkey | tee privatekey | wg pubkey > publickey'
$ sudo cat privatekey
لاحظ الـ private key الذي تحصل عليه في النهاية.
نحتاج إلى تعديل ملف التكوين الذي أنشأناه للتو:
$ sudo nano /etc/wireguard/wg0.conf
أضف التالي إلى الملف:
[Interface]
## client private key ##
PrivateKey = OEM6D/zt2fVWOepVv3iEDD430V0gAshKp4+5oVVt5EE=
## client ip address ##
Address = 192.168.10.2/24
[Peer]
## CentOS 8 server public key ##
PublicKey = VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
## set ACL ##
AllowedIPs = 192.168.10.0/24
## Your CentOS 8 server's public IPv4/IPv6 address and port ##
Endpoint = 203.1.114.98:37822
## Key connection alive ##
PersistentKeepalive = 15
لاحظ أننا خصصنا عنوان IP الخاص 192.168.10.1 للخادم و 192.168.10.2 للعميل.
أضفنا أيضًا الـ private key للعميل إلى الملف.
[Peer] هو القسم هو المكان الذي تدخل فيه إعدادات الخادم الذي سيتصل به العميل.
لقد أضفنا هنا public key وpublic IP ومجموعة من عناوين IP المسموح بها والتي تحتوي على عنوان IP الخاص بخادمنا.
PersistentKeepalive يخبر WireGuard بإرسال حزمة UDP كل 15 ثانية وهذا مفيد إذا كنت خلف NAT.
اضغط على Ctrl + W لإغلاق الملف وأدخل Y عندما يُطلب منك حفظ الملف.
قم بتمكين وبدء VPN Client :
$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0
$ sudo systemctl status wg-quick@wg0
إعداد الخادم لإضافة العميل (Client)
$ sudo systemctl stop wg-quick@wg0
افتح الملف wg0.conf للتعديل:
$ sudo nano /etc/wireguard/wg0.conf
قم بإلدخال الـ code التالي في نهاية الملف:
[Peer]
## client VPN public key ##
PublicKey = dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA=
## client VPN IP address (note /32 subnet) ##
AllowedIPs = 192.168.10.2/32
اضغط على Ctrl + W لإغلاق الملف وأدخل Y عندما يُطلب منك حفظ الملف.
[Peer] تحدد أقسام الأعضاء الآخرين في شبكة VPN.
يمكنك إضافة أكبر عدد ممكن.
تحتوي على الـ public key الخاص بهم والذي يجب أن يتطابق مع الـ private key للنظراء في قسم [Interface].
لاحظ أنه تتم مصادقة أي اتصال وارد أولاً مقابل أي public keys.
إذا لم يكن الاتصال من نظير تم التحقق منه فسيتم تجاهل الحزم الواردة بصمت.
نظرًا لأن الاتصالات من المضيفين الذين لا يمتلكون مفتاحًا خاصًا مطابقًا لا يتم الرد عليها على الإطلاق فإن WireGuard VPN لا يوفر اتصالًا مشفرًا فحسب ، بل يظل أيضًا مخفيًا عن الغرباء.
ابدأ خدمة Wireguard مرة أخرى.
$ sudo systemctl start wg-quick@wg0
دعنا نتحقق مما إذا كان كل من العميل والخادم متصلين بأمان باستخدام VPN.
لاختبار الاتصال قم بتشغيل الأوامر التالية على العميل الخاص بك.
$ ping -c 192.168.10.1
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=44.2 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=45.8 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=46.7 ms
64 bytes from 192.168.10.1: icmp_seq=4 ttl=64 time=44.1 ms
--- 192.168.10.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2800ms
rtt min/avg/max/mdev = 41.729/47.829/48.953/5.046 ms
$ sudo wg
interface: wg0
public key: dmfO9pirB315slXOgxXtmrBwAqPy07C57EvPks1IKzA=
private key: (hidden)
listening port:
peer: VWndJ4oB7ZJwC/7UOm++OLDrbAxMPsR2yd0cl3sEkUI=
endpoint: 203.1.114.98:37822
allowed ips: 192.168.10.0/24
latest handshake: 1 minute, 40 seconds ago
transfer: 938 B received, 45.67 KiB sent
persistent: keepalive: every 15 seconds