在WSL中为Windows主机配置域名

在 WSL 中添加一个能解析到 Windows IP 的域名(方向:从 WSL 访问 Windows)

问题描述

众所周知,WSL 默认使用 NAT 进行互联网访问,但是,如果我想要访问 Windows 的 IP,怎么做呢?巨硬给出的方案如下:

1
ip route show | grep default | awk '{print $3}'

没毛病奥,能直接获取到 IP 地址,但是有说法说,在重启电脑或者重启 WSL 之后,WSL 网关可能会重新分配一个 IP,那对于需要固定 IP 的应用、配置文件而言,这是一个不稳定因素。

解决方案

核心思路:动态获取这个 IP 地址,然后在 /etc/hosts 文件中设置一个域名,映射到这个 IP。

根据巨硬的文档/etc/wsl.conf 配置文件中有一个 command 的选项,并且是以 root 的权限执行的。那么路线就非常明确了,写一个脚本修改 /etc/hosts 文件,然后在 /etc/wsl.conf 的配置文件中加上这个脚本的执行。

修改 /etc/hosts 文件的脚本如下,我放在了 /99-init-wsl

1
2
3
4
5
6
7
#!/bin/bash

HOST_IP=$(ip route show | grep default | awk '{print $3}')
# 这个域名可以自己设定
WIN_DOMAIN="win.local"

echo -e "\n${HOST_IP} ${WIN_DOMAIN}" >> /etc/hosts

/etc/wsl.conf 修改如下:

1
2
3
4
; ...
[boot]
command=/usr/bin/bash /99-init-wsl
; ...

这能干啥?

费这老大劲能干啥呢?其实还是能做不少事情的,例如

系统代理设置

因为众所周知的原因,访问众所周知的网站需要代理。一般我们会在 Windows 上安装一个代理工具,并且这些代理工具基本能支持在局域网上共享(这里的局域网也是包含虚拟网卡的)。因此,可以在 WSL 中设置一个命令,一键开关代理。例如:

1
2
3
4
5
6
7
8
9
10
11
PROXY_PORT=7890

function proxy() {
export http_proxy="http://win.local:${PROXY_PORT}"
export https_proxy="http://win.local:${PROXY_PORT}"
}

function unproxy() {
unset http_proxy
unset https_proxy
}

将上面的代码放到 .bashrc 这类会被默认加载的文件,就可以使用 proxy/unproy 命令一键开关代理了。

PS: 还可以写一个 rule 文件,告诉 Agent 有这样的指令

docker pull 代理配置

虽然 docker 有很多的镜像站,但是同步是否及时是个问题,而 docker 守护进程不使用系统的代理变量。不过没关系,我们已经有了固定的访问地址,直接在守护进程的配置文件中加上代理的配置就行。

1
2
3
4
5
6
{
"proxies": {
"http-proxy": "http://win.local:7890",
"https-proxy": "http://win.local:7890"
}
}

在WSL中为Windows主机配置域名
https://blog.bcb.pub/2026/08/17/wsl-adventure/add-domain-to-windows-in-wsl/
作者
BadCodeBuilder
发布于
2026年8月17日
许可协议