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 功能(虽然我们不用)。
搭建步骤:
- 下载 Tftpd64(官网或靠谱的软件站)。
- 解压后直接运行
tftpd64.exe,无需安装。 - 配置界面:
- Current Directory:选择你的固件存放目录。我建议单独建一个文件夹,比如
C:\tftp_root。 - Server interfaces:选择你电脑的 IP 地址。如果有多网卡,一定要选对。
- 勾选 Enable TFTP Server。
- Current Directory:选择你的固件存放目录。我建议单独建一个文件夹,比如
- 点击 Settings,确认 TFTP Server 选项卡中端口是 69。
- 点击 OK 启动服务。
我的经验:Windows 防火墙默认会拦截 TFTP 的入站连接。启动 Tftpd64 后,如果看到日志里一直显示“Timeout”,十有八九是防火墙的问题。别慌,我们后面会处理。
3.3 Linux下搭建TFTP服务器
Linux 下搭建 TFTP 服务器就优雅多了,一条命令搞定。我建议用 tftp-hpa 这个包,兼容性最好。
搭建步骤(以 Ubuntu/Debian 为例):
- 安装 TFTP 服务端:
sudo apt-get install tftpd-hpa - 编辑配置文件:
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 允许上传
- 创建目录并设置权限:
sudo mkdir -p /srv/tftp
sudo chmod 777 /srv/tftp
- 重启服务:
sudo systemctl restart tftpd-hpa - 检查状态:
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 通了。如果看到 Timeout 或 Error,按以下顺序排查:
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| Timeout | 防火墙拦截、服务未启动 | 检查防火墙规则,确认 TFTP 服务正在运行 |
| File not found | 文件名错误、文件不在根目录 | 确认文件名大小写,检查文件是否在 TFTP 根目录 |
| Access violation | 权限不足 | 检查 TFTP 目录的读写权限 |
| Disk full or allocation exceeded | 交换机存储空间不足 | 清理交换机 flash,删除无用文件 |
我的小技巧:测试时不要直接传几百兆的固件。先传一个 1KB 的文本文件,确认通了再传固件。这样即使出问题,排查起来也快。
嗯,到这里 TFTP 服务器搭建与配置就讲完了。记住,TFTP 虽然简单,但细节决定成败。防火墙端口、文件权限、目录结构,任何一个环节出问题,都会让你抓狂。下次我们讲如何用 TFTP 给交换机刷固件,到时候你会感谢今天把 TFTP 搭好的自己。