پیکوسیستم خدمات فنی IT

نصب WireGuard روی اوبونتو: ساخت سرور VPN سریع با چند خط تنظیمات

WireGuard VPN ساده و سریع با پیکربندی کوتاه است. نصب روی اوبونتو، ساخت کلید، فایل wg0.conf سرور، فعال کردن مسیریابی و NAT، افزودن کاربر، کانفیگ کلاینت، AllowedIPs، wg show و عیب یابی عدم handshake.

نصب WireGuard روی اوبونتو: ساخت سرور VPN سریع با چند خط تنظیمات

نصب WireGuard سریع ترین راه ساختن یک سرور VPN مدرن است. WireGuard داخل کرنل لینوکس قرار دارد، پیکربندی اش چند خط است، سرعت و پایداری خوبی می دهد و کد کوچکی دارد که بررسی امنیتی آن را ساده تر می کند. هر کاربر یک جفت کلید دارد و سرور فقط کلید عمومی او را می شناسد، پس مفهوم «رمز» و «گواهی» ساده تر از OpenVPN است. در مقابل مدیریت خودکار کاربران و ابطال و احراز هویت دومرحله ای با ابزار جانبی انجام می شود. مقایسه با OpenVPN را در نصب OpenVPN و مفاهیم کلی را در VPN سازمانی چیست ببینید.

نصب و ساخت کلید

sudo apt update
sudo apt install wireguard

cd /etc/wireguard
umask 077
wg genkey | tee server.key | wg pubkey > server.pub
wg genkey | tee ali.key | wg pubkey > ali.pub

wg genkey کلید خصوصی می سازد و wg pubkey از آن کلید عمومی را مشتق می کند. umask 077 مجوز فایل ها را طوری می گذارد که فقط root بخواند. کلید خصوصی هر دستگاه همیشه فقط روی همان دستگاه می ماند و فقط کلید عمومی منتقل می شود. بهتر است کلید کاربر را خود کاربر روی دستگاهش بسازد و فقط کلید عمومی را بفرستد، اما برای شرکت های کوچک گاهی مدیر کلید را می سازد و ایمن تحویل می دهد.

تنظیم سرور

فایل /etc/wireguard/wg0.conf:

[Interface]
Address = 10.99.0.1/24
ListenPort = 51820
PrivateKey = (محتوای server.key)
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

[Peer]
# ali
PublicKey = (محتوای ali.pub)
AllowedIPs = 10.99.0.2/32
  • Address آدرس سرور داخل شبکه VPN است. بازه (مثلاً 10.99.0.0/24) نباید با شبکه های دیگر هم پوشان باشد (subnet چیست).
  • PostUp و PostDown قاعده های iptables را هنگام بالا و پایین آمدن رابط اضافه و حذف می کنند. نام کارت (eth0) را با نام واقعی (از ip addr) عوض کنید. اگر مسیر برگشت شبکه داخلی را روی روتر تنظیم می کنید، لازم نیست MASQUERADE بگذارید.
  • AllowedIPs در بخش Peer هم تعیین می کند چه آدرس هایی از این کاربر پذیرفته شود (فقط 10.99.0.2) و مسیر چه ترافیکی به او برود. این اصلی ترین ابزار کنترل در WireGuard است.

مسیریابی را فعال و پورت را باز کنید و رابط را بالا بیاورید:

echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wg.conf
sudo sysctl --system
sudo ufw allow 51820/udp
sudo systemctl enable --now wg-quick@wg0
sudo wg show

WireGuard فقط UDP است، پس پورت UDP را باز کنید (فرق TCP و UDP). اگر سرور پشت NAT یا CGNAT است، Port Forward لازم است و در CGNAT اتصال ورودی از بیرون کار نمی کند (NAT چیست).

پیکربندی کلاینت

روی دستگاه کاربر (ویندوز، macOS، لینوکس، اندروید یا iOS از برنامه رسمی WireGuard) فایل زیر را بسازید:

