Centos 安装 tftp服务

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有两种方式:

  1. 使用systemd 独立运行tftp-server
  2. 使用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部署及其他问题

  1. 由于tftp本身的一些特性,协议用的69端口,而传输数据用的是随机端口,所以在做docker端口映射的时候没办法解决。

当然,如果有docker的bridge网络,而且都是在这个网络内部,比如 容器app1 和容器tftp 都处于同一个docker网络,那么应该是可以正常使用tftp服务的;但是大部分时候,都是设备(网络设备之类)备份到tftp服务,所以没办法处于同一个bridge网络中。所以docker部署的问题暂时没有好的解决办法。

  1. 防火墙设置: 因为是传输数据是动态端口,本身对防火墙设置不太熟悉,暂时只能将防火墙关掉了。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容