اول حالت شبکه را انتخاب کنید
WSL2 بهطور پیشفرض روی NAT است و توزیع، نشانی بازگشتی ویندوز را به اشتراک نمیگذارد. پس نوشتن 127.0.0.1 داخل WSL هیچوقت به برنامه نمیرسد. بیشتر تلاشهای ناموفق دقیقاً از همینجا میآید.
نسخههای جدیدتر ویندوز ۱۱ از شبکه آینهای پشتیبانی میکنند: در فایل .wslconfig در پوشه کاربر و زیر بخش wsl2 مقدار networkingMode=mirrored را اضافه کنید، WSL را دوباره راهاندازی کنید و بعد 127.0.0.1 مستقیم کار میکند. اگر روی NAT بمانید باید نشانی میزبان ویندوز در زیرشبکه WSL را به کار ببرید و حتماً اجازه شبکه محلی را روشن کنید، وگرنه هسته فقط روی بازگشتی گوش میدهد.
اول به دیوار آتش شک کنید
با روشنکردن اجازه شبکه محلی، ویندوز یک بار پیام دیوار آتش نشان میدهد. اگر رد شده باشد، تمام مراحل بعدی بیسروصدا شکست میخورند.
چهار گام تا اتصال
- 1
اجازه شبکه محلی را روشن کنید
در تنظیمات Clash فعالش کنید. بار اول ویندوز درباره دسترسی دیوار آتش میپرسد؛ دستکم برای شبکههای خصوصی اجازه بدهید.
- 2
در حالت NAT نشانی میزبان را پیدا کنید
داخل WSL دستور ip route show default را اجرا کنید؛ فیلد سوم نشانی میزبان ویندوز است. آن را در https_proxy بگذارید. این نشانی ممکن است با هر بار راهاندازی WSL عوض شود، پس در .bashrc پویا بخوانیدش و ثابت ننویسید.
- 3
تنظیم پراکسی Docker Desktop
در بخش Resources و سپس Proxies نشانی http://host.docker.internal را با پورت خود بنویسید. توجه کنید که این تنظیم فقط دریافت ایمیج و ساخت را پوشش میدهد و برنامههای داخل کانتینر را شامل نمیشود.
- 4
داخل کانتینر
هنگام docker run متغیرهای HTTPS_PROXY و HTTP_PROXY را با -e بدهید، یا در بخش proxies فایل .docker/config.json در پوشه کاربر مقدار پیشفرض بگذارید. همزمان localhost و مخزنهای داخلی را در noProxy قرار دهید.
هر دو طرف را جدا آزمایش کنید
در WSL نشانی ipinfo.io/ip را با curl بگیرید و ببینید نشانی گره برمیگردد یا نه. در سمت Docker یک کانتینر موقت با curl همان نشانی را بگیرد. کارکردن WSL به معنی کارکردن کانتینرها نیست، پس هر دو را جداگانه بیازمایید.
- تنظیم حالت آینهای و NAT قابل تعویض نیست؛ با تغییر حالت نشانی هم عوض میشود
- تغییر .wslconfig تا اجرای wsl --shutdown اعمال نمیشود
- مخزنهای نزدیک را در noProxy بگذارید وگرنه دریافت کندتر میشود
پرسشهای رایج
از TUN استفاده میکنم؛ باز هم باید WSL را تنظیم کنم؟
بستگی به حالت شبکه دارد. در حالت آینهای معمولاً ترافیک درست گرفته میشود. در حالت NAT ترافیک WSL از سوییچ مجازی Hyper-V عبور میکند و ممکن است کلاً از کارت TUN رد شود، پس متغیر محیطی مطمئنتر است.
دیروز کار میکرد و امروز نه.
ببینید نشانی میزبان عوض شده یا نه. در حالت NAT این نشانی میتواند با هر بار راهاندازی WSL تغییر کند، پس مقدار ثابت از کار میافتد. آن را هنگام شروع پوسته بخوانید.