[Interface]
Address = 10.99.0.2/32
PrivateKey = (محتوای ali.key)
DNS = 192.168.10.2

[Peer]
PublicKey = (محتوای server.pub)
Endpoint = vpn.example.com:51820
AllowedIPs = 192.168.10.0/24, 10.99.0.0/24
PersistentKeepalive = 25

در سمت کلاینت AllowedIPs تعیین می کند چه ترافیکی به تونل برود. با نوشتن فقط شبکه های داخلی، بقیه اینترنت کاربر مستقیم می رود (split tunnel). با 0.0.0.0/0 همه ترافیک از VPN می گذرد. گزینه PersistentKeepalive برای کاربرانی که پشت NAT اند، اتصال را نگه می دارد. برای موبایل، برنامه می تواند کد QR بخواند؛ با ابزار qrencode می توان از روی فایل پیکربندی QR ساخت.

اضافه کردن و حذف کاربر

برای هر کاربر جدید، یک بخش Peer با کلید عمومی و آدرس منحصر به فرد می افزایید. بدون ریستارت رابط می توانید تغییر را اعمال کنید:

sudo wg set wg0 peer (کلید عمومی کاربر) allowed-ips 10.99.0.3/32
sudo wg-quick save wg0
sudo wg set wg0 peer (کلید عمومی کاربر) remove

دستور آخر دسترسی کاربر را فوراً قطع می کند. کلیدها را در فهرستی ثبت کنید که کدام کلید مال چه کسی است؛ WireGuard نام کاربر ندارد و فقط کلید می شناسد، پس مدیریت این فهرست با شماست.

بررسی وضعیت

sudo wg show
sudo wg show wg0 latest-handshakes
ping 10.99.0.1

در خروجی wg show برای هر peer زمان آخرین handshake و مقدار ترافیک دریافت و ارسال دیده می شود. handshake جدید (چند ثانیه تا دو دقیقه قبل) یعنی اتصال سالم است. WireGuard وقتی ترافیک نیست خاموش می ماند، پس نبودن handshake برای کاربری که چیزی نمی فرستد طبیعی است. اگر هرگز handshake نمی بینید، مشکل معمولاً از یکی از این هاست:

  • پورت UDP در فایروال یا مودم باز نیست. با sudo tcpdump -i eth0 -n udp port 51820 ببینید بسته می رسد یا نه.
  • کلید عمومی اشتباه یا جابجا کپی شده (کلید خصوصی به جای عمومی).
  • Endpoint کلاینت آدرس یا پورت اشتباه دارد.
  • ساعت یکی از دو طرف خیلی غلط است (NTP چیست).

اگر handshake هست ولی ترافیک رد نمی شود: AllowedIPs، IP forwarding، قاعده فایروال و مسیر برگشت را بررسی کنید. صفحه های کوچک باز و فایل بزرگ قطع می شود: MTU را کمتر کنید (با گزینه MTU = 1380 در Interface). ابزار ping و روش عیب یابی در ping چیست و عیب یابی شبکه آمده است.

امنیت و محدودیت ها

  • دسترسی هر کاربر را در فایروال سرور به سرورها و پورت هایی که لازم دارد محدود کنید. AllowedIPs فقط آدرس کاربر را کنترل می کند (فایروال چیست).
  • کلید خصوصی سرور و کاربران را مثل رمز نگه دارید. لپ تاپ گم شده یعنی کلید آن باید فوراً از سرور حذف شود.
  • WireGuard احراز هویت دومرحله ای داخلی ندارد. برای آن باید لایه جانبی مثل یک پراکسی احراز هویت یا فایروالی که این قابلیت را دارد به کار برد.
  • برای دسترسی آدرس عمومی کاربر ثابت نمی ماند (WireGuard اتصال های متحرک را می پذیرد)، که مفید ولی لاگ آن را سخت می کند. لاگ ورود در خود WireGuard محدود است و باید به ابزار بیرونی تکیه کرد.
  • سرور را با ورود SSH با کلید و فایروال امن کنید (SSH چیست) و فایل های /etc/wireguard را بکاپ بگیرید.

