WireGuard PersistentKeepalive: نگاشت NAT را زنده نگه دارید
اگر اتصال معکوس فقط بلافاصله پس از ارسال ترافیک توسط همتا کار کند، نگاشت در حال انقضا است. keepalive را پشت روتر تنظیم کنید و سپس مهلت واقعی را بخوانید.
جعبه خانه تونل را باز میکند و بدون مشکل به سرور ابری میرسد. سرور ابری میتواند یک یا دو دقیقه پس از آخرین ارسال جعبه خانه به برنامه خانه برسد، و سپس متوقف میشود. هیچ چیز در گزارش WireGuard ظاهر نمیشود، هیچ خطای دستدهی گزارش نمیشود، و راهاندازی مجدد تونل آن را برای مدت کوتاهی درست میکند. این الگو یک نگاشت در حال انقضا است، نه یک تونل خراب، و راهنمای زیر قبل از تغییر هر چیزی آن را تأیید میکند.
تأیید کنید که الگو انقضای نگاشت در حالت بیکاری است
جزئیات متمایزکننده زمانبندی است. اگر اتصال معکوس بلافاصله پس از ارسال ترافیک توسط همتای خانه کار کند و پس از یک بازه آرام شکست بخورد، مسیر سالم است و وضعیت میانی نه. اگر هرگز کار نکرد، حتی بلافاصله پس از ترافیک، این تشخیص اشتباه است.
sudo wg show wg0 latest-handshakes
sudo wg show wg0 endpoints
sudo wg show wg0 transfer
دو فرمان اول را بلافاصله پس از ارسال چیزی توسط همتای خانه اجرا کنید، پنج دقیقه صبر کنید و دوباره اجرا کنید. مهر زمانی دستدهی که طبق برنامه بدون نقطه پایانی جدید تازه میشود به شما میگوید تونل زنده است. چیزی که تغییر کرده توانایی بستههای ناخواسته برای رسیدن از بیرون است، که ویژگی مسیر است نه تونل.
سپس یک تلاش معکوس انجام دهید و شمارندههای انتقال را تماشا کنید. اگر سمت ابری بایت میفرستد و سمت خانه هیچ دریافت نمیکند، بسته ابر را ترک کرده و در دستگاهی حالتدار در مسیر مرده است. این همان امضایی است که به دنبالش هستید. اگر هر دو شمارنده حرکت کنند، تونل بسته را تحویل داده و مشکوک برنامه است.
keepalive را روی همتای پشت روتر قرار دهید
keepalive های دائمی با ارسال یک بسته کوچک تأییدشده طبق برنامه، نگاشت NAT و هر وضعیت فایروال را زنده نگه میدارند. این تنظیم به دستگاهی که پشت روتر است تعلق دارد، در ورودی آن برای همتای راه دور، زیرا همان سمت است که بسته خروجیاش وضعیت را ایجاد میکند.
[Peer]
PublicKey = <cloud peer public key>
AllowedIPs = 10.71.0.1/32
PersistentKeepalive = 25
آن را در بخش همتای موجود ادغام کنید. افزودن بلوک دوم با همان کلید عمومی روش معتبری برای افزودن گزینهها نیست، و wg-quick آنها را برای شما ادغام نمیکند. 25 ثانیه مستندشده مثالی است که برای قرار گرفتن زیر مهلتهای رایج UDP انتخاب شده، نه مقداری با معنای خاص.
قرار دادن همان دستور در سمت ابری به این مشکل کمکی نمیکند. بستههای آن همتا از قبل از یک نشانی عمومی میآیند، بنابراین در جهت مهم نگاشتی برای حفظ کردن وجود ندارد. ترافیک اضافه میکند و چیزی را تغییر نمیدهد.
زمانسنجها را بخوانید، نه اینکه بازه را حدس بزنید
keepalive ها کار میکنند چون بیشتر از آنکه وضعیت منقضی شود میرسند. این مهلت را عددی میکند که واقعاً به آن نیاز دارید، و در Linux روی دستگاهی که ترجمه را انجام میدهد قابل خواندن است:
sysctl net.netfilter.nf_conntrack_udp_timeout
sysctl net.netfilter.nf_conntrack_udp_timeout_stream
sudo conntrack -L -p udp --dport 51820
مقدار اول مهلت یک جریان UDP است که فقط در یک جهت دیده شده، و دومی پس از مشاهده پاسخها اعمال میشود. هر دو معمولاً کوتاهاند، و نگاشتی که ساکت شود از آنچه برای جریان شما اعمال میشود پیروی میکند.
آن عدد را با بازه خود مقایسه کنید. یک keepalive با 25 ثانیه زیر مهلت 30 ثانیه کار میکند؛ همان keepalive زیر مهلت 15 ثانیه کار نمیکند. هیچ مقدار تلاش مجددی این حساب را تغییر نمیدهد. برخی روترهای مصرفی و اپراتورهای موبایل مقادیر بسیار کوتاهتری از پیشفرض Linux استفاده میکنند، به همین دلیل پیکربندیای که در یک شبکه کار میکند در شبکه دیگر شکست میخورد.
| Observation | What it means | Reasonable response |
|---|---|---|
| Works after traffic, dies when idle | Mapping or firewall state expiring | Lower the keepalive interval |
| Never works, even immediately | No return route, listener or firewall | Stop tuning keepalive |
| Works for hours, then dies once | Carrier-side translation or address change | Check the endpoint and logs together |
شنونده و فایروال را جداگانه بررسی کنید
یک نگاشت زنده لازم است و کافی نیست. برنامه روی جعبه خانه باید روی نشانی درست گوش دهد، و فایروال میزبان باید بسته را پس از رمزگشایی مجاز کند.
sudo ss -lntup | grep 8080
sudo wg show wg0 allowed-ips
curl -sS -m 5 http://10.71.0.2:8080/health
اگر سوکت فقط به نشانی رابط فیزیکی مقید شده باشد و نه به نشانی تونل، بستههایی که روی تونل میرسند پیش از مراجعه به فایروال حذف میشوند. این شکست از سمت ابری دقیقاً مانند یک مشکل نگاشت به نظر میرسد و از هر تنظیم keepalive جان سالم به در میبرد.
بررسی فهرست مجاز در جهت دیگر هم به همان اندازه مهم است. همتای ابری اگر بخواهد پاسخ دهد باید نشانی تونل خانه را به عنوان مبدأ مجاز کند، و همتای خانه باید نشانی ابری را به عنوان مقصد مجاز کند. بستههای keepalive ترافیک تأییدشدهاند و همان قواعد را اعمال میکنند، به همین دلیل keepalive ای که کار میکند میتواند در کنار برنامهای که کار نمیکند وجود داشته باشد.
تغییر را منتشر کنید و محدودیتهایش را بدانید
تنظیم را اعمال کنید، اگر روش بهروزرسانی شماست رابط را راهاندازی مجدد کنید، و سپس آزمون بیکاری را بهجای آزمون فوری تکرار کنید. بیشتر از مهلتی که قبلاً خواندید صبر کنید، یک درخواست معکوس انجام دهید و تأیید کنید که شمارندهها در هر دو طرف حرکت کردهاند.
بازه و مهلت اندازهگیریشده را کنار آن یادداشت کنید. تغییر آینده در میانافزار روتر، یا جابهجایی به اتصال موبایل، میتواند مهلت را تغییر دهد. یادداشت همان چیزی است که به کسی اجازه میدهد مقدار را دوباره استخراج کند نه اینکه آن را کپی کند. دو عدد در یک خط بعداً یک بررسی کامل را صرفهجویی میکند.
keepalive های دائمی از وضعیت محافظت میکنند. آنها پورتی باز نمیکنند، ورودیای به فهرست مجاز اضافه نمیکنند و باعث ظاهر شدن شنونده نمیشوند. وقتی اتصال معکوس اصلاً کار نمیکند، خطا یکی از آن سه است، و شروع سریع WireGuard تنظیم keepalive را با همان اصطلاحات محدود توصیف میکند.