WSL中iPerf3可作客户端却无法作为服务器的解决问询
解决WSL Ubuntu与手机iPerf3双向测试的方案
一、核心问题分析
- WSL2采用NAT网络模式,同一局域网内的设备(如手机)无法直接访问WSL子系统的内部IP,导致手机作为客户端连接WSL服务器时出现
Connection refused。 - WSL1虽网络模式更贴近桥接,但不支持部分TCP拥塞控制算法(如cubic);Windows版iPerf3版本过低,同样缺失拥塞控制功能,不符合测试需求。
二、基于WSL2的双向测试实现步骤
1. 正确启动WSL2的iPerf3服务器
在WSL Ubuntu中启动服务器时,明确绑定所有网络接口,避免仅绑定localhost:
iperf3 -s -p 5201 -B 0.0.0.0
2. 配置Windows端口转发
WSL2的IP为动态分配,需将Windows的端口转发到WSL子系统的对应端口:
- 获取WSL2内部IP:在WSL中执行
hostname -I,得到类似172.18.xxx.xxx的地址。 - 打开管理员权限的PowerShell,执行转发命令(替换
你的WSL2内部IP为实际地址):
netsh interface portproxy add v4tov4 listenport=5201 listenaddress=0.0.0.0 connectport=5201 connectaddress=你的WSL2内部IP
- 验证转发规则:
netsh interface portproxy show all
3. 开放Windows防火墙端口
确保Windows防火墙允许私有网络设备访问5201端口:
New-NetFirewallRule -DisplayName "Allow iPerf3 Server" -Direction Inbound -Protocol TCP -LocalPort 5201 -Action Allow -Profile Private
4. 手机端连接测试
手机作为客户端,连接Windows主机的局域网IP(而非WSL内部IP):
iperf3 -c Windows主机局域网IP -p 5201
5. 处理WSL2 IP动态变化问题
WSL2重启后IP会变更,可通过批处理脚本自动更新转发规则:
创建update_wsl_portproxy.bat文件,内容如下:
@echo off for /f "tokens=*" %%i in ('wsl hostname -I') do set WSL_IP=%%i netsh interface portproxy reset netsh interface portproxy add v4tov4 listenport=5201 listenaddress=0.0.0.0 connectport=5201 connectaddress=%WSL_IP% echo Port proxy updated to WSL IP: %WSL_IP%
每次重启WSL后,以管理员身份运行该批处理即可。
三、验证TCP拥塞控制功能
在WSL2中执行以下命令,确认cubic等算法生效:
iperf3 -c 手机IP -p 5201 -C cubic
内容的提问来源于stack exchange,提问作者mimm_mm
相关产品推荐
相关产品推荐

