[实战]解决WSL2中TFTP服务无法被外部设备访问的问题

解决WSL2中TFTP服务无法被外部设备访问的防火墙配置指南

在嵌入式开发中使用Petalinux时,发现TFTP服务明明正常启动,开发板却无法从WSL2虚拟机下载镜像文件。经过一番排查,最终发现是Windows防火墙阻止了访问。本文将详细介绍解决方案。

问题背景

在基于Windows 11 + WSL2 Ubuntu的嵌入式开发环境中,使用Petalinux进行开发时,经常需要通过TFTP协议将编译好的镜像文件下载到目标板卡。然而,许多开发者会遇到这样的困境:

  • WSL2 Ubuntu中的TFTP服务已正确安装和配置
  • 服务状态显示正常运行
  • 在WSL内部测试TFTP服务工作正常
  • 但同一网络中的开发板或其他设备无法通过Windows主机访问TFTP服务

问题的根源在于WSL2的网络架构和Windows防火墙的默认配置。

WSL2网络架构简析

与WSL1不同,WSL2基于完整的Linux内核,运行在轻量级虚拟机上。这种架构带来了更好的兼容性,但也引入了网络访问的复杂性:

  • WSL2实例拥有独立的IP地址,与主机不在同一网络命名空间
  • 外部设备无法直接访问WSL2中的服务
  • Windows防火墙默认阻止对WSL2服务的访问

完整解决方案

以下是解决该问题的完整步骤流程图:

服务异常
服务正常
成功
失败
问题: 开发板无法访问WSL2 TFTP
检查WSL2 TFTP服务状态
安装/配置TFTP服务
获取Windows和WSL2 IP地址
配置Windows防火墙
设置端口转发规则
在开发板上测试连接
问题解决
排查故障点
检查防火墙规则状态
验证端口转发
确认网络连通性

步骤1:确认WSL2中TFTP服务状态

首先确保WSL Ubuntu中的TFTP服务器已正确安装并运行:

# 更新包管理器
sudo apt update

# 安装TFTP服务器
sudo apt install tftpd-hpa tftp-hpa

# 检查服务状态
sudo service tftpd-hpa status

# 如果服务未运行,启动服务
sudo service tftpd-hpa start

# 确认服务在UDP 69端口监听
sudo netstat -tulpn | grep :69

检查TFTP配置文件 /etc/default/tftpd-hpa,确保配置正确:

# 查看TFTP配置
cat /etc/default/tftpd-hpa

# 典型配置应包含:
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"

步骤2:获取必要的网络信息

需要收集两个关键IP地址:

获取WSL2的IP地址:

# 在WSL Ubuntu中执行
ip addr show eth0 | grep inet

# 输出类似:inet 172.24.32.56/20
# 记录这个IP地址(示例中的172.24.32.56)

获取Windows主机的局域网IP:

# 在Windows命令提示符中执行
ipconfig

# 查找无线局域网适配器 WLAN 或以太网适配器 以太网 部分
# 记录IPv4地址,如 192.168.1.100

步骤3:配置Windows防火墙

这是最关键的一步,需要以管理员权限操作:

方法A:使用PowerShell(推荐)

# 以管理员身份打开PowerShell,执行以下命令
netsh advfirewall firewall add rule name="TFTP for WSL2 Petalinux" dir=in action=allow protocol=UDP localport=69

方法B:使用图形界面

  1. 打开"Windows安全中心"
  2. 进入"防火墙和网络保护"
  3. 点击"高级设置"
  4. 在入站规则中新建规则:
    • 规则类型:端口
    • 协议:UDP,特定本地端口:69
    • 操作:允许连接
    • 配置文件:全选(域、专用、公用)
    • 名称:“TFTP for WSL2 Petalinux”

步骤4:设置端口转发

由于WSL2的虚拟网络特性,需要将发送到Windows主机的TFTP请求转发到WSL2:

# 以管理员身份在PowerShell中执行
# 将下面的IP地址替换为实际获取的地址
$wsl_ip = ip addr show eth0 | grep inet | awk '{print $2}' | cut -d/ -f1
$windows_ip = "192.168.1.100" # 替换为你的Windows IP

