ایده‌ات را بگو؛ با هوش مصنوعی می‌سازیمش

WireGuard: VPN مدرن و ساده

WireGuard: VPN مدرن و ساده؛ مفاهیم، نصب، کانفیگ سرور و کلاینت، NAT، Split Tunnel و پیشرفته‌ها

WireGuard یک VPN ساده و سریع است که در کرنل لینوکس (از نسخه ۵.۶) قرار دارد. مزایایش:

  • کد کوچک و قابل بررسی (حدود چند هزار خط)
  • رمزنگاری مدرن: Curve25519، ChaCha20-Poly1305، BLAKE2s
  • هویت هر peer فقط با کلید عمومی تعریف می‌شود (بدون گواهی یا نام کاربری)
  • اتصال UDP و مقاوم در برابر تغییر IP

سطح ۱: مبتدی — مفاهیم

مفهومتوضیح
Interface (wg0)اینترفیس مجازی روی هر دستگاه
Private Keyکلید خصوصی؛ هرگز منتشر نشود
Public Keyکلید عمومی؛ به peerها داده می‌شود
Peerطرف مقابل تونل (سرور یا کلاینت)
Endpointآدرس عمومی IP:Port سرور
AllowedIPsدو کاربرد: مسیرهایی که وارد تونل می‌شوند و IPهایی که از این peer قبول می‌شوند
Keepaliveارسال بسته‌ی کوچک هر چند ثانیه برای باز نگه داشتن NAT

معماری نمونه

[Client laptop]  10.8.0.2  ──UDP 51820──►  [Server VPS]  10.8.0.1  ──► اینترنت
                                       (IP عمومی: 203.0.113.10)

سطح ۲: متوسط — نصب و کانفیگ پایه

نصب

روی سرور و کلاینت:

sudo apt update
sudo apt install wireguard wireguard-tools
wg --version

تولید کلیدها

روی هر دستگاه:

umask 077                             # فایل‌های کلید فقط برای مالک قابل خواندن
wg genkey | tee privatekey | wg pubkey > publickey
cat privatekey publickey
  • privatekey → کلید خصوصی همان دستگاه (در کانفیگ PrivateKey)
  • publickey → کلید عمومی (به طرف مقابل می‌دهی)

کانفیگ سرور

فایل /etc/wireguard/wg0.conf روی سرور:

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <PRIVATE_KEY_SERVER>

# اجازه‌ی Forward و NAT برای کلاینت‌ها (اینترفیس خروجی را با ip route پیدا کن)
PostUp   = iptables -t nat -A POSTROUTING -o enp3s0 -j MASQUERADE; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o enp3s0 -j MASQUERADE; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT

[Peer]
# laptop
PublicKey  = <PUBLIC_KEY_CLIENT>
AllowedIPs = 10.8.0.2/32

enp3s0 را با اینترفیس خروجی سرور جایگزین کن: ip route show default.

کانفیگ کلاینت

فایل /etc/wireguard/wg0.conf روی کلاینت:

[Interface]
Address = 10.8.0.2/24
PrivateKey = <PRIVATE_KEY_CLIENT>
DNS = 1.1.1.1

[Peer]
PublicKey = <PUBLIC_KEY_SERVER>
Endpoint = 203.0.113.10:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

AllowedIPs = 0.0.0.0/0 یعنی تمام ترافیک از VPN عبور کند (Full tunnel). PersistentKeepalive برای کلاینتی که پشت NAT است مفید است.

فعال‌سازی سرور و کلاینت

کانفیگ‌ها را محدود کن:

sudo chmod 600 /etc/wireguard/wg0.conf

Forwarding روی سرور:

echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system

بالا آوردن تونل (هر دو طرف):

sudo wg-quick up wg0
sudo wg show                          # وضعیت peerها، handshake و ترافیک
sudo systemctl enable wg-quick@wg0    # اجرای خودکار با بوت

فایروال سرور

پورت UDP را باز کن:

sudo ufw allow 51820/udp

تست

ping 10.8.0.1                         # از کلاینت به سرور
curl ifconfig.me                      # باید IP سرور را نشان دهد (اگر Full tunnel باشد)
sudo wg show wg0 latest-handshakes    # زمان آخرین handshake

خاموش کردن

sudo wg-quick down wg0

سطح ۳: پیشرفته — چند کلاینت و کنترل ترافیک

افزودن کلاینت جدید

