【WSL2】在Windows通过自定义域名访问wsl2中的服务

前言

  • 目前在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

 

posted @ 2024-07-26 19:12  007少侠  阅读(324)  评论(0编辑  收藏  举报
友情链接:便宜vps(CN2GIA线路)
站长统计: