3、TFTP服务器搭建与配置:TFTP协议原理、Windows/Linux下搭建TFTP服务器、防火墙与端口放通、连通性测试(ping与tftp get)

说到交换机固件升级,TFTP 绝对是绕不开的老伙计。别看它简单,但很多新手甚至老手都在它身上翻过车。今天我就把 TFTP 这块掰开了揉碎了讲清楚,从原理到实战,一条龙搞定。

3.1 TFTP协议原理:为什么它这么“轻”?

TFTP,全称 Trivial File Transfer Protocol,翻译过来就是“简单文件传输协议”。说白了,它就是 FTP 的瘦身版,专为网络设备这种资源受限的环境设计的。

核心特点:

  • 基于 UDP 协议:端口号 69。没有 TCP 那套三次握手的开销,传输效率高。
  • 没有认证机制:谁都能连,谁都能传。这也是为什么 TFTP 通常只在局域网内使用。
  • 固定数据块大小:默认 512 字节。每次发一个块,收到确认再发下一个。
  • “停等”机制:发一个等一个,简单粗暴。但这也意味着延迟高,不适合大文件。

重要概念:TFTP 的传输模式有两种——netascii(文本模式)和 octet(二进制模式)。固件升级必须用 octet 模式,否则文件会损坏。我见过有人用默认的 netascii 传固件,结果交换机直接变砖。

为什么会这样?因为 netascii 模式会对换行符做转换,而固件是二进制文件,一个字节都不能错。你想想看,固件里某个字节被改了,交换机加载时不出错才怪。

3.2 Windows下搭建TFTP服务器

Windows 上没有内置的 TFTP 服务端,但第三方工具很多。我个人习惯用 Tftpd64,轻量、稳定,还带 DHCP 功能(虽然我们不用)。

搭建步骤:

  1. 下载 Tftpd64(官网或靠谱的软件站)。
  2. 解压后直接运行 tftpd64.exe,无需安装。
  3. 配置界面:
    • Current Directory:选择你的固件存放目录。我建议单独建一个文件夹,比如 C:\tftp_root
    • Server interfaces:选择你电脑的 IP 地址。如果有多网卡,一定要选对。
    • 勾选 Enable TFTP Server
  4. 点击 Settings,确认 TFTP Server 选项卡中端口是 69。
  5. 点击 OK 启动服务。

我的经验:Windows 防火墙默认会拦截 TFTP 的入站连接。启动 Tftpd64 后,如果看到日志里一直显示“Timeout”,十有八九是防火墙的问题。别慌,我们后面会处理。

3.3 Linux下搭建TFTP服务器

Linux 下搭建 TFTP 服务器就优雅多了,一条命令搞定。我建议用 tftp-hpa 这个包,兼容性最好。

搭建步骤(以 Ubuntu/Debian 为例):

  1. 安装 TFTP 服务端:sudo apt-get install tftpd-hpa
  2. 编辑配置文件:sudo vim /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"          # 固件存放目录
TFTP_ADDRESS="0.0.0.0:69"          # 监听所有网卡的69端口
TFTP_OPTIONS="--secure --create"    # --secure 限制访问目录,--create 允许上传
  1. 创建目录并设置权限:
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp
  1. 重启服务:sudo systemctl restart tftpd-hpa
  2. 检查状态:sudo systemctl status tftpd-hpa

注意:千万不要在生产环境用 chmod 777。我这里是为了演示方便。实际项目中,你应该创建一个专门的 tftp 用户,并只给固件目录必要的读写权限。

3.4 防火墙与端口放通

TFTP 用的是 UDP 69 端口。但这里有个坑——TFTP 的数据传输不是一直用 69 端口的。它只在建立连接时用 69,真正的数据传输会随机使用一个高位端口(通常是 1024 以上)。

所以,防火墙放通时,不能只放 69 端口。我建议两种做法:

方法一:放通所有 UDP 高位端口(简单粗暴,适合实验室)

# Windows 防火墙(管理员 PowerShell)
New-NetFirewallRule -DisplayName "TFTP" -Direction Inbound -Protocol UDP -LocalPort 69 -Action Allow
New-NetFirewallRule -DisplayName "TFTP-Data" -Direction Inbound -Protocol UDP -LocalPort 1024-65535 -Action Allow

# Linux iptables
sudo iptables -A INPUT -p udp --dport 69 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 1024:65535 -j ACCEPT

方法二:使用 TFTP 代理或 ALG(适合生产环境)

有些防火墙支持 TFTP ALG(应用层网关),可以自动处理动态端口。比如 Cisco ASA 上配置 inspect tftp。但说实话,大多数场景下方法一就够用了。

避坑指南:我曾经在一个客户现场折腾了整整两个小时,TFTP 就是连不上。最后发现是客户公司的防火墙策略太严格,只放通了 69 端口,数据传输端口全被拦了。从那以后,我每次都会先确认防火墙策略是否覆盖了高位端口。

3.5 连通性测试:ping 与 tftp get

服务搭好了,防火墙也放通了,怎么确认一切正常?两步走:

第一步:ping 测试

从交换机 ping 你的 TFTP 服务器 IP。这是最基本的网络连通性测试。

Switch> ping 192.168.1.100
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.1.100, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5)

如果 ping 不通,先检查网线、IP 配置、VLAN 划分。别急着怀疑 TFTP。

第二步:tftp get 测试

从交换机下载一个文件,验证 TFTP 服务是否正常。

Switch> tftp 192.168.1.100 get test.txt flash:/test.txt
Loading test.txt from 192.168.1.100 (via Vlan1): !!!!!!!!!!!!!!!!!!!!!!!!!!
[OK - 1024 bytes]

看到 OK 和文件大小,说明 TFTP 通了。如果看到 TimeoutError,按以下顺序排查:

错误现象 可能原因 解决方法
Timeout 防火墙拦截、服务未启动 检查防火墙规则,确认 TFTP 服务正在运行
File not found 文件名错误、文件不在根目录 确认文件名大小写,检查文件是否在 TFTP 根目录
Access violation 权限不足 检查 TFTP 目录的读写权限
Disk full or allocation exceeded 交换机存储空间不足 清理交换机 flash,删除无用文件

我的小技巧:测试时不要直接传几百兆的固件。先传一个 1KB 的文本文件,确认通了再传固件。这样即使出问题,排查起来也快。

嗯,到这里 TFTP 服务器搭建与配置就讲完了。记住,TFTP 虽然简单,但细节决定成败。防火墙端口、文件权限、目录结构,任何一个环节出问题,都会让你抓狂。下次我们讲如何用 TFTP 给交换机刷固件,到时候你会感谢今天把 TFTP 搭好的自己。