WIUNIX ACADEMY
آموزش نصب WireGuard و اتصال دو شبکه در اوبونتو و دبیان
دو شبکهٔ داخلی را با دروازههای اختصاصی و WireGuard به هم وصل کنید؛ مسیر برگشت، فایروال محدود و دریافت داده در دو جهت بررسی میشود.
محیطت را انتخاب کنآموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
ویرایش 24 مقدار این آموزش
از اینجا شروع کن
در پایان چه چیزی خواهی داشت؟
اتصال مسیریابیشدهٔ دو LAN با هویت تأییدشده، مجوز محدود سرویس و اثبات دریافت داده در دو جهت.
سیستمعاملها و نسخههای پوششدادهشده
مسیرهای سیستمعامل با مستندات بررسی شدهاند؛ آزمون شبکهٔ جدا از نصب کامل توزیع و آزمایش اینترنت واقعی تفکیک میشود.
قبل از شروع
- دو دروازهٔ تازه با LAN/WAN تنظیمشده، مدیریت IPv4 و کنسول مستقل؛ بدون VPN یا فایروال قبلی.
- شبکههای LAN بدون همپوشانی و اختیار مسیر پایدار روترها و سیاست میزبانهای آزمایش.
- آدرسهای UDP قابلدسترسی و هویت عمومی تأییدشدهٔ دو همتا.
دو شعبه و روترهای واقعی آنها
در A شبکهٔ داخلی 10.10.10.0/24، روتر اصلی 10.10.10.1، دروازهٔ VPN برابر 10.10.10.2 و میزبان آزمایش 10.10.10.100 است؛ رابط اینترنت ens18 و رابط داخلی ens19 هستند. در B شبکهٔ 10.20.20.0/24، روتر 10.20.20.1، دروازهٔ 10.20.20.2، میزبان 10.20.20.100 و رابطهای ens18 و ens19 قرار دارند. آدرسها و رابطها از قبل با مدیر شبکهٔ همان سیستم تنظیم شدهاند. تونل wg0 در A آدرس 10.255.255.1/30 و در B آدرس 10.255.255.2/30 دارد. آدرس عمومی دو طرف 198.51.100.10 و 203.0.113.20 با UDP 51820 است. مقدار اولیهٔ عمومی و مدیریت نمونهٔ مستنداتی است؛ مقادیر واقعی و قابلدسترسی را در فرم تنظیم کنید. شبکههای LAN، تونل و مدیریت نباید همپوشانی داشته باشند.
مسیریابی، هویت همتا و مجوز عبور
ابتدا جدول لینوکس بسته را به wg0 میرساند. سپس AllowedIPs همتای مناسب مقصد را مشخص میکند و در دریافت نیز آدرس مبدأ داخل بسته را به هویت همان همتا محدود میکند. در A فقط آدرس تونل و شبکهٔ B نوشته میشود و برعکس. مجوز سرویس همچنان وظیفهٔ فایروال است. اینجا ICMP بین دو شبکه و TCP 8080 فقط بین دو میزبان .100 در دو جهت مجاز است. مسیر اینترنت و DNS کاربران عوض نمیشود؛ NAT، پل شبکه و تونل IPv6 نداریم. مبدأ اصلی LAN حفظ میشود و برای حفاظت پس از خروج از دروازه، TLS و احراز هویت خود سرویس لازم است.
دروازهٔ تازه و مدیریت مستقل
دو دروازهٔ تازه با systemd، کنسول مستقلِ آزمایششده و مسیر SSH بر پایهٔ IPv4 لازم است. این روش روی روتر تولید، میزبان Docker، VPN موجود یا سیستمی با UFW/firewalld و قوانین قبلی اجرا نشود. نشست SSH فعلی باز بماند و بعد از فعالسازی فایروال، نشست دوم امتحان شود. شبکهٔ مدیریت 192.0.2.0/24 و پورت22 نمونهاند؛ مبدأ واقعی از دید هر دروازه و پورت خودتان جایگزین شوند. مجوز UDP در فایروال ابری هم جدا لازم است. این اتصال واحد IPv4، راهکار HA یا تضمین سرویس بیوقفه نیست.
چه چیزی واقعاً آزمایش شده است؟
بررسی در۲۰۲۶-۱۰-۲۰ انجام شد. آزمایش یکمیزبانی با کرنل6.8 و ابزار توزیع1.0.20210914، دو دروازه و دو روتر عادی و دو میزبان LAN را در شش فضای شبکهٔ جدا اجرا کرد.۲۴بررسی شامل دستدهی واقعی، دادهٔ دقیق دوطرفه با حفظ مبدأ، رد پورت و مبدأ غیرمجاز، شکست مسیر برگشت و AllowedIPs نادرست، MTU، برقراری اتصال از فایل بازیابیشده و توقف محدود بود. پنلهای پشتیبان و بازیابی نیز فقط با جایگزینی مسیر امن آزمایش اجرا شدند و همهٔ پردازهها متوقف شدند. این نتیجه آزمون اینترنت یا NAT واقعی، شعبهٔ فیزیکی، بوت کامل systemd، فایروال ارائهدهنده، SSH تولید یا نصب همهٔ نسخهها نیست. مسیرهای انتخابی سیستمعامل همچنان مستندمحورند.
قدم بعدی
بررسی A و B پیش از تغییر
با حساب مدیر فعلی و Bash روی هر دو دروازه، نسخه، رابطها، مسیرها و مبدأ مدیریت بررسی شوند. آدرسها باید از قبل با ابزار همان سیستم تنظیم شده باشند. کلید یا تنظیمات قبلی و کار مسیریابی موجود، ادامه را متوقف میکند. پوشهٔ ناموجود و سرویس غیرفعال برای میزبان تازه طبیعی است. اگر nft نصب نیست، جدول قوانین پس از نصب بررسی شود.
. /etc/os-release
printf '%s %s\n' "$ID" "$VERSION_ID"
uname -r
ip -br address
ip -4 route show table all
ip rule show
printf 'SSH source/session: %s\n' "${SSH_CONNECTION:-console}"
sudo ss -lunpt
sudo sysctl net.ipv4.ip_forward
sudo find /etc/wireguard -maxdepth 1 -type f -print 2>/dev/null
systemctl is-active ufw firewalld nftables
نسخه و آدرسها درستاند و سرویس یا سیاست قبلی جایگزین نمیشود.
قدم بعدی
نصب از مخزن همان نسخهٔ سیستم
بستهها روی هر دو دروازه از مخزن امضاشدهٔ همان نسخه نصب شوند. ابزار کاربری و ماژول کرنل دو جزء جدا هستند؛ روی کرنل استاندارد نسخههای بررسیشده مخزن بیگانه و DKMS لازم نیست. خطای مجوز کانتینر محدود با تغییر کرنل تولید حل نشود. میزبانهای آزمایش هم به curl و python3 توزیع خود نیاز دارند.
sudo apt-get update
sudo apt-get install wireguard-tools nftables iproute2 iputils-ping curl python3 nano
wg --version
dpkg-query -W wireguard-tools nftables
sudo nft list ruleset
ابزار حاضر و جدول قوانین خالی است؛ در صورت وجود قوانین یا مدیر دیگر، روش متوقف و ادغام به مالک آن سپرده شود.
قدم بعدی
ثبت مقدار اولیهٔ forwarding
پس از بررسی تازگی میزبان، مقدار اولیه ذخیره میشود و فایل قبلی بازنویسی نمیشود. تغییر forwarding بعضی پیشفرضهای IPv4 را به حالت روتر میبرد؛ مقایسهٔ قبل و بعد برای تنظیمات اختصاصی لازم است. این روش میزبان تازه با پیشفرض توزیع را فرض میکند.
sudo bash -eu <<'BASELINE'
umask 077
install -d -m 0700 /etc/wireguard
for p in /etc/wireguard/private.key /etc/wireguard/wg0.conf /etc/wireguard/forwarding.before /etc/sysctl.d/70-academy-wireguard.conf /etc/systemd/system/academy-wg-filter.service; do
if test -e "$p"; then echo 'Existing tutorial state: STOP' >&2; exit 1; fi
done
rules=$(nft list ruleset)
if test -n "$rules"; then echo 'Existing ruleset: STOP' >&2; exit 1; fi
sysctl -n net.ipv4.ip_forward > /etc/wireguard/forwarding.before
sysctl -a 2>/dev/null > /etc/wireguard/sysctl.before
BASELINE
مقدار اولیه و فهرست تنظیمات در پوشهٔ محدود به root ذخیرهاند.
قدم بعدی
ساخت کلید محلی و تبادل فقط کلید عمومی
هر دروازه جفتکلید خودش را میسازد. ضبط ترمینال و shell tracing خاموش باشند و کلید خصوصی وارد آرگومان، لاگ، Git یا تیکت نشود. این نمونه PSK اختیاری ندارد؛ در صورت نیاز سازمان، آن راز مستقل و محافظتشده مدیریت شود. کلید عمومی مبادلهشده باید در کانال معتبر به هویت طرف مقابل تطبیق داده شود.
sudo bash -eu <<'KEYS'
umask 077
test ! -e /etc/wireguard/private.key
test ! -e /etc/wireguard/public.key
wg genkey > /etc/wireguard/private.key
wg pubkey < /etc/wireguard/private.key > /etc/wireguard/public.key
chmod 0600 /etc/wireguard/private.key /etc/wireguard/public.key
KEYS
sudo cat /etc/wireguard/public.key
کلیدهای A و B متفاوتاند و فقط کلید عمومی چاپ میشود.
قدم بعدی
آمادهسازی قالب امن هر شعبه
روی هر دروازه فقط محتوای فایل همان شعبه از پنل بعدی ذخیره شود. کلید عمومی همتا و آدرس عمومی واقعی جایگزین شوند؛ نشانگر کلید خصوصی محلی فعلاً باقی بماند تا مرحلهٔ درج امن. کلید خصوصی طرف مقابل هرگز کپی نشود.
sudo install -o root -g root -m 0600 /dev/null /etc/wireguard/wg0.conf
sudo nano /etc/wireguard/wg0.conf
فایل امن، قالب همین شعبه و هویت عمومی طرف مقابل را دارد.
محتوای wg0.conf در A
محتوای فایل، فقط روی A؛ بخش Peer متعلق به B است و شبکهٔ محلی A در AllowedIPs آن قرار نمیگیرد. SaveConfig و تنظیم DNS یا مسیر پیشفرض نداریم.
[Interface]
Address = 10.255.255.1/30
ListenPort = 51820
PrivateKey = REPLACE_LOCAL_PRIVATE_KEY
[Peer]
PublicKey = REPLACE_B_PUBLIC_KEY
Endpoint = 203.0.113.20:51820
AllowedIPs = 10.255.255.2/32, 10.20.20.0/24
محتوای wg0.conf در B
محتوای فایل، فقط روی B؛ هویت عمومی و شبکههای A اینجا قرار میگیرند. در طرح پایه آدرس عمومی دو سمت ثابت و قابلدسترسی است.
[Interface]
Address = 10.255.255.2/30
ListenPort = 51820
PrivateKey = REPLACE_LOCAL_PRIVATE_KEY
[Peer]
PublicKey = REPLACE_A_PUBLIC_KEY
Endpoint = 198.51.100.10:51820
AllowedIPs = 10.255.255.1/32, 10.10.10.0/24
قدم بعدی
درج کلید خصوصی بدون نمایش
پس از اصلاح موارد عمومی روی A و B اجرا شود. نشانگر ناقص یا تکراری و مشخصات همتای جایگزیننشده باعث توقف میشود. خروجی showconf، dump، فایل تکمیلشده یا عکس ویرایشگر منتشر نشود؛ ممکن است راز داشته باشد.
sudo python3 - <<'CONFIG'
import os
from pathlib import Path
p = Path('/etc/wireguard/wg0.conf')
s = p.read_text()
marker = 'REPLACE_LOCAL_PRIVATE_KEY'
if s.count(marker) != 1 or 'REPLACE_' in s.replace(marker, ''):
raise SystemExit('Unedited or duplicate placeholders: STOP')
k = Path('/etc/wireguard/private.key').read_text().strip()
if len(k) != 44:
raise SystemExit('Invalid local key length: STOP')
p.write_text(s.replace(marker, k))
os.chmod(p, 0o600)
print('Local key inserted; configuration not displayed')
CONFIG
فقط پیام پایان دیده میشود و کلید خصوصی در فایل امن باقی است.