【WSL2】在Windows透過自定義域名訪問wsl2中的服務

007少侠發表於2024-07-26

前言

  • 目前在windows與windows的wsl系統之間,宿主機無法透過相對較固定的方式來進行網路訪問,通常需要使用wsl的ip來訪問,而ip可能不是很直觀並且可能會有變更,當前教程解決了這個問題,透過hosts對映的方式實現windows宿主機訪問wsl服務。
  • 指令碼的原理:在linux啟動時,執行一次修改windows上的hosts檔案的指令碼。為windows新增wsl的host,這樣就能做到自定義域名訪問

具體教程

  1. 給予當前windows使用者修改hosts檔案的許可權

快捷鍵win+r,輸入C:\Windows\System32\drivers\etc,或在該資料夾中找到hosts檔案,右鍵選擇“屬性” ,選擇“安全選項卡”;
點選“編輯”,找到當前使用者組(一般是Users),為其新增完全控制許可權,即勾選"完全控制",彈出的對話方塊確認,確定即可。

  2. 進入Windows Linux子系統(切換到root賬戶操作),在/opt/目錄下新建指令碼。

cd /opt/
vim win_wsl_domain.sh

  3. 貼上指令碼內容,其中wsl_domain為自定義域名,可以修改為想要的,儲存。

#!/bin/bash
win_hosts_path="/mnt/c/Windows/System32/drivers/etc/hosts"
#=================
# win_domain="win02"
# # 獲取 win 的 ip
# win_ip=$(/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Command "Get-NetIPAddress -AddressFamily IPv4 | Where-Object { \$_.InterfaceAlias -notmatch 'vEthernet' -and \$_.AddressState -eq 'Preferred' -and \$_.IPAddress -ne '127.0.0.1' } | Select-Object -ExpandProperty IPAddress -First 1")
# # 判斷是否已存在 win 的域名,如果存在則修改,否則追加
# if grep -wq "$win_domain" $win_hosts_path; then
#     # 此處因為許可權問題沒有直接用 sed 修改 hosts 檔案
#     win_hosts=$(sed -s "s/.* $win_domain/$win_ip $win_domain/g" $win_hosts_path)
#     echo "$win_hosts" > $win_hosts_path
#     echo "$(date '+%Y-%m-%d %H:%M:%S') 修改win-hosts[$win_domain] ==> $win_ip $win_domain"
# else
#     echo "$win_ip $win_domain" >> $win_hosts_path
#     echo "$(date '+%Y-%m-%d %H:%M:%S') 新增win-hosts[$win_domain] ==> $win_ip $win_domain"
# fi
#=================
wsl_domain="wslubuntu"
# 獲取 wsl 的 ip
wsl_ip=$(ifconfig eth0 | grep -w inet | awk '{print $2}')
# 判斷是否已存在 win 的域名,如果存在則修改,否則追加
if grep -wq "$wsl_domain" $win_hosts_path; then
    # 此處因為許可權問題沒有直接用 sed 修改 hosts 檔案
    win_hosts=$(sed -s "s/.* $wsl_domain/$wsl_ip $wsl_domain/g" $win_hosts_path)
    echo "$win_hosts" > $win_hosts_path
    echo "$(date '+%Y-%m-%d %H:%M:%S') 修改win-hosts[$wsl_domain] ==> $wsl_ip $wsl_domain"
else
    echo "$wsl_ip $wsl_domain" >> $win_hosts_path
    echo "$(date '+%Y-%m-%d %H:%M:%S') 新增win-hosts[$wsl_domain] ==> $wsl_ip $wsl_domain"
fi
echo "host change ok!"

  4. 把上述指令碼設定成一個服務,方便啟動時自動執行和日誌的檢視,貼上內容並儲存。

vim /etc/systemd/system/winhosts.service

貼上內容:

[Unit]
Description=Run my script at startup

[Service]
ExecStart=bash /opt/win_wsl_domain.sh
Restart=on-failure

[Install]
WantedBy=default.target

  5. 載入服務並設定開機執行

sudo systemctl daemon-reload
sudo systemctl start winhosts.service
sudo systemctl enable winhosts.service

  6. 檢視日誌,日誌正常即可

journalctl -u winhosts.service -f -o cat

  7. 後續操作回到宿主機windows系統開啟命令列工具PowerShell,此時在宿主機已經可以使用自定義的域名(wslubuntu) ping通wsl2子系統了,如下:

  8. 最後做一個埠對映(此例為ssh服務的埠22,區域網內其它電腦直接ssh root@上述宿主機ip即可完成連線wsl2系統),方便區域網內其它主機訪問到此電腦的wsl2子系統中的服務(其它)

新增埠對映:
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=wslubuntu connectport=22
刪除埠對映:
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=22
檢視所有的對映:
netsh interface portproxy show all

相關文章