câu trả lời ngắn cho WSL1:
Định cấu hình quy tắc tường lửa của bạn một lần và mọi thứ sẽ "hoạt động". Đây là phương pháp dễ nhất.
câu trả lời ngắn cho WSL2:
Khi bạn đã cấu hình mọi thứ đúng cách, bạn có thể bắt đầu chuyển tiếp cổng rất dễ dàng bằng một lệnh duy nhất từ Ubuntu/WSL2:
ssh -f -N -R 8080:localhost:8080 "$(hostname).local"
Chi tiết về cách cấu hình ở bên dưới. Nó không nhất thiết phải dễ dàng, nhưng tất cả chỉ là thiết lập một lần.
(Nhiều) chi tiết hơn:
Như Steeldriver đã lưu ý trong các nhận xét, WSL1 và WSL2 hoạt động khác nhau ở đây.
Lưu ý bên lề chỉ để làm rõ thuật ngữ (vì nó hơi khác trong các nhận xét): "WSL" đề cập đến chính hệ thống con kiểm soát cả hai phiên bản -- WSL1 và WSL2.
Lưu ý bên lề 2. Xin đừng để độ dài của bài đăng này làm bạn sợ hãi. Tôi chỉ rất chi tiết. Cân nhắc việc vấn đề Github liên quan lên đến (hiện tại) 536 bình luận, tôi nghĩ rằng tôi khá ngắn gọn khi so sánh ;-).
WSL1
WSL1 chắc chắn là trường hợp sử dụng dễ dàng hơn. Vì nó là một "lớp dịch thuật" giữa các tòa nhà chọc trời của Linux và nhân Windows, nên nó thực sự sử dụng (các) giao diện mạng Windows "thực". Vì lý do này, bạn có thể kết nối trực tiếp từ một thiết bị khác trên mạng với một cổng trong WSL1.
bạn có khả năng làm Tuy nhiên, vẫn cần một quy tắc tường lửa. Tôi sẽ trình bày điều đó trong câu trả lời WSL2, vì nó phổ biến cho cả hai. xem Quy tắc tường lửa mạng mới
lệnh trong phần WSL2. Chỉ cần chạy một lệnh đó (một lần) cho quy tắc tường lửa.
Tuy nhiên, nếu ứng dụng web của bạn không yêu cầu WSL2 (và hầu hết không phải), việc chạy nó từ phiên bản WSL1 thường dễ dàng hơn nhiều (hoặc ít nhất là nó đã từng như vậy). Đó là những gì hầu hết mọi người kết thúc làm. Mặt khác, với phương pháp WSL2/SSH mới (ít nhất là đối với tôi) mà tôi đề xuất bên dưới, việc thực hiện điều này trong WSL2 gần như không khó khăn như trước đây. Tôi sẽ để bạn chọn con đường nào. Tại thời điểm này, tôi coi một trong hai đều có giá trị như nhau.
Nếu bạn chọn sử dụng WSL1, tôi khuyên bạn nên giữ hai phiên bản Ubuntu -- Một với WSL1 và một với WSL2. Đó là những gì tôi làm.
Để sao chép phiên bản WSL2 hiện có của bạn sang WSL1 mới, hãy thoát khỏi phiên bản hiện có và từ PowerShell:
# Điều chỉnh đường dẫn cơ sở như mong muốn
$WSL_ROOT = "$env:USERPROFILE\WSL"
$WSL_IMAGE_NAME = "$(get-date -UFormat `"%Y-%m-%d`") Ubuntu Backup.tar"
mkdir -p "$WSL_ROOT\hình ảnh"
mkdir -p "$WSL_ROOT\instance\Ubuntu_WSL1"
cd $WSL_ROOT
wsl -l -v
# Xác nhận tên phân phối - Nếu không phải là "Ubuntu", hãy điều chỉnh dòng sau nếu cần
wsl --export Ubuntu "$WSL_ROOT\images\$WSL_IMAGE_NAME"
wsl --import Ubuntu_WSL1 .\instances\Ubuntu_WSL1\ .\images\$WSL_IMAGE_NAME --version 1
wsl ~ -d Ubuntu_WSL1
Tại thời điểm này, bạn sẽ ở phiên bản Ubuntu WSL1, nhưng bạn sẽ là người chủ, vì WSL không "nhớ" tên người dùng mặc định cho --nhập khẩu
'd trường hợp. Làm theo "Phương pháp 1" của tôi từ câu trả lời này để đặt tên người dùng mặc định của bạn.
Tại thời điểm này, bạn có hai phiên bản WSL Ubuntu, một phiên bản dành cho WSL1 (Ubuntu_WSL1
) và một cái khác cho WSL2 (có thể Ubuntu
hoặc có lẽ Ubuntu-20.04
). Nếu bạn đang sử dụng Windows Terminal, nó sẽ phát hiện cả hai và tạo hồ sơ để khởi chạy. Hoặc bạn luôn có thể khởi chạy thủ công bằng cách sử dụng wsl ~ -d <tên distro>
.
Một lựa chọn khác là đơn giản đổi sang WSL1 và sử dụng riêng nó. Các bước cho việc này tương tự như sao chép nó, vì có thể bạn vẫn muốn sao lưu. Một lần nữa, thoát khỏi phiên bản và từ PowerShell:
# Điều chỉnh đường dẫn cơ sở như mong muốn
$WSL_ROOT = "$env:USERPROFILE\WSL"
$WSL_IMAGE_NAME = "$(get-date -UFormat `"%Y-%m-%d`") Ubuntu Backup.tar"
mkdir -p "$WSL_ROOT\hình ảnh"
cd $WSL_ROOT
wsl -l -v
# Xác nhận tên phân phối - Nếu không phải là "Ubuntu", hãy điều chỉnh dòng sau nếu cần
wsl --export Ubuntu "$WSL_ROOT\images\$WSL_IMAGE_NAME"
wsl --set-phiên bản Ubuntu 1
Không cần thiết lập lại tên người dùng mặc định trong trường hợp này.
WSL2
WSL2 bắt đầu trở nên phức tạp hơn rất nhiều. Mặc dù có một liên kết trong các nhận xét đến một tài liệu về cách thực hiện, nhưng tôi sẽ chỉ cho bạn vấn đề và bình luận Github ban đầu đã thực sự bắt đầu mọi người theo hướng này.
Có hai vấn đề thực sự phải được giải quyết để tính năng này hoạt động trong WSL2:
Đầu tiên, mạng WSL2 là một mạng ảo (thực ra là Hyper-V vNIC). Nó không nằm trên "mạng văn phòng" của bạn, như bạn lưu ý trong câu hỏi của mình. Trước tiên, bạn cần có một số cách để yêu cầu máy chủ lưu trữ Windows định tuyến các gói đến mạng ảo WSL2 của bạn cho cổng đó.
Việc chuyển tiếp đó rất phức tạp bởi thực tế là địa chỉ mạng WSL2 ảo thay đổi sau mỗi lần khởi động lại (hoặc wsl --shutdown
). Điều đó có nghĩa là (ít nhất là với phương pháp được ghi lại trong các nhận xét và vấn đề Github đó) mà bạn phải lặp lại quy trình:
- Tìm địa chỉ IP WSL2
- Xóa các quy tắc tường lửa cũ
- Xóa các quy tắc chuyển tiếp cũ
- Tạo quy tắc tường lửa mới
- Tạo quy tắc chuyển tiếp mới
... mỗi khi bạn khởi động lại. Thật là một nỗi đau, phải không?!
Vì vậy, tôi sẽ đề xuất những gì tôi tin là một phương pháp dễ dàng hơn. Bạn vẫn có thể quay lại phương pháp khác nếu muốn. Điều này có một số khinh bỉ thiết lập phức tạp, nhưng hầu như tất cả chỉ phải được thực hiện Một lần.
Phương pháp này sử dụng SSH để cung cấp cổng chuyển tiếp. Vì điều này được khởi tạo từ đầu cuối WSL2 nên nó có một số ưu điểm:
Đầu tiên, nó có thể được thực hiện như một phần của cùng một bước khi bạn chạy ứng dụng của mình (máy chủ web). Bạn không đề cập đến kiến trúc/ngôn ngữ của ứng dụng, nhưng tôi sẽ cho rằng một trong những ngôn ngữ phổ biến nhất -- Node. Nếu đúng như vậy, bạn thậm chí có thể đưa nó vào chạy npm
kịch bản. Gần như chắc chắn có một kỹ thuật phù hợp với mọi kiến trúc.
Quan trọng nhất, nó không cần địa chỉ IP của WSL2. Điều này tránh phải thực hiện 4 trong số các bước trên mỗi khi bạn khởi động lại.
Vì vậy, ở đây chúng tôi đi. Đầu tiên, có thiết lập "một lần":
Kích hoạt máy chủ Windows OpenSSH. Bạn có thể theo dõi Microsoft hướng dẫn, nhưng tôi sẽ tóm tắt ở đây. Bắt đầu bằng cách mở lời nhắc PowerShell với tư cách Quản trị viên, sau đó:
Add-WindowsCapability -Online -Name OpenSSH.Client~~0.0.1.0
Add-WindowsCapability -Online -Name OpenSSH.Server~~0.0.1.0
Set-Service -Name sshd -StartupType 'Tự động'
Điều này sẽ tự động tạo quy tắc chuyển tiếp SSH. Một lần nữa, hãy xem tài liệu nếu bạn gặp bất kỳ rắc rối nào.
Chỉnh sửa C:\ProgramData\ssh\sshd_config
và đảm bảo rằng GatewayPorts có
không được bình luận ra ngoài. Tôi tin rằng nó bị tắt theo mặc định.
Quay lại PowerShell quản trị của bạn, chạy:
Bắt đầu dịch vụ sshd
Bạn không đề cập đến số cổng mà ứng dụng web của bạn chạy dưới dạng đó, vì vậy tôi sẽ chọn 8080
vì lợi ích của những ví dụ này. Điều chỉnh khi cần thiết. Vẫn trong quản trị viên PowerShell, hãy chạy:
Mới-NetFirewallRule -DisplayName 8080 -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow -Profile Private
Cái này:
- Cho phép lưu lượng truy cập TCP đến
- Trên cổng 8080
- Từ các thiết bị trên mạng riêng
Nếu mạng của bạn được đặt Công cộng
, thả -Hồ sơ cá nhân
Thoát quản trị viên PowerShell của bạn
Với điều đó ra khỏi con đường, mọi thứ ở vị trí. Để bắt đầu chuyển tiếp tại thời điểm này, hãy thực hiện thao tác sau từ Ubuntu/WSL2:
ssh -f -N -R 8080:localhost:8080 "$(hostname).local"
Sử dụng của bạn các cửa sổ tên người dùng và mật khẩu.
Tại thời điểm này, bạn sẽ có quyền truy cập vào ứng dụng web của mình từ một máy tính khác (hoặc điện thoại hoặc bất kỳ thứ gì) trên cùng một mạng văn phòng.
Giải trình:
- kết nối từ Ubuntu/WSL2
- Đến Máy chủ OpenSSH mà chúng tôi đã thiết lập
- Sử dụng
"$(tên máy chủ).local"
cái nào (nên) luôn tìm đúng tên DNS qua mDNS (giải thích trong câu trả lời này.
- Nó không phân bổ một thiết bị đầu cuối (
-N
) và chạy trong nền (-f
) sau khi yêu cầu thông tin đăng nhập
- Nó yêu cầu máy chủ SSH từ xa (Windows) chuyển tiếp lưu lượng truy cập nhận được trên cổng 8080 của nó sang cổng 8080 cục bộ (WSL2).
- Bởi vì chúng tôi đã chỉ định
GatewayPorts có
trong cấu hình máy chủ, điều này có nghĩa là nó sẽ mở rộng quá trình chuyển tiếp đó sang khác máy chủ trên mạng là tốt.