【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