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

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

1. tftp服务端

tftp服务端有多个选择,debian的官方文档推荐的是tftpd-hpa

$ sudo 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端口

    $ sudo lsof -i -P | grep 69
    xinetd  1720  root    5u  IPv4   7516      0t0  UDP *:69

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

    $ sudo 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进程

    $ sudo lsof -i -P | grep 69
    xinetd  1720  root    5u  IPv4   7516      0t0  UDP *:69

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

1.2 配置(xinetd方式)

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

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

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

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

然后修改/srv/tftp的属性

$ sudo chown nobody:nogroup /srv/tftp
$ sudo chmod 755 /srv/tftp

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

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

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

2. tftp客户端

$ sudo aptitude install tftp

测试一下:

$ sudo touch foo
$ sudo touch /srv/tftp/bar
$ sudo tftp localhost
tftp> put foo # 上传
tftp> get bar # 下载

3. troubleshooting

  1. H3C 3600上传文件失败

    h3c-3600>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中的语法有误

$ sudo cat /etc/xinetd.d/tftpd
service tftpd
{
...
}

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

4. TIPS

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