如何诊断同局域网内无法访问WSL中Apache服务器的问题
WSL2中Apache局域网无法访问的问题排查与解决
概述
在Windows 11家用电脑的WSL2(Ubuntu 22.04)环境下搭建Apache服务器,通过ip a获取eth0的内网IP(如172.26.xx.xx)后,本机可正常访问网页,但同局域网内其他设备无法访问。
详细配置
ports.conf(/etc/apache2/,已去除注释)
Listen 80 <IfModule ssl_module> Listen 443 </IfModule> <IfModule mod_gnutls.c> Listen 443 </IfModule>
apache2.conf(/etc/apache2/,已去除注释)
DefaultRuntimeDir ${APACHE_RUN_DIR} PidFile ${APACHE_PID_FILE} Timeout 300 KeepAlive On MaxKeepAliveRequests 100 KeepAliveTimeout 5 User ${APACHE_RUN_USER} Group ${APACHE_RUN_GROUP} HostnameLookups Off ErrorLog ${APACHE_LOG_DIR}/error.log LogLevel warn IncludeOptional mods-enabled/*.load IncludeOptional mods-enabled/*.conf Include ports.conf <Directory /> Options FollowSymLinks AllowOverride None Require all denied </Directory> <Directory /usr/share> AllowOverride None Require all granted </Directory> <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> AccessFileName .htaccess <FilesMatch "^.ht"> Require all denied </FilesMatch> LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %O" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent IncludeOptional conf-enabled/*.conf IncludeOptional sites-enabled/*.conf
000-default.conf(/etc/apache2/sites-available/)
<VirtualHost *:80> ServerName www.example.com ServerAlias example.com ServerAdmin example@example.com DocumentRoot /var/www/html <Directory /var/www/html> AllowOverride All Options All Require all granted </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
注:已使用注册域名替换示例中的example.com,并通过ddclient配置动态DNS(公网IP与域名解析一致),该配置与局域网访问问题无关。
已尝试操作
端口转发相关
- WSL终端执行
sudo ufw status verbose,确认80、443端口已开放 - 通过
netsh interface portproxy将Windows的80、443端口映射到WSL对应端口(目标IP为172.26.xx.xx,监听地址0.0.0.0) - 在Windows Defender防火墙创建入站规则,允许80、443端口的TCP流量
- 执行
netstat -aobn | findstr :80和Get-NetTCPConnection | where localport -eq 80,确认端口处于监听状态
日志排查
- 检查
/var/log/apache2/error.log,仅包含Apache重启日志,无错误记录
环境参数
- Windows 11 23H2(版本25967.1010)
- WSL版本2.0.3.0
- Ubuntu 22.04.03,内核5.15.123.1-microsoft-standard-WSL2
- Apache/2.4.52 (Ubuntu)
诊断步骤与解决方案
诊断方法
- 验证端口可达性:在局域网设备上用
telnet Windows主机局域网IP 80或nc -zv Windows主机局域网IP 80测试端口是否能通。不通则排查转发/防火墙,通但浏览器无法访问则检查Apache配置或域名解析。 - 检查WSL网络模式:WSL2默认NAT模式需端口转发;WSL2.0+支持桥接模式,可直接获取局域网IP。执行
wsl --set-version Ubuntu 22.04 2确认版本,再检查网络模式。 - 确认Apache监听地址:WSL内执行
netstat -tulpn | grep apache2,确保Apache监听0.0.0.0:80而非仅127.0.0.1:80。 - 排查防火墙规则:确认Windows防火墙入站规则允许所有远程IP访问80/443端口,同时检查是否有第三方防火墙拦截流量。
- 直接访问WSL IP测试:在局域网设备上直接访问WSL的eth0 IP(172.26.xx.xx),若无法访问,说明NAT网络隔离了局域网连接,需调整网络模式或端口转发。
解决方案
方案1:修复NAT模式下的端口转发
WSL的IP会随重启变化,可编写PowerShell脚本自动更新转发规则:
# 获取WSL的IP $wsl_ip = (wsl hostname -I).Trim() # 删除旧规则 netsh interface portproxy delete v4tov4 listenport=80 listenaddress=0.0.0.0 netsh interface portproxy delete v4tov4 listenport=443 listenaddress=0.0.0.0 # 添加新规则 netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=$wsl_ip netsh interface portproxy add v4tov4 listenport=443 listenaddress=0.0.0.0 connectport=443 connectaddress=$wsl_ip
将脚本保存为update_wsl_portproxy.ps1,每次WSL重启后运行。同时确保Windows防火墙入站规则覆盖所有网络类型。
方案2:切换WSL到桥接模式(推荐)
- 管理员权限打开Windows终端,执行:
wsl --shutdown - 创建或修改
%UserProfile%\.wslconfig文件,添加:[wsl2] networkMode=bridged # 替换为你的网卡名称,可通过Get-NetAdapter查看 adapterName="Wi-Fi" - 重启WSL,执行
ip a会看到eth0获取到局域网同网段IP(如192.168.1.x),无需端口转发,局域网设备可直接访问该IP。
方案3:调整Apache监听配置
若Apache仅监听本地回环,修改/etc/apache2/ports.conf:
Listen 0.0.0.0:80
重启Apache:
sudo systemctl restart apache2
内容的提问来源于stack exchange,提问作者prsm
相关产品推荐
相关产品推荐

