راهنماهای مرتبط
WireGuard به زبان ساده: سازوکار و تاریخچه
بهروزرسانی
WireGuard یک پروتکل VPN متنباز است که Jason A. Donenfeld طراحی کرده؛ حدود سال ۲۰۱۵ عمومی شد و در ۲۰۲۰ رسماً وارد کرنل Linux شد. ویژگیاش را میشود در یک کلمه گفت: کم. کد کم — هستهٔ پیادهسازیاش فقط چند هزار خط است، در حالی که OpenVPN و IPsec صدها هزار خطاند؛ گزینهٔ کم — فقط یک مجموعهٔ ثابت الگوریتم رمزنگاری دارد و انتخابی به شما نمیدهد؛ وضعیت کم — مفهومی به اسم «در حال اتصال» یا «قطعشده» ندارد؛ وقتی داده هست میفرستد و وقتی نیست ساکت است. این کم بودن سرعت، مصرف کم باتری و بازبینی آسان را آورده، و محدودیتهایش را هم: فقط UDP، بدون استتار، و بیاعتنا به اینکه کلیدها چطور پخش میشوند. در ادامه اول میبینیم چطور کار میکند، بعد اینکه چطور قدمبهقدم پایهٔ نسل تازهٔ VPNها شد.
ایدهٔ طراحی: VPN مثل یک کارت شبکه
پیش از WireGuard، گزینههای اصلی IPsec و OpenVPN بودند. IPsec یک خانوادهٔ بزرگ از استانداردهاست با تنظیمات بیشمار، و اتصال تجهیزات سازندههای مختلف به هم دردسری مشهور است؛ OpenVPN در فضای کاربر اجرا میشود و به کتابخانهٔ عظیم TLS تکیه دارد — انعطافپذیر اما کند. حجم کد هر دو آنقدر زیاد است که کمتر کسی میتواند یک بار کاملش را بازبینی کند.
ایدهٔ WireGuard برعکس است: فقط یک کار، و همان را درست انجام دادن. در سیستم به شکل یک کارت شبکهٔ مجازی (مثلاً wg0) ظاهر میشود؛ کلید خصوصی خودتان و کلید عمومی چند طرف مقابل را به این کارت میدهید، هر بستهای که به آن بفرستید رمزگذاریشده بیرون میرود و بستههایی که میرسند رمزگشاییشده از آن بیرون میآیند. باقی کارها — مسیریابی، دیوار آتش، تخصیص آدرس — به ابزارهایی سپرده میشود که از قبل در سیستم هستند.
کارهایی که عمداً نمیکند هم روشن است: الگوریتم را مذاکره نمیکند، با نام کاربری و رمز کاری ندارد، آدرس تخصیص نمیدهد و ترافیک را استتار نمیکند. اینها یا سرچشمهٔ آسیبپذیری شمرده شدهاند، یا به ابزارهای لایهٔ بالاتر واگذار شدهاند.
مسیریابی با کلید: کلید عمومی همان هویت است
در WireGuard هر دستگاه یک جفت کلید دارد و کلید عمومی هویت آن است، شبیه کاری که در SSH میکنیم: دو طرف کلید عمومی همدیگر را در پیکربندی خودشان مینویسند و اعتماد برقرار میشود؛ نه گواهی در کار است، نه نام کاربری و رمز.
در پیکربندی برای هر طرف مقابل یک خط «آدرسهای مجاز» (AllowedIPs) نوشته میشود که هر دو جهت را کنترل میکند: هنگام ارسال، نشانی مقصد در محدودهٔ مجاز هر کس باشد، بسته با کلید عمومی همان طرف رمز میشود و برای او فرستاده میشود؛ هنگام دریافت، بعد از رمزگشایی بررسی میشود که نشانی مبدأ در محدودهٔ مجاز این طرف هست یا نه، و اگر نبود بسته دور ریخته میشود. به این روش مسیریابی با کلید (cryptokey routing) میگویند — جدول مسیریابی و کنترل دسترسی در یک جدول ادغام شدهاند.
پس اگر آدرس مجاز یک طرف را 0.0.0.0/0 بنویسید، یعنی «همهٔ ترافیک را به او بده» — همان چیزی که معمولاً VPN سراسری مینامیم؛ اگر فقط یک بازهٔ شبکهٔ داخلی بنویسید، فقط دسترسی به همان بازه از تونل میرود.
دستدادن و رمزنگاری: یک مجموعهٔ ثابت الگوریتم
دو دستگاه پیش از اولین ارتباط باید دست بدهند (handshake): آغازگر یک بسته میفرستد و پاسخدهنده یک بسته برمیگرداند؛ با همین یک رفتوبرگشت کار تمام است و دو طرف یک دسته کلید نشست میگیرند که فقط برای همین مدت به کار میرود. دستدادن بر پایهٔ چارچوب پروتکل Noise است: با کلیدهای بلندمدت دو طرف همدیگر را احراز هویت میکنند و با کلیدهای موقت محرمانگی پیشرو (forward secrecy) تضمین میشود — حتی اگر بعدها کلید خصوصی بلندمدت لو برود، ترافیکی که قبلاً ضبط شده باز نمیشود.
کلیدهای نشست هر چند دقیقه یک بار خودکار عوض میشوند؛ کل این روند از چشم کاربر پنهان است و چیزی به اسم «اتصال دوباره» در کار نیست.
الگوریتمها ثابتاند: تبادل کلید با Curve25519، رمزگذاری داده با ChaCha20-Poly1305 و درهمسازی با BLAKE2s. مذاکرهای در کار نیست و بنابراین حملهٔ تنزل (downgrade) هم نیست — مهاجم نمیتواند دو طرف را به استفاده از الگوریتم ضعیفتر بکشاند. اگر روزی یکی از این الگوریتمها شکسته شود، راهحل انتشار نسخهٔ تازهای از پروتکل و جایگزینی کامل است، نه افزودن یک گزینه.
علاوه بر این میشود یک کلید از پیش مشترک (pre-shared key) هم اضافه کرد که روی سازوکار کلید عمومی مینشیند؛ هدفش آمادگی در برابر تهدید آیندهٔ رایانههای کوانتومی برای الگوریتمهای کلید عمومی است.
فقط UDP، بیجواب به غریبهها، بدون قطعی هنگام عوض کردن شبکه
- فقط UDP: WireGuard هر بسته را جداگانه رمز میکند و درون یک بستهٔ UDP میفرستد. استفاده نکردن از TCP عمدی است — اگر TCP درون TCP اجرا شود، هر دو لایه بستههای گمشده را دوباره میفرستند و هنگام از دست رفتن بسته همدیگر را کند میکنند.
- بیجواب به غریبهها: به هیچ بستهای که احراز هویت نشده پاسخ نمیدهد. برای کسی که پورتها را اسکن میکند، این پورت بسته به نظر میرسد و راهی ندارد بفهمد WireGuard رویش اجرا میشود.
- جابهجایی (roaming): WireGuard «اتصال» را نمیشناسد، فقط کلید عمومی را. اگر آدرس طرف مقابل عوض شود — مثلاً گوشی از وایفای به اینترنت همراه برود — کافی است بستهٔ بعدیاش احراز هویت شود تا این طرف پاسخها را خودکار به آدرس تازه بفرستد. برای همین تونل هنگام عوض کردن شبکه قطع نمیشود.
- ساکت: وقتی دادهای برای فرستادن نیست، تونل هیچ ترافیکی تولید نمیکند و همین روی گوشی باتری را خیلی کم مصرف میکند. فقط وقتی دستگاه پشت یک روتر است و باید همیشه برای طرف مقابل در دسترس باشد، باید «زنده نگه داشتن دورهای» (PersistentKeepalive) را روشن کنید تا هر چند ده ثانیه یک بستهٔ کوچک بفرستد و نگاشت روی روتر را زنده نگه دارد.
چرا سریع است
- در کرنل اجرا میشود: WireGuard روی Linux یک ماژول کرنل است و بستهها لازم نیست بین کرنل و برنامهٔ کاربر رفتوبرگشت کپی شوند؛ OpenVPN بهطور سنتی در فضای کاربر اجرا میشود و هر بسته یک دور اضافه میزند.
- الگوریتمها برای هر CPU مناسباند: ChaCha20 به دستورهای شتابدهندهٔ سختافزاری خاصی وابسته نیست و روی تراشههایی که دستور AES ندارند، مثل گوشی و روتر، بهویژه جلو میافتد.
- دستدادن کوتاه: با یک رفتوبرگشت میشود داده فرستاد و برقراری اتصال تقریباً انتظاری ندارد.
- کد کم: مسیر کوتاه است و هر بهینهسازی ممکن روی همان چند قدم کلیدی انجام شده.
- دقت کنید که اینها دربارهٔ سربار خود پروتکل و پیادهسازی است. سرعت واقعی روی خطوط برونمرزی بیشتر به میزان گم شدن بستهها روی خط و برخورد اپراتور با UDP بستگی دارد.
تاریخچه: از پروژهٔ یک نفر تا ورود به کرنل
- حدود ۲۰۱۵: Jason A. Donenfeld توسعهٔ WireGuard را شروع کرد و آن را عمومی کرد؛ در ابتدا یک ماژول کرنل مستقل روی Linux بود.
- ۲۰۱۷: مقالهٔ شرح طراحیاش در همایش امنیت شبکهٔ NDSS منتشر شد و پروتکل پس از آن چندین راستیآزمایی صوری (formal verification) مستقل را گذراند. در همان حدود، سرویسدهندههای VPN مثل Mullvad اتصال WireGuard را ارائه کردند.
- ۲۰۱۸: Linus Torvalds، بنیانگذار Linux، در فهرست پستی از کد آن تعریف کرد و گفت در مقایسه با OpenVPN و IPsec یک اثر هنری است؛ همین جمله آن را میان برنامهنویسها مشهور کرد.
- ۲۰۱۹: Cloudflare پیادهسازی فضای کاربر BoringTun را به زبان Rust منتشر کرد و WireGuard را در WARP به کار برد؛ NordVPN سرویس NordLynx را بر پایهٔ WireGuard عرضه کرد؛ Tailscale هم در همین دوره با WireGuard بهعنوان لایهٔ داده شروع به کار کرد.
- مارس ۲۰۲۰: WireGuard همراه با Linux 5.6 رسماً در شاخهٔ اصلی کرنل ادغام شد و نسخهٔ 1.0 منتشر شد. از آن به بعد توزیعهای اصلی Linux آن را بهصورت پیشفرض دارند و نصب ماژول جداگانه لازم نیست. در همان سال OpenBSD هم آن را به کرنل خود افزود.
- ۲۰۲۱: پیادهسازی سطح کرنل WireGuardNT برای Windows عرضه شد که کاراییاش بهمراتب بیشتر از پیادهسازی قبلی در فضای کاربر است؛ FreeBSD هم پس از آن پیادهسازی کرنلی پیدا کرد.
- امروز: Windows، macOS، Linux، iOS و اندروید همه کلاینت رسمی دارند، سیستمهای روتر و NAS مثل OpenWrt و Synology عموماً پشتیبانی داخلی دارند و بیشتر VPNهای تجاری آن را پروتکل پیشفرض یا اختیاری قرار دادهاند.
کارهایی که نمیکند و محدودیتهایی که از آن میآید
- پخش کلید با او نیست: با هر دستگاه تازه باید کلید عمومیاش را در پیکربندی دستگاههای دیگر نوشت. وقتی دستگاهها زیاد شوند مدیریتش از دست میرود، و دلیل وجود ابزارهایی مثل Tailscale دقیقاً همین است.
- آدرس را پویا تخصیص نمیدهد: آدرس داخلی هر طرف در پیکربندی ثابت نوشته شده و سازوکاری مثل OpenVPN که «بعد از اتصال یک آدرس بدهد» ندارد. VPNهای تجاری که از آن استفاده میکنند باید یک لایهٔ دیگر بیرونش بسازند.
- ملاحظات حریم خصوصی: سرور باید آخرین آدرس عمومی هر طرف را به خاطر بسپارد تا بتواند پاسخ بدهد. سرویسدهندههای VPN که ادعای «بدون لاگ» دارند معمولاً کار اضافهای میکنند (مثلاً پاک کردن دورهای یا ترجمهٔ دوگانهٔ آدرس).
- فقط UDP: در شبکههایی که UDP را مسدود یا محدود میکنند وصل نمیشود یا خیلی کند است. برای اینکه از TCP یا پورت 443 برود، تنها راه پیچیدن یک ابزار دیگر دور آن است.
- بدون استتار: قالب و طول بستههای دستدادن و داده ویژگیهای ثابتی دارند و بهراحتی شناسایی میشوند. هدف طراحیاش امنیت و سادگی بوده، نه مقاومت در برابر سانسور.
- بدون سیستم حساب کاربری: در پروتکل مفهومی مثل نام کاربری، رمز یا تاریخ انقضا نیست؛ فقط کلید عمومی را میشناسد.
مقایسه با OpenVPN و IPsec
- حجم کد: هستهٔ WireGuard چند هزار خط؛ OpenVPN همراه با کتابخانهٔ TLS که به آن وابسته است، و پیادهسازیهای گوناگون IPsec، در حد صدها هزار خطاند.
- انتقال: WireGuard فقط UDP؛ OpenVPN هر دو را دارد و میتواند روی TCP 443 در میان پورت ترافیک HTTPS برود؛ IPsec شمارهٔ پروتکل خودش و UDP 500 / 4500 را به کار میبرد.
- پیکربندی: WireGuard برای هر طرف چند خط؛ فایل پیکربندی OpenVPN گزینههای زیادی دارد اما انعطافپذیر است؛ IPsec از همه پیچیدهتر است.
- کارایی: روی شبکهٔ تمیز WireGuard معمولاً سریعترین و کممصرفترین است؛ OpenVPN در نسخههای تازه شتاب کرنلی (DCO) هم پیدا کرده و فاصله در حال کم شدن است.
- امکانات: احراز هویت با نام کاربری و رمز، فرستادن پویای آدرس و مسیر، و رفتن از TCP را OpenVPN خودش دارد؛ WireGuard برای همهٔ اینها به سیستمهای بیرونی متکی است.
- پشتیبانی دستگاهها: OpenVPN سابقهٔ طولانی دارد و تقریباً همهٔ روترهای قدیمی، NASها و دستگاههای نهفته آن را میشناسند؛ WireGuard در سیستمهای چند سال اخیر همهگیر شده اما روی دستگاههای قدیمی شاید نباشد.
چیزهایی که روی WireGuard ساخته شدهاند
- Tailscale: ورود، پخش کلید، عبور از NAT و رله را روی WireGuard اضافه کرده و آن را به شبکهسازی خودکار تبدیل کرده است؛ «Tailscale به زبان ساده» را ببینید. Headscale پیادهسازی متنباز سرور کنترل آن است.
- Netmaker، NetBird، Firezone و مانند آنها: محصولات شبکهسازی یا اعتماد صفر (zero trust) که آنها هم «WireGuard را لایهٔ داده و مدیریت را کار خودشان» قرار دادهاند.
- Cloudflare WARP: یک کلاینت WireGuard برای کاربران عادی که ترافیک را وارد شبکهٔ Cloudflare میکند.
- بستهبندیهای اختصاصی VPNهای تجاری: مثل NordLynx که یک لایهٔ تخصیص آدرس و حفظ حریم خصوصی روی WireGuard اضافه میکند.
- نسخههای تغییریافته مثل AmneziaWG: سرآیند بسته و پرکنندهها را تغییر میدهند تا ویژگیهای ثابت WireGuard پنهان شود، برای شبکههایی با بازرسی سختگیرانه؛ اینها با کلاینت استاندارد WireGuard سازگار نیستند.
روی شبکههای داخل چین
- اینکه کار کند یا نه، اول به UDP بستگی دارد: بسیاری از اینترنتهای خانگی و همراه در چین UDP پرحجم را محدود میکنند؛ نتیجهاش این است که اول سریع وصل میشود، بعد از مدتی کند میشود، یا در ساعت اوج شب آشکارا گیر میکند.
- اتصال مستقیم برونمرزی بهراحتی شناسایی میشود: بستهٔ دستدادن WireGuard ویژگی ثابتی دارد و روی خطوط برونمرزی ممکن است شناسایی و مختل شود؛ نشانهاش این است که دستدادن انجام نمیشود یا بعد از مدتی جریان داده قطع میشود. این نتیجهٔ مستقیم استتار نداشتن پروتکل است.
- شبکهسازی بین دستگاههای داخل چین (اداره و خانه، گوشی و NAS) از خطوط برونمرزی نمیگذرد و معمولاً این مشکل را ندارد؛ فقط محدودیت UDP و موفقیت عبور از NAT رویش اثر میگذارد.
- پس برای شبکهسازی و دسترسی از راه دور مناسبتر است؛ برای اتصال برونمرزی پایدار و درازمدت باید روشی کنارش باشد که استتار دارد یا از TCP / TLS میرود. مقایسهٔ پروتکلها را در «مقایسهٔ پروتکلهای VPN» ببینید.
LeoTun کجا از WireGuard استفاده میکند
بخش «خصوصی» LeoTun از Tailscale استفاده میکند و لایهٔ دادهاش همان WireGuard است: تونل بین دستگاهها و تونل به گرههای خروجی منطقههای مختلف را WireGuard رمز میکند و میبرد. لازم نیست خودتان کلید بسازید یا پیکربندی بنویسید؛ بعد از ورود با حساب همین سایت، کلاینت خودش انجام میدهد. طرز استفاده را در ««خصوصی» (Tailscale) چیست» ببینید؛ ورودیاش صفحهٔ «خصوصی» است.
غیر از «خصوصی»، همان حساب روشهایی دارد که به UDP وابسته نیستند: Cisco (AnyConnect) روی TLS کار میکند، OpenVPN میتواند از TCP برود، و Hiddify (با پروتکل Hysteria2) مخصوص مقابله با گم شدن بستههاست. اگر روی شبکهٔ شما «خصوصی» کند و ناپایدار است، کافی است روش را عوض کنید؛ «کدام روش اتصال برای چه موقعیتی» را ببینید.
FAQ
WireGuard بهتر است یا OpenVPN؟
روی شبکهٔ تمیزی که UDP را محدود نمیکند، WireGuard سریعتر و کممصرفتر است و با عوض کردن شبکه قطع نمیشود؛ وقتی باید از TCP رفت، ورود با نام کاربری و رمز لازم است یا دستگاه قدیمی است، OpenVPN مناسبتر است. هر دو پروتکل متنباز و سالها آزمودهاند و از نظر امنیت قابل اعتمادند.
WireGuard امن است؟
از مجموعهای الگوریتم مدرن و محافظهکارانه استفاده میکند، پروتکلش راستیآزمایی صوری شده و کد کمش بازبینی را آسان میکند؛ تا امروز روش عملی شناختهشدهای برای شکستنش نیست. دقت کنید که نگهداری و پخش کلید با او نیست: اگر کلید خصوصی لو برود یا کلید عمومی را برای طرف اشتباهی تنظیم کنید، خود پروتکل کمکی نمیکند.
چرا WireGuard فقط UDP را پشتیبانی میکند؟
یک انتخاب طراحی است. اگر TCP درون یک اتصال TCP اجرا شود، هنگام گم شدن بسته هر دو لایه همزمان دوباره میفرستند و کارایی بهشدت افت میکند؛ ضمن اینکه UDP پیادهسازی «بیجواب به غریبهها» و جابهجایی را آسان میکند. بهایش این است که در شبکههایی که UDP را میبندند کار نمیکند.
WireGuard در چین کار میکند؟
شبکهسازی بین دستگاههای داخل چین معمولاً بله. اتصال مستقیم برونمرزی ناپایدار است: ترافیکش استتار ندارد و بهراحتی شناسایی و مختل میشود، و بعضی خطوط هم UDP را محدود میکنند. برای اتصال برونمرزی پایدار باید روشی کنارش باشد که استتار دارد یا از TLS میرود.
WireGuard را چه کسی ساخت و کی وارد کرنل Linux شد؟
Jason A. Donenfeld آن را طراحی و توسعه داد و حدود ۲۰۱۵ عمومی شد؛ در مارس ۲۰۲۰ همراه با Linux 5.6 در شاخهٔ اصلی کرنل ادغام شد و نسخهٔ 1.0 منتشر شد.
Tailscale همان WireGuard است؟
یک چیز نیستند. WireGuard پروتکل تونل رمزگذاریشده است؛ Tailscale یک سیستم شبکهسازی است که برای انتقال داده از WireGuard استفاده میکند و ورود، پخش کلید، عبور از NAT و رله را هم حل کرده است. جزئیات را در «Tailscale به زبان ساده» ببینید.
برای استفاده از WireGuard باید خودم کلید تنظیم کنم؟
اگر مستقیم از WireGuard استفاده کنید بله: برای هر دستگاه کلید بسازید و کلید عمومی، آدرس و آدرس طرف مقابل را در پیکربندی بنویسید. وقتی از راه کلاینت Tailscale یا یک VPN تجاری استفاده میکنید، نرمافزار این کارها را انجام میدهد. در «خصوصی» LeoTun کافی است با حسابتان وارد شوید.