وایرگارد ابزاری است برای ایجاد آسان یک اتصال رمزشده میان چند کامپیوتر متصل به شبکه اما دور از هم. وایرگارد از نسخه ۵.۶ لینوکس وارد بدنه اصلی کرنل شده است.

وایرگارد چند سالی است که توسط Jason A. Donenfeld توسعه پیدا کرده است و در نهایت وارد بدنه کرنل لینوکس شده به این معنی که برای نصب وایرگارد دیگه نیازی به نصب هیچ ماژولی در کرنل نیست. فقط کافیه ابزارهای userspace tools شامل wg و در صورت نیاز به کمک بیشتر wg-quickرا برای تنظیم اتصالات نصب کرد.

وایرگارد از تمام تکنولوژی‌های مشابه ساده‌تر و سریع‌تر و جمع و جورتره. کدش حدود ۳۰۰۰ خطه که کوچکترین در نوع خودش محصوب میشه و بررسی توسط متخصصین امنیت را بسیار ساده می‌کنه ( در مقایسه با صدها هزار خط کد سایر برنامه‌های مشابه ). به کمک وایرگارد میشه به سرعت چند کامپیوتر چه در اینترنت چه در شبکه‌های جدا از اینترنت به یکدیگر متصل کرد. فایل تنظیماتش متنی است و کلیدهای عمومی و خصوصی لازم را با ابزار wg می‌توان به سرعت ساخت. پروتکلش هم به طور مفصل در مستنداتش شرح داده شده.

پیش نیاز ها

در مثال زیر روی یک سرور Ubuntu 20.04 وایرگارد را راه می‌اندازیم. کلاینت برای ویندوز و اندروید و مانند اینها را می‌تونید از سایت خودشون بگیرید. روش کار اینطوره که ما برای هر کامپیوتر یک جفت کلید می‌سازیم. یک جفت برای سرور و یک جفت برای هر کلاینت. در ادامه کلید عمومی سرور را به کلاینت‌ها و کلید عمومی کلاینت‌ها را به سرور اضافه می‌کنیم.

اول ابزارهای لازم را نصب می کنیم

apt install wireguard resolvconf

بعد فایل /etc/wireguard/wg0.conf را می‌سازیم و تنظیمات را وارد می‌کنیم ( اسم فایل مهم است )

[Interface]
PrivateKey = <server_privatekey>
Address = 10.0.0.1/24,fd9e:cc01:4001::1/48
ListenPort = <portnumber e.g. 51820>

[Peer]
# Peer No. 1
PublicKey = <peer1_publickey>
PresharedKey = <peer1_preshared_key>
AllowedIPs = 10.0.0.2/32,fd9e:cc01:4001::2/64

[Peer]
# Peer No. 2
PublicKey = <peer2_publickey>
PresharedKey = <peer2_preshared_key>
AllowedIPs = 10.0.0.3/32,fd9e:cc01:4001::3/64

انتخاب رنج IPv4 ساده است. برای انتخاب رنج IPv6 در اینترنت IPv6 address range generator یا مشابه آن را جستجو کنید. فایل تنظیمات وایرگارد همیشه یک Interface داره و تعدادی Peerکه اولی تنظیمات کارت شبکه مجازی است که روی این کامپیوتر ساخته می‌شه. دومی هم کلید و آی‌پی مجاز کلاینت ‌هاست. می‌بینید که خبری از DHCP و این قبیل چیزها نیست. باید آی‌پی را خودمان تعیین کنیم. در مثال بالا جای کلیدها خالیه که آنها را باید اینطور ساخت :

# Generate a key pair for the server
wg genkey | tee server_privatekey | wg pubkey > server_publickey

# Peer 1
wg genkey | tee peer1_privatekey | wg pubkey > peer1_publickey
# Generate a pre-shared key
wg genpsk > peer1_preshared_key

# Peer 2
wg genkey | tee peer2_privatekey | wg pubkey > peer2_publickey
# Generate a pre-shared key
wg genpsk > peer2_preshared_key

مقداری که wg genpsk می‌سازه باید به ازای هر Peer هم در کلاینت و در سرور در تنظیمات Peer وارد بشه و یکسان باشه. خروجی wg genkeyکلید خصوصی است ( اگر به تنهایی اجراش کنید ) که در بخش Interfaceثبت میشه. همچنین کلید عمومی را ساختیم ( که ما در یک خط با هم انجام دادیم ) که در تنظیمات کلاینت‌هایی که می‌خواهند به این سرور وصل بشوند ثبت میشه (مقادیر را باید از فایل‌هایی که تولید کردیم برداریم و در فایل wg0.conf وارد کنیم).

راه اندازی سرور وایرگارد

wg-quick up wg0
# Enable service after each boot
systemctl enable wg-quick@wg0.service

با دستور ip link یا ip addr می‌تونید اینترفیس جدیدی که به نام wg0ساخته شده و مشخصات آن را ببینید. کار سرور اینجا تمام است. برای هر کلاینت هم مشابه همین فایل را می‌سازیم.

[Interface]
PrivateKey = <peer1_privatekey>
Address = 10.10.0.2/24 ,fd9e:cc01:4001::2/48

[Peer]
PublicKey = <server_publickey>
PresharedKey = <peer1_preshared_key>
AllowedIPs = 0.0.0.0/0,::/0
Endpoint = <server_ip>:<server_port>

این فایل را در کلاینت اندروید یا ویندوز وارد بکنید و اتصال را استارت بزنید یک شبکه مجازی بین آن دستگاه و سرور ساخته می‌شه که مثل فولاد محکم و نفوذناپذیره. این کار برای اتصال اجزای مختلف یک برنامه یا کامپیوترهای شخصی یا اداری بسیار سودمند است. یک بیزینس کوچک هم می‌تونه بخش‌های مختلف و ساختمانهای مختلف را به این صورت به هم وصل کنه.

اتصال به اینترنت

اگر بخواید کلاینت‌ها پس از اتصال بتونند به اینترنت سرور وصل بشوند باید روی سرور IP Routing داشته باشیم. یعنی سرور را به روتر تبدیل کنیم تا بسته‌ها بین شبکه‌های مختلف بتونند حرکت بکنند. با افزودن net.ipv4.ip_forward=1 به فایل /etc/sysctl.conf آنرا فعال می‌کنیم :

vim /etc/sysctl.conf
# uncomment this line : net.ipv4.ip_forward=1
sysctl -p

و جدول iptables را تغییر بدهید تا لینوکس بداند ترافیک مجاز است بین اینترفیس مجازی وایرگارد و کارت شبکه‌ای هدف ( اینجا eth0 ) حرکت بکند:

iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

این دو خط را می‌شود به فایل تنظیمات وایرگارد هم اضافه کرد تا به شکل اتوماتیک با حذف و اضافه اینترفیس اینها هم اضافه و کم بشوند ( فقط روی سرور ) :

[Interface]
...
...
DNS = 1.1.1.1 <- optional: set peers' dns
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
...
...