如何在debian中安装和配置tftpd

tftp服务类似FTP服务,但它短小精干,仅适合于小文件的传输,所以大多数网络设备都选择tftp作为配置文件备份、firmware升级等操作的默认传输方式。

tftp采用的是C/S架构,由服务端和客户端组成,其中网络设备就是客户端。

1. tftp服务端

tftp服务端有多个选择,debian的官方文档推荐的是tftpd-hpa,那我们就用它吧。

# aptitude install tftpd-hpa

1.1 启动方式

有两种启动方式:

  1. daemon

    这种方式适用于使用频率高的场景,不论是否有tftp客户端连接,tftpd进程都将常驻内存,一直监听69端口,这种方式的优点是响应迅速;

  2. xinetd
    该方式适用于偶尔使用的场景,由xinetd监听69端口,tftpd进程处于休眠状态,只有当tftp客户端尝试连接69端口的时候,才由xinetd唤醒tftpd进程,这种方式比较节省资源,并且安全性高,当然响应速度就稍慢一些;当一段时间内没有tftp客户端活动,xinetd便会终止tftpd进程。

下面是xinetd方式的一个完整历程:

xinetd监听69端口

root@netmgmt-deb6:/etc/xinetd.d# lsof -i -P | grep 69
xinetd  1720  root    5u  IPv4   7516      0t0  UDP *:69

当tftp客户端发起一个连接,准备上传文件时,xinet会激活tftpd进程进行监听

root@netmgmt-deb6:/etc/xinetd.d# lsof -i -P | grep 69
xinetd   1720  root    5u  IPv4   7516      0t0  UDP *:69
in.tftpd 1747  root    0u  IPv4   7516      0t0  UDP *:69

过一段时间后,xinetd发现没有tftp客户端的活动,则终止tftpd进程

root@netmgmt-deb6:/etc/xinetd.d# lsof -i -P | grep 69
xinetd  1720  root    5u  IPv4   7516      0t0  UDP *:69

建议选择使用xinetd方式启用tftpd。

1.2 配置(xinetd方式)

在Debian中,tftpd-hpa默认以daemon方式启动,所以需要先禁用该特性:

# vim /etc/default/tftp-hpa
...
RUN_DAEMON="no"
...

接着添加/etc/xinetd.d/tftpd

# vim /etc/xinetd.d/tftpd
service tftp
{
protocol        = udp
socket_type     = dgram
wait            = yes
user            = root
server          = /usr/sbin/in.tftpd
server_args     = -c -s /srv/tftp
disable         = no
}

然后修改/srv/tftp的属性

# chown nobody:nogroup /srv/tftp
# chmod 755 /srv/tftp

/srv/tftp是tftp-hpa默认目录,为了方便起见,我放大了该目录的读写权限,读者可以根据自己的情况自行修改

最后重启xinetd:/etc/init.d/xinetd restart

至此,完成了tftpd服务端的安装和配置。有了服务端,接下来安装客户端方便调试。

2. tftp客户端

# aptitude install tftp

测试一下:

netmgmt-deb6:/home# touch foo
netmgmt-deb6:/home# touch /srv/tftp/bar
netmgmt-deb6:/home# tftp localhost
tftp> put foo # 上传
tftp> get bar # 下载

3. troubleshooting

1、H3C 3600上传文件失败

sw_CORE>tftp config xx xx

  File will be transferred in binary mode.
  Sending file to remote tftp server. Please wait...
  Can't find source file .

原因:tftpd进程尚未启动。

2、tftp客户端上传文件时出现Transfer timed out

原因:tftpd进程尚未启动。

3、tftpd服务起不来

原因:/etc/xinetd.d/tftpd中的语法有误

# cat /etc/xinetd.d/tftpd
service tftpd
{
...
}

service tftp误写成service tftpd,导致in.tftpd无法正常启动

4. TIPS

  • 当xinetd停掉的时候,in.tftpd进程不会自动停止,还需要/etc/init.d/tftpd stop