بلاگ/راه‌اندازی VPN اختصاصی با WireGuard روی سرور مجازی و اختصاصی
به‌روز شده

راه‌اندازی VPN اختصاصی با WireGuard روی سرور مجازی و اختصاصی

1405/06/015 بازدید
راه‌اندازی VPN اختصاصی با WireGuard روی سرور مجازی و اختصاصی

راه‌اندازی VPN اختصاصی با WireGuard روی سرور مجازی و اختصاصی

نمایی مفهومی از اتصال امن دستگاه‌ها به سرور WireGuard داشتن یک VPN شخصی به شما اجازه می‌دهد ترافیک دستگاه‌های خود را از مسیری رمزنگاری‌شده عبور دهید، هنگام استفاده از شبکه‌های عمومی امنیت بیشتری داشته باشید و به سرویس‌های داخلی سرور یا سازمان دسترسی کنترل‌شده پیدا کنید. WireGuard به‌دلیل معماری ساده، کارایی بالا و پیکربندی نسبتاً کوتاه، یکی از گزینه‌های مناسب برای ساخت چنین شبکه‌ای است. در این راهنما، راه‌اندازی WireGuard روی سرور را در Ubuntu یا Debian بررسی می‌کنیم. ابتدا نرم‌افزار را نصب می‌کنیم، سپس کلیدهای سرور و کلاینت را می‌سازیم، رابط VPN را تنظیم می‌کنیم و در پایان با فعال‌سازی IP forwarding، فایروال و NAT امکان عبور ترافیک کلاینت‌ها از اینترنت سرور را فراهم می‌کنیم. دستورها با فرض دسترسی root یا کاربری دارای مجوز sudo نوشته شده‌اند. پیش از شروع، از تنظیمات مهم سرور نسخه پشتیبان بگیرید و پورت مدیریتی SSH را در فایروال باز نگه دارید. برای تقویت بیشتر امنیت سرور، مطالعه افزایش امنیت سرور لینوکس نیز پیشنهاد می‌شود.

WireGuard چیست و چرا برای VPN اختصاصی مناسب است؟

WireGuard یک پروتکل و نرم‌افزار VPN متن‌باز است که از رمزنگاری مدرن استفاده می‌کند. برخلاف بعضی راهکارهای قدیمی‌تر، پیکربندی آن بر پایه تعداد محدودی مفهوم اصلی انجام می‌شود: رابط شبکه، کلید خصوصی، کلید عمومی، آدرس تونل و پیرها. در WireGuard هر دستگاه یک جفت کلید خصوصی و عمومی دارد. کلید خصوصی هرگز نباید از دستگاه خارج شود. کلید عمومی در اختیار پیر مقابل قرار می‌گیرد تا دو طرف بتوانند یکدیگر را شناسایی و ارتباط رمزنگاری‌شده برقرار کنند. WireGuard از UDP استفاده می‌کند و معمولاً سربار کمی دارد. همین ویژگی آن را برای سرورهای مجازی، سرورهای اختصاصی، تلفن همراه و لپ‌تاپ مناسب می‌کند.

مقایسه کوتاه WireGuard و OpenVPN

انتخاب نهایی به زیرساخت و نیاز شما وابسته است، اما جدول زیر تفاوت‌های رایج این دو راهکار را نشان می‌دهد؛ برای آشنایی با گزینه جایگزین می‌توانید تنظیم سرور OpenVPN را نیز ببینید.

معیارWireGuardOpenVPN
پیچیدگی پیکربندیکم و خوانامعمولاً بیشتر
پروتکل انتقالUDPUDP یا TCP
کاراییمعمولاً بالا و کم‌سرباروابسته به تنظیمات و رمزنگاری
مدیریت هویتبر پایه کلید عمومیمعمولاً بر پایه گواهی و PKI
پشتیبانی کلاینتسیستم‌عامل‌های اصلیسیستم‌عامل‌ها و تجهیزات بسیار متنوع
کاربرد مناسبVPN شخصی و شبکه‌های سبک تا متوسطمحیط‌های قدیمی یا نیازمند قابلیت‌های سازمانی خاص

پیش‌نیازهای راه‌اندازی WireGuard روی سرور

برای اجرای این آموزش به موارد زیر نیاز دارید: - یک سرور مجازی یا اختصاصی با Ubuntu 22.04، Ubuntu 24.04 یا نسخه جدید Debian - یک IPv4 عمومی و ثابت - دسترسی root یا sudo - امکان باز کردن یک پورت UDP، در این راهنما 51820 - نام رابط اینترنت سرور، مانند eth0، ens3 یا enp1s0 برای پیدا کردن رابطی که مسیر پیش‌فرض از آن عبور می‌کند، دستور زیر را اجرا کنید:

ip route show default

خروجی ممکن است شبیه نمونه زیر باشد:

default via 203.0.113.1 dev ens3

در این نمونه، نام رابط اینترنت ens3 است. این مقدار را یادداشت کنید؛ هنگام تنظیم NAT به آن نیاز داریم. شبکه داخلی VPN در این آموزش 10.20.0.0/24 است. آدرس سرور 10.20.0.1 و آدرس نخستین کلاینت 10.20.0.2 خواهد بود. اگر این محدوده با شبکه داخلی شما تداخل دارد، یک محدوده خصوصی دیگر انتخاب کنید.

نصب WireGuard روی Ubuntu یا Debian

ابتدا فهرست بسته‌ها را به‌روز کنید و WireGuard را نصب کنید:

sudo apt update
sudo apt install -y wireguard

پس از نصب، وجود ابزار خط فرمان را بررسی کنید:

wg --version

برای مشاهده وضعیت رابط‌ها نیز بعداً می‌توانید از دستور زیر استفاده کنید:

sudo wg show

تولید کلیدهای سرور و کلاینت

WireGuard برای هر پیر به یک جفت کلید نیاز دارد. ابتدا سطح دسترسی فایل‌های جدید را محدود کنید تا کلید خصوصی برای کاربران دیگر قابل خواندن نباشد:

umask 077

سپس کلیدهای سرور را بسازید:

wg genkey | sudo tee /etc/wireguard/server-private.key | wg pubkey | sudo tee /etc/wireguard/server-public.key

محتوای کلید عمومی سرور را می‌توانید مشاهده کنید:

sudo cat /etc/wireguard/server-public.key

کلید خصوصی را در پیام‌رسان، ایمیل یا مخزن Git قرار ندهید. برای مشاهده موقت آن هنگام ساخت فایل پیکربندی از دستور زیر استفاده کنید:

sudo cat /etc/wireguard/server-private.key

کلیدهای کلاینت بهتر است روی خود دستگاه کلاینت تولید شوند. در یک سیستم لینوکسی دارای WireGuard می‌توانید اجرا کنید:

umask 077
wg genkey | tee client-private.key | wg pubkey > client-public.key

در اندروید و iOS نیز برنامه رسمی WireGuard هنگام ساخت تونل، جفت کلید را تولید می‌کند. فقط کلید عمومی کلاینت باید به سرور منتقل شود. فرایند تبادل کلید عمومی میان سرور و کلاینت WireGuard

فعال‌سازی مسیریابی IP در سرور

اگر قرار است کلاینت‌ها از طریق سرور به اینترنت متصل شوند، هسته لینوکس باید اجازه عبور بسته‌ها میان رابط WireGuard و رابط اینترنت را داشته باشد. فایل تنظیمات sysctl را ایجاد کنید:

sudo nano /etc/sysctl.d/99-wireguard.conf

مقدار زیر را در آن قرار دهید:

net.ipv4.ip_forward = 1

اگر از IPv6 داخل تونل استفاده می‌کنید، این خط را نیز اضافه کنید:

net.ipv6.conf.all.forwarding = 1

تنظیمات را بدون راه‌اندازی مجدد سیستم اعمال کنید:

sudo sysctl --system

برای اطمینان از فعال شدن IPv4 forwarding اجرا کنید:

sysctl net.ipv4.ip_forward

مقدار خروجی باید 1 باشد.

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

فایل رابط wg0 را باز کنید:

sudo nano /etc/wireguard/wg0.conf

پیکربندی زیر را وارد کنید. مقدار SERVER_PRIVATE_KEY را با کلید خصوصی سرور و CLIENT_PUBLIC_KEY را با کلید عمومی کلاینت جایگزین کنید. همچنین ens3 باید با نام واقعی رابط اینترنت سرور عوض شود.

[Interface]
PrivateKey = SERVER_PRIVATE_KEY
Address = 10.20.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE

[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.20.0.2/32

دستور PostUp هنگام بالا آمدن رابط wg0 اجرا می‌شود و اجازه عبور ترافیک از رابط VPN به بیرون را می‌دهد؛ PostDown هنگام خاموش شدن رابط، همان قواعد را حذف می‌کند تا تنظیمات فایروال تمیز بماند. به‌جای ens3 باید نام واقعی رابط اینترنت سرور را که پیش‌تر با ip route show default پیدا کردید قرار دهید. برای درک عمیق‌تر قواعد NAT و فایروال، راهنمای فایروال و NAT را مطالعه کنید.

سطح دسترسی فایل را محدود کنید تا کلید خصوصی برای کاربران دیگر قابل خواندن نباشد:

sudo chmod 600 /etc/wireguard/wg0.conf

باز کردن پورت در فایروال

اگر از ufw استفاده می‌کنید (راهنمای تنظیم فایروال با UFW)، پورت UDP سرویس WireGuard را باز کنید:

sudo ufw allow 51820/udp
sudo ufw status

در صورت استفاده از فایروال پنل کنترل یا فایروال ابری سرویس‌دهنده (مانند فایروال شبکه آریانت)، همین پورت UDP باید به‌صورت جداگانه در آنجا نیز باز شود؛ باز بودن پورت فقط در ufw کافی نیست اگر یک لایه فایروال دیگر جلوی سرور قرار داشته باشد.

فعال‌سازی و اجرای سرویس WireGuard

با دستور زیر رابط wg0 را بالا بیاورید و اجرای آن را در راه‌اندازی بعدی سیستم فعال کنید:

sudo systemctl enable --now wg-quick@wg0

وضعیت سرویس و رابط را بررسی کنید:

sudo systemctl status wg-quick@wg0
sudo wg show

خروجی دستور wg show باید کلید عمومی سرور، پورت گوش‌دادن و پیر تعریف‌شده را نشان دهد. اگر پیری در خروجی دیده نمی‌شود یا handshake پس از اتصال کلاینت ثبت نمی‌شود، به بخش عیب‌یابی در ادامه مراجعه کنید.

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

در دستگاه کلاینت، فایلی مانند client.conf با محتوای زیر بسازید. مقدار CLIENT_PRIVATE_KEY را با کلید خصوصی همان کلاینت و SERVER_PUBLIC_KEY را با کلید عمومی سرور جایگزین کنید و SERVER_IP را به آدرس IP عمومی سرور تغییر دهید:

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.20.0.2/24
DNS = 1.1.1.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = SERVER_IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

اگر فقط می‌خواهید ترافیک شبکه داخلی VPN از تونل عبور کند (نه کل اینترنت کلاینت)، به‌جای AllowedIPs=0.0.0.0/0, ::/0 مقدار 10.20.0.0/24 را قرار دهید. PersistentKeepalive برای کلاینت‌هایی که پشت NAT هستند (اکثر موبایل‌ها و اینترنت خانگی) توصیه می‌شود تا اتصال باز بماند.

این فایل را در برنامه رسمی WireGuard (به‌صورت اسکن QR Code در موبایل یا Import در دسکتاپ) وارد کنید، یا در لینوکس با دستور زیر تونل را بالا بیاورید:

sudo wg-quick up ./client.conf

تست اتصال

پس از اتصال کلاینت، از خود کلاینت پینگ بزنید:

ping 10.20.0.1

در سرور نیز بررسی کنید که handshake ثبت شده باشد:

sudo wg show

اگر latest handshake مقدار زمانی اخیر نشان دهد، تونل به‌درستی برقرار شده است. برای اطمینان از عبور کامل ترافیک از VPN (در صورت استفاده از AllowedIPs=0.0.0.0/0)، از کلاینت آدرس IP عمومی خود را بررسی کنید و مطمئن شوید IP سرور نمایش داده می‌شود.

افزودن کلاینت‌های بیشتر

برای هر کلاینت جدید، یک جفت کلید و یک آدرس IP داخلی جدا (مثلاً 10.20.0.3/32) در نظر بگیرید و یک بلوک [Peer] جدید به wg0.conf روی سرور اضافه کنید، سپس رابط را بارگذاری مجدد کنید:

sudo wg syncconf wg0 <(sudo wg-quick strip wg0)

این دستور تنظیمات را بدون قطع اتصال کلاینت‌های فعلی به‌روزرسانی می‌کند.

عیب‌یابی مشکلات رایج

  • handshake برقرار نمی‌شود: پورت UDP در همه لایه‌های فایروال (سیستم‌عامل و فایروال ابری) باز نیست، یا Endpoint در کلاینت اشتباه است.
  • کلاینت متصل می‌شود اما به اینترنت دسترسی ندارد: net.ipv4.ip_forward فعال نشده یا قاعده MASQUERADE در PostUp روی رابط درستی تنظیم نشده است.
  • بعد از ری‌استارت سرور تونل بالا نمی‌آید: سرویس wg-quick@wg0 با enable فعال نشده است.
  • کلید عمومی/خصوصی اشتباه جایگزین شده: کلید عمومی سرور باید در فایل کلاینت و کلید عمومی کلاینت باید در فایل سرور قرار بگیرد، نه برعکس.

جمع‌بندی

با این تنظیمات یک VPN اختصاصی و سبک روی سرور خودتان راه‌اندازی کردید که هم برای دسترسی امن به منابع داخلی و هم برای عبور کامل ترافیک اینترنت از مسیر رمزنگاری‌شده قابل استفاده است. اگر به کارایی و پایداری بیشتری برای اجرای WireGuard و سرویس‌های دیگر خود نیاز دارید، می‌توانید سرور مجازی آریانت را با پهنای باند و منابع متناسب با تعداد کلاینت‌های خود انتخاب کنید.