ساخت خودکار کلاینت با اسکریپت

وقتی چند کاربر دارید، ساخت دستی کلید و فایل هر کدام خطا می آورد. یک اسکریپت کوتاه این کار را تکرارپذیر می کند:

#!/bin/bash
# usage: add-client.sh ali 10.99.0.2
set -euo pipefail
name=$1; ip=$2
umask 077
mkdir -p /etc/wireguard/clients
cd /etc/wireguard/clients
wg genkey | tee "$name.key" | wg pubkey > "$name.pub"
cat > "$name.conf" <<EOF
[Interface]
Address = $ip/32
PrivateKey = $(cat "$name.key")
DNS = 192.168.10.2

[Peer]
PublicKey = $(cat /etc/wireguard/server.pub)
Endpoint = vpn.example.com:51820
AllowedIPs = 192.168.10.0/24
PersistentKeepalive = 25
EOF
wg set wg0 peer "$(cat "$name.pub")" allowed-ips "$ip/32"
wg-quick save wg0

فایل ساخته شده را فقط به خود کاربر و با کانال امن بدهید و بعد از تحویل، کلید خصوصی را از سرور حذف کنید، چون سرور فقط به کلید عمومی نیاز دارد. این اسکریپت را در مخزن مستندات تیم نگه دارید.

عبور همه ترافیک از VPN و DNS

اگر می خواهید همه اینترنت کاربر از سرور شرکت عبور کند (مثلاً برای کنترل و ثبت)، در کلاینت AllowedIPs = 0.0.0.0/0, ::/0 بگذارید و DNS را به سرور داخلی بدهید. به خاطر داشته باشید این کار پهنای باند سرور و سرعت کاربر را تحت تأثیر می گذارد. در این حالت ممکن است DNS کاربر هنوز از مسیر دیگری برود (DNS leak). با تنظیم DNS در Interface و بررسی با یک ابزار تست نشت DNS مطمئن شوید همه درخواست ها از تونل می روند. نکته های بیشتر درباره split و full tunnel در VPN سازمانی چیست آمده است.

وقتی کاربر پشت شبکه محدود است

بعضی شبکه ها (هتل، شبکه سازمانی دیگر) UDP خارجی را می بندند. WireGuard فقط UDP است، پس اگر پورت 51820 بسته باشد کار نمی کند. یک راه حل ساده انتخاب پورتی است که کمتر مسدود می شود (مثلاً 443 UDP یا 53 UDP)؛ ولی مسدود نبودن قطعی نیست. اگر کاربران شما اغلب پشت چنین شبکه هایی اند، یک VPN مبتنی بر TCP مثل OpenVPN روی پورت 443 جایگزین است (نصب OpenVPN).

برای مقایسه با دیگر روش های اتصال امن، VPN چیست را ببینید.

منابع و مستندات رسمی

اتصال دو شعبه با WireGuard روی میکروتیک در VPN در میکروتیک آمده است. طراحی کامل VPN و مدیریت کاربران در راه اندازی VPN سازمانی و اتصال شعب پوشش داده می شود.

نحوه تهیه مقاله ها

مقاله های مرتبط

استعلام

کارتان را بگویید، مسیر و هزینه را می گوییم

چند خط درباره وضعیت فعلی و چیزی که می خواهید بنویسید. یک مهندس خودش با شما تماس می گیرد و درخواست به واحد فروش نمی رود.

  1. 01درخواست را می خوانیم و اگر ابهامی بود تماس می گیریم.
  2. 02در صورت نیاز، بررسی اولیه ریموت یا بازدید انجام می شود.
  3. 03پیشنهاد مکتوب با دامنه کار، زمان بندی و هزینه می فرستیم.

اطلاعات شما فقط برای پاسخ به همین درخواست استفاده می شود. حریم خصوصی