netsh interface portproxy add v4tov4 listenaddress=$windows_ip listenport=69 connectaddress=$wsl_ip connectport=69

或者使用固定的WSL2 IP地址(如果已知):

# 直接指定IP地址
netsh interface portproxy add v4tov4 listenaddress=192.168.1.100 listenport=69 connectaddress=172.24.32.56 connectport=69

步骤5:验证配置

检查防火墙规则:

netsh advfirewall firewall show rule name="TFTP for WSL2 Petalinux"

检查端口转发规则:

netsh interface portproxy show all

在开发板或另一台设备上测试:

# 在Linux设备上测试
tftp 192.168.1.100 -c get zImage

# 在Windows设备上测试
tftp -i 192.168.1.100 get zImage

故障排除

如果配置后仍然无法访问,请检查以下方面:

1. 确认防火墙规则生效

# 检查规则是否存在且已启用
netsh advfirewall firewall show rule name="TFTP for WSL2 Petalinux"

2. 验证端口转发

# 显示所有端口转发规则
netsh interface portproxy show all

# 如果配置错误,删除并重新创建
netsh interface portproxy delete v4tov4 listenaddress=192.168.1.100 listenport=69

3. 检查WSL2网络状态

# 在WSL中检查网络连接
sudo ufw status # 如果启用了UFW,确保没有阻止TFTP

# 重启WSL网络服务(在Windows PowerShell中)
wsl --shutdown
# 然后重新启动WSL

4. 确认TFTP服务可访问性

# 在WSL内部测试TFTP服务
tftp localhost -c get testfile

自动化脚本

为了简化流程,可以创建自动化配置脚本:

Windows PowerShell脚本 (configure_tftp.ps1):

# 必须以管理员权限运行
param(
    [string]$WindowsIP = "192.168.1.100",
    [string]$WSLIP = "172.24.32.56"
)

# 配置防火墙
Write-Host "配置Windows防火墙..." -ForegroundColor Green
netsh advfirewall firewall add rule name="TFTP for WSL2 Petalinux" dir=in action=allow protocol=UDP localport=69

# 配置端口转发
Write-Host "设置端口转发..." -ForegroundColor Green
netsh interface portproxy add v4tov4 listenaddress=$WindowsIP listenport=69 connectaddress=$WSLIP connectport=69

# 显示配置结果
Write-Host "配置完成!" -ForegroundColor Yellow
Write-Host "防火墙规则:" -ForegroundColor Cyan
netsh advfirewall firewall show rule name="TFTP for WSL2 Petalinux"

Write-Host "端口转发规则:" -ForegroundColor Cyan
netsh interface portproxy show all

安全注意事项

  1. 网络环境:TFTP协议不加密传输内容,仅在可信的内部网络中使用
  2. 最小权限:配置完成后,可以考虑限制访问源IP范围
  3. 临时测试:如需临时测试,可使用以下命令暂时关闭防火墙(不推荐长期使用):
    # 临时禁用防火墙(测试用)
    netsh advfirewall set allprofiles state off
    
    # 测试完成后重新启用
    netsh advfirewall set allprofiles state on
    

总结

通过正确配置Windows防火墙和端口转发,成功解决了WSL2中TFTP服务无法被外部设备访问的问题。这套方案不仅适用于Petalinux开发环境,也适用于任何需要在WSL2中运行网络服务并被外部设备访问的场景。

关键要点:

  • WSL2的网络隔离特性需要额外配置才能实现外部访问
  • Windows防火墙默认阻止对WSL2服务的入站连接
  • 端口转发是连接外部设备与WSL2服务的桥梁
  • 配置过程需要管理员权限和正确的网络信息

现在,你的开发板应该能够正常通过TFTP从WSL2 Ubuntu下载镜像文件了,嵌入式开发流程将更加顺畅高效。


研究学习不易,点赞易。
工作生活不易,收藏易,点收藏不迷茫 :)


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

极客不孤独

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值