یک Peer جدید به سرور اضافه کن و IP جدید بده:

[Peer]
# phone
PublicKey  = <PUBLIC_KEY_PHONE>
AllowedIPs = 10.8.0.3/32

بدون ری‌استارت هم می‌شود. این دستور فقط تغییر را روی اینترفیس زنده اعمال می‌کند و در فایل ذخیره نمی‌شود:

sudo wg set wg0 peer <PUBLIC_KEY_PHONE> allowed-ips 10.8.0.3/32

برای اینکه تغییر بعد از ری‌بوت هم بماند، همان بلوک [Peer] را در wg0.conf هم بنویس، و بعد وضعیت فایل و اینترفیس را یکی کن:

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

Split Tunnel: فقط شبکه‌ی داخلی از VPN

به‌جای 0.0.0.0/0 فقط زیرشبکه‌ی سرور را بده:

AllowedIPs = 10.8.0.0/24, 192.168.50.0/24

ترافیک بقیه مستقیم از اینترنت می‌رود.

دسترسی به شبکه‌ی خانه از راه دور (Site-to-site ساده)

اگر سرور VPN در خانه پشت NAT باشد: پورت UDP را در مودم فوروارد کن و Endpoint را به IP عمومی خانه یا DDNS بده.

# در کلاینت
AllowedIPs = 10.8.0.0/24, 192.168.1.0/24

و روی سرور خانگی، PostUp با MASQUERADE برای شبکه‌ی خانه را قرار بده.

Preshared Key (لایه‌ی امنیتی اضافه)

کلید مشترک اضافی برای مقاومت در برابر کوانتوم در آینده:

wg genpsk > psk

در هر دو [Peer] اضافه کن:

PresharedKey = <CONTENT_OF_PSK>

کانفیگ با wg-quick و تنظیم MTU

اگر وب‌سایت‌ها ناقص باز می‌شوند یا کند هستند:

[Interface]
MTU = 1380

مقدار MTU را با تست پیدا کن:

ping -M do -s 1352 -c 3 1.1.1.1      # اگر جواب داد، MTU حداقل 1380 است

کنترل دسترسی با iptables/nftables

فقط کلاینت 10.8.0.2 به دیتابیس دسترسی دارد:

sudo iptables -A FORWARD -i wg0 -s 10.8.0.2 -d 192.168.50.10 -p tcp --dport 5432 -j ACCEPT
sudo iptables -A FORWARD -i wg0 -j DROP

ترتیب قوانین مهم است: قانون DROP عمومی باید بعد از قانون‌های اجازه باشد.

مانیتورینگ

sudo wg show all dump                 # خروجی قابل پردازش
sudo wg show wg0 transfer             # ترافیک ورودی و خروجی هر peer
sudo journalctl -k | grep -i wireguard

عیب‌یابی

علامتعلت احتمالی و راه‌حل
handshake وجود نداردپورت UDP در فایروال یا مودم بسته است؛ Endpoint و کلید عمومی‌ها را بررسی کن
handshake هست ولی اینترنت کار نمی‌کندip_forward فعال نیست یا MASQUERADE اینترفیس اشتباه است
ping کار می‌کند ولی سایت‌ها باز نمی‌شوندMTU را کم کن (مثلاً 1280 تا 1380)
DNS کار نمی‌کندDNS در [Interface] کلاینت را تنظیم کن یا DNS سرور را در Peer routing کن
بعد از ری‌بوت وصل نمی‌شودsystemctl enable wg-quick@wg0 را بزن
کلید اشتباهwg pubkey < privatekey را بگیر و با کلید عمومی طرف مقابل تطبیق بده

تست سریع تونل

sudo wg show                          # آخرین handshake باید چند ثانیه پیش باشد
ip route get 10.8.0.1                 # باید از wg0 عبور کند
traceroute 10.8.0.1

نکات امنیتی WireGuard

  • کلید خصوصی را در گیت، اسکرین‌شات یا چت قرار نده.
  • پورت UDP فقط برای WireGuard باز باشد؛ پورت SSH را جدا محدود کن.
  • به هر دستگاه یک کلید و یک IP جدا بده تا بتوانی هر کدام را جداگانه لغو کنی.
  • اگر کلیدی لو رفت، فوراً آن Peer را از سرور حذف کن و کلید جدید بساز.

ایده‌ای دارید؟ برایمان بگویید

مشاوره و پیشنهاد اولیه رایگان است.

تماس با ما