0 概述
TFTP(普通文件传输协议)是 FTP(文件传输协议)的轻量级版本,TFTP 没有许多高级功能,例如内置的安全性,但是 TFTP 仍然有它的用处,比如很多路由器和交换机使用 TFTP 来备份和恢复配置文件,PXE、BOOTP 等网络启动也使用了 TFTP,TFTP Server 运行在 UDP 69 端口。
度娘及google很多安装教程,但是好像多多少少都有些问题,支离破碎,这里汇总一下。
1 安装
1.1 yum方式安装
如果网络是可用的,可以直接通过yum来安装,总共安装三个包,其中xinetd 根据服务启动方式不同,可装可不装
yum install -y tftp-server tftp xinetd
1.2 rpm离线方式安装
# 先下载rpm安装包
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/xinetd-2.3.15-14.el7.x86_64.rpm
wget http://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/tftp-server-5.2-22.el7.x86_64.rpm
wget http://rpmfind.net/linux/centos/7.9.2009/os/x86_64/Packages/tftp-5.2-22.el7.x86_64.rpm
rpm -ivh tftp-server-5.2-22.el7.x86_64.rpm
rpm -ivh tftp-5.2-22.el7.x86_64.rpm
rpm -ivh xinetd-2.3.15-14.el7.x86_64.rpm
2 服务启动
运行tftp-server有两种方式:
- 使用systemd 独立运行tftp-server
- 使用xinetd 来管理tftp-server
备注1:如果独立运行tftp-server 则步骤1中的就不需要安装 xinetd 。
备注2:使用1方式运行,配置在service下,2.2会讲到,改/etc/xinetd.d/tftp 配置文件是不起作用的
2.1 使用xinetd运行
使用xinetd 来运行tftp-server 需要修改配置文件 /etc/xinetd.d/tftp ,修改好后,启动xinetd即可。
# 配置文件 /etc/xinetd.d/tftp 主要修改两项
# server_args 添加一个 -c 参数,表示允许上传文件到tftp
# disable 修改为no 表示不禁用该服务
# 修改好的配置文件如下
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /var/lib/tftpboot -c
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
创建tftp服务的根目录 也就是 server_args 下的 -s 后边的参数
mkdir -p /var/lib/tftpboot
# 这里需要修改权限,否则会报错 权限不够
chmod 777 -R /var/lib/tftpboot
改好配置文件及添加目录后,启动xinetd,用如下命令
systemctl start xinetd
# 如果需要开机启动则设置如下
systemctl enable xinetd
#查看端口情况
netstat -nlput |grep 69
#查看xinetd服务状态
service xinetd status
看到端口结果后,即表示tftp服务启动成功。
备注1: 只用启动xinted就行,不用额外启动 tftp 。
备注2:网上看到哪里介绍好像说配置文件中的wait参数是否支持并发,我改成了no ,导致启动xinetd 后没启动tftp。看日志 /var/log/message 有一个warning。大致意思是说socket_type设置为dgram 不能设置wait为no;改成yes后成功启动。
2.2 独立运行tftp-server
独立运行tftp-server 的配置需要修改配置的地方在 /usr/lib/systemd/system/tftp.service 主要修改 ExecStart。
给他加上 -c 参数即可。
独立运行tftp-server 不需要安装和启动xinted。 如果本机有xinted在运行,可以把配置文件 /etc/xinetd.d/tftp 下的disable设置为true即可。
# vi /usr/lib/systemd/system/tftp.service
[Unit]
Description=Tftp Server
Requires=tftp.socket
Documentation=man:in.tftpd
[Service]
ExecStart=/usr/sbin/in.tftpd -c -p -s /var/lib/tftpboot
StandardInput=socket
[Install]
Also=tftp.socket
# 就修改ExecStart 添加 -c -p参数
修改保存后,使配置生效
# 使修改后的配置生效
systemctl daemon-reload
启动tftp
service tftp start
# 设置开机启动
systemctl enable tftp.service
3 测试
通过tftp客户端来测试tftp服务是否可用
# 在/root/temp 目录下创建一个文件用来做测试
echo 'abcd hello word!' > abc.txt
# 通过tftp上传文件
tftp 127.0.0.1 -c put abc.txt
#如果报错 time out 可能表示 tftp服务没安装好 (本地测试无网络问题)
#如果报错 Error code 0: Permission denied 可能是忘了修改tftp服务端根目录权限 本文设置的为 /var/lib/tftpboot
#如果报错 Error code 1: No such file or directory 可能原因是未设置 -c 参数
# 下载一个tftp服务端有的文件
tftp 127.0.0.1 -c get abc.txt
如果网络间测试,报错time out则可能是防火墙问题,建议关闭防火墙。
4 Docker部署及其他问题
- 由于tftp本身的一些特性,协议用的69端口,而传输数据用的是随机端口,所以在做docker端口映射的时候没办法解决。
当然,如果有docker的bridge网络,而且都是在这个网络内部,比如 容器app1 和容器tftp 都处于同一个docker网络,那么应该是可以正常使用tftp服务的;但是大部分时候,都是设备(网络设备之类)备份到tftp服务,所以没办法处于同一个bridge网络中。所以docker部署的问题暂时没有好的解决办法。
- 防火墙设置: 因为是传输数据是动态端口,本身对防火墙设置不太熟悉,暂时只能将防火墙关掉了。