文章目录
WSL 2 访问局域网内设备
WSL 2 访问本机 Windows
由于 WSL 2 基于 Hyper-V,其与宿主 Windows 的关系可以看作是同一网络下的不同主机。要实现 WSL 2 到 Windows 的通信,首先要让 WSL 2 知道 Windows 的 IP 地址。
在 Windows 中,打开终端,执行
ipconfig
,可以看到 WSL 相关的网络信息:
需要注意的是,在没有特殊配置的情况下,电脑的 IP 地址通常会随网络环境的变化而变化,此处及后文的 IP 地址仅供参考,具体 IP 地址需要以自己实际操作时的输出为准。
通过
ipconfig
的输出可以发现,在 Windows-WSL 2 这一体系中,Windows 的 IP 地址为
192.168.176.1
。
Linux 系统中,
/etc/resolv.conf
为 DNS 配置文件,对于 WSL 2 也是如此。在 WSL 2 中,执行
cat /etc/resolv.conf
,查看其中的内容:
可以发现,此处指向的 DNS 服务器 IP 为
192.168.176.1
,正是 Windows 的 IP,说明 WSL 2 是借助 Windows 去寻找真正的 DNS 服务器的。
可以尝试在 WSL 2 中 ping Windows,即执行
ping `cat /etc/resolv.conf | grep nameserver | awk '{print $2}'`
,能 ping 通即表示 WSL 2 能通过网络访问 Windows。
因为每次启动 WSL 2 都会重新分配虚拟网络,可以在
~/.bashrc
中加入 Windows 网络相关环境变量,便于后续使用:
# Windows 宿主机 IPWINDOWS_IP=$(grep nameserver /etc/resolv.conf |awk'{print $2}'|head -1)# Windows 宿主机代理端口WINDOWS_PROXY_PORT=7890# 更新 Windows 网络信息functionupdate_windows_net_info(){WINDOWS_IP=$(grep nameserver /etc/resolv.conf |awk'{print $2}'|head -1)WINDOWS_PROXY_PORT=7890}
如果有需要的话,还可以在
update_windows_net_info
中将 Windows 的 IP 地址写入
/etc/hosts
。
WSL 2 访问非本机 Windows 设备
如果局域网内非本机 Windows 设备开放了防火墙入站,WSL 2 无需额外配置就能直接访问。
局域网内设备访问 WSL 2
本机 Windows 访问 WSL 2
本机 Windows 可以直接通过
localhost
访问 WSL 2。
非本机 Windows 设备访问 WSL 2
要实现局域网内非本机 Windows 设备访问 WSL 2,需要在 Windows 上配置端口转发以及防火墙入站规则。
为了便于操作,可以将配置端口转发和防火墙入站规则的操作封装成函数,在 Windows PowerShell 的配置文件
PROFILE
中添加以下内容:
# 添加 WSL 端口转发以及防火墙入站规则functionAdd-WSLPortForwarding($Port = '23333',$Protocol = 'TCP'){$WSLIP = wsl -- hostname -I
$WSLIP = $WSLIP.Trim()
netsh interface portproxy add v4tov4 listenport=$Port connectaddress=$WSLIP connectport=$PortNew-NetFirewallRule-DisplayName "Allow ${Protocol} Inbound Port ${Port}"-Direction Inbound -Action Allow -Protocol $Protocol-LocalPort $Port}# 移除 WSL 端口转发以及防火墙入站规则functionRemove-WSLPortForwarding($Port = '23333',$Protocol = 'TCP'){
netsh interface portproxy delete v4tov4 listenport=$PortRemove-NetFirewallRule-DisplayName "Allow ${Protocol} Inbound Port ${Port}"}
其中添加和移除函数都有两个参数,端口号和协议。端口号默认为 23333,协议默认为 TCP。
使用时需要以管理员权限执行。参考使用方式如下:
Add-WSLPortForwarding-Port 22 # 开启 TCP 协议 22 端口 的转发Remove-WSLPortForwarding-Port 22 # 移除 TCP 协议 22 端口 的转发Add-WSLPortForwarding-Port 23334 -Protocol UDP # 开启 UDP 协议 23334 端口 的转发Remove-WSLPortForwarding-Port 23334 -Protocol UDP # 移除 UDP 协议 23334 端口 的转发
如果希望通过 ssh 访问 WSL 2,可以参考以下几个步骤:
- WSL 2 安装 ssh server
如果 WSL 2 中没有 ssh server,可以通过以下命令安装:
sudoaptinstall openssh-server
- WSL 2 配置 sshd
打开
/etc/ssh/sshd_config
文件,确认以下几个配置:
Port
:监听端口,默认为22
,如果担心和本机 Windows 冲突也可以修改为其它端口ListenAddress
:监听 IP 地址,默认为0.0.0.0
,即所有 IPPasswordAuthentication
:是否开启密码认证,默认为no
,如果想通过密码登录就需要设为yes
修改配置后,需要重启 ssh:
sudoservicessh restart
如果希望 ssh 能开机自启,可以执行:
sudo systemctl enablessh
- 其它设备通过 ssh 访问 WSL 2
先在 Windows 中开启端口转发和防火墙入站:
Add-WSLPortForwarding-Port <sshd_port> # 端口号为 WSL 2 中 sshd 配置的端口号
之后就可以在其它设备中通过 ssh 访问 WSL 2 了:
ssh<username>@<windows_ip> -p <sshd_port>
WSL 2 使用本机 Windows 中的代理
由于种种原因,一般的网络环境访问诸如 github 等网站时往往速度很慢,甚至无法连接,这时就可以使用网络代理。
WSL 2 使用代理通常有两种思路:
- 直接在 WSL 2 环境下借助 v2ray 等软件访问代理
- WSL 2 将需要使用代理的请求转发至本机 Windows 中配置的代理
可以根据个人需要进行选择。
本文介绍我所使用的第二种的配置方法,前置条件是 WSL 2 能够访问本机 Windows,请先阅读那一部分内容。
Windows 代理客户端配置
Windows 中的代理客户端需要开启允许来自局域网的连接。
以 Clash for Windows 为例,勾选 Allow LAN 即可:
如果是 v2rayN 的话,勾选允许来自局域网的连接即可:
事实上,开启这个选项后,同一局域网中其它非 WSL 2 的设备也都能通过 Windows 在局域网中的 IP 地址和代理端口号来使用代理。
WSL 2 代理配置
接下来介绍两种使用代理的方法,分别是代理环境变量和 proxychains 代理工具。两种方法有各自适用的场景,根据需要选择使用即可。
方法一:代理环境变量
Linux 中有诸如
HTTP_PROXY
、
FTP_PROXY
等环境变量来表示代理,在需要使用代理时给这些环境变量赋值即可。
我将代理环境变量的赋值与删除封装成了函数,用于批量使用代理的场景。
在
~/.bashrc
中添加以下内容:
# 开启代理functionproxy_on(){exportHTTP_PROXY="http://${WINDOWS_IP}:${WINDOWS_PROXY_PORT}"# http 或 socks5,取决于代理的协议exportHTTPS_PROXY="http://${WINDOWS_IP}:${WINDOWS_PROXY_PORT}"# http 或 socks5,取决于代理的协议exportALL_PROXY="http://${WINDOWS_IP}:${WINDOWS_PROXY_PORT}"# http 或 socks5,取决于代理的协议echo -e "Acquire::http::Proxy \"http://${WINDOWS_IP}:${WINDOWS_PROXY_PORT}\";"|sudotee -a /etc/apt/apt.conf.d/proxy.conf > /dev/null
echo -e "Acquire::https::Proxy \"http://${WINDOWS_IP}:${WINDOWS_PROXY_PORT}\";"|sudotee -a /etc/apt/apt.conf.d/proxy.conf > /dev/null
proxy_status
}# 关闭代理functionproxy_off(){unset HTTP_PROXY
unset HTTPS_PROXY
unset ALL_PROXY
sudosed -i -e '/Acquire::http::Proxy/d' /etc/apt/apt.conf.d/proxy.conf
sudosed -i -e '/Acquire::https::Proxy/d' /etc/apt/apt.conf.d/proxy.conf
proxy_status
}# 代理状态functionproxy_status(){echo"HTTP_PROXY:""${HTTP_PROXY}"echo"HTTPS_PROXY:""${HTTPS_PROXY}"echo"ALL_PROXY:""${ALL_PROXY}"}
proxy_on
表示开启代理(包括 apt),
proxy_off
表示关闭代理,
proxy_status
为查看当前代理状态。
使用方法如下:
proxy_on
<command># 需要使用代理的操作
proxy_off
测试效果如下:
需要注意的是这种方法开启的代理只作用于当前终端会话。
方法二:proxychains 代理工具
proxychains 是为 UNIX 类系统开发的代理工具,支持 HTTP、SOCKS4a/5 等类型的代理。
可以直接通过 apt 进行安装:
sudoaptinstall proxychains4
proxychains 默认使用
/etc/proxychains4.conf
这一配置文件,我们主要关注底部的代理列表:
[ProxyList]# add proxy here ...# meanwile# defaults set to "tor"
socks4 127.0.0.1 9050
从左到右分别是代理协议、IP 地址、端口。
要使用 Windows 中的代理,就要在 proxychains 的配置文件中写上 Windows 对 WSL 2 开放的 IP 地址,不过需要注意的是,此 IP 地址默认情况下会在每次启动 WSL 2 时动态生成。
与方法一类似,同样是借助函数实现自动配置,在
~/.bashrc
中添加以下内容:
# 更新 proxychains 代理配置functionupdate_proxychains_conf(){# 删除 ~/.config/proxychains4/proxychains4.conf 中 [ProxyList] 所在行到文件末尾的全部内容sed -i '/\[ProxyList\]/,$d' ~/.config/proxychains4/proxychains4.conf
# 往 ~/.config/proxychains4/proxychains4.conf 文件末尾追加代理配置echo"[ProxyList]"|tee -a ~/.config/proxychains4/proxychains4.conf > /dev/null
echo"http ${WINDOWS_IP}${WINDOWS_PROXY_PORT}"|tee -a ~/.config/proxychains4/proxychains4.conf > /dev/null
echo"socks5 ${WINDOWS_IP}${WINDOWS_PROXY_PORT}"|tee -a ~/.config/proxychains4/proxychains4.conf > /dev/null
}
update_proxychains_conf
aliaspc='proxychains4 -f ~/.config/proxychains4/proxychains4.conf'
因为编辑
/etc/
目录下的文件需要管理员权限,为了避免一进入 WSL 2 就执行
sudo
,可以拷贝一份默认配置文件放到当前用户目录下,作为 proxychains 读取的配置文件。
此处以
~/.config/proxychains4/proxychains4.conf
为例,并设置了一个命令别名来简化使用。
这样就能在每次启动 WSL 2 时自动获取 Windows 网络相关信息并写入 proxychains 配置文件。
使用方法如下:
pc <command># 需要使用代理的操作
测试效果如下:
问题记录
WSL 2 无法通过网络访问本机 Windows,ping 不通
如果在 WSL 2 中无法 ping 通 Windows,可能是由于默认情况下 Windows 防火墙会阻止 WSL 2 对 Windows 的网络访问。
需要在 Windows 中,以管理员身份打开终端,然后执行以下命令,添加一条防火墙规则允许 WSL 2 对 Windows 的入方向访问:
New-NetFirewallRule-DisplayName "WSL"-Direction Inbound -InterfaceAlias "vEthernet (WSL)"-Action Allow
上述命令的示例输出如下:
查看 Windows 防火墙的高级设置,在入站规则中,已经新增了一条名称为 WSL 的规则:
这时再尝试 ping Windows,可以看到已经能 ping 通了:
代理客户端已经开启了允许来自局域网的连接,但 WSL 2 中还是不能连接代理
有可能是 Windows 防火墙规则中没有代理客户端的放行规则。
以 Clash for Windows 为例,防火墙入站规则中需要有相关规则:
如果是 v2rayN 的话,同样需要有相关规则:
其它软件同理。
参考文档
使用 WSL 访问网络应用程序 | Microsoft Learn
Add “allow” rule to Windows firewall for WSL2 network · Issue #4585 · microsoft/WSL (github.com)
haad/proxychains: proxychains - a tool that forces any TCP connection made by any given application to follow through proxy like TOR or any other SOCKS4, SOCKS5 or HTTP(S) proxy. Supported auth-types: “user/pass” for SOCKS4/5, “basic” for HTTP. (github.com)
版权归原作者 mingh24 所有, 如有侵权,请联系我们删除。