recent
أخبار ساخنة

شرح تثبيت وإعداد Wireguard VPN على CentOS ... بالخطوات

الصفحة الرئيسية

شرح إعداد Wireguard VPN على CentOS  ... بالخطوات


Wireguard

هو تطبيق VPN مفتوح المصدر (open-source).

أسرع وأبسط وأكثر فاعلية من بروتوكولات IPSec و OpenVPN.

يعمل على Linux و Windows و macOS و iOS و Android و BSD والعديد من الأنظمة الأساسية الأخرى.

سنشرح هنا تثبيت Wireguard VPN على خادم يستند إلى CentOS 8 والاتصال به باستخدام Linux(CentOS/Fedora/Ubuntu) client.

من الضروري تحديث نظامك لتثبيت آخر التحديثات:

$ sudo dnf update


تثبيت وتمكين EPEL repo

يمكن العثور على حزم Wireguard المطلوبة في مستودع EPEL لذلك نحتاج إلى تثبيتها وتمكينها:

$ sudo dnf install epel-release

$ sudo dnf config-manager --set-enabled PowerTools


قمنا أيضًا بتمكين مستودع PowerTools نظرًا لأن حزم EPEL تعتمد عليه.

تثبيت Wireguard

قم بتمكين مستودع Wireguard:

$ sudo dnf copr enable jdoss/wireguard


قم بتثبيت Wireguard:

$ sudo dnf install wireguard-dkms wireguard-tools


تقوم هذه الخطوة أيضًا بتثبيت GNU GCC compiler المطلوب لبناء Linux Kernel modules.

إعداد خادم Wireguard

قم بإنشاء ملف configuration فارغ لإعدادات 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 لجدار الحماية.

 قم بإنشاء ملف 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

إنشئ ملف  /etc/sysctl.d/99-custom.conf.


$ 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

نحتاج إلى تمكين وبدء خدمة 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

بمجرد تثبيت الـ client, ستحتاج إلى إنشاء ملف client configuration:

$ 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)

الآن ، نحتاج إلى إضافة إعداد العميل إلى الخادم مرة أخرى.
أوقف خدمة Wireguard أولاً:

$ 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

google-playkhamsatmostaqltradent