使用 tftpd-hpa (推荐) 和 使用 atftpd,并附上详细的步骤和防火墙配置。

使用 tftpd-hpa (推荐)
tftpd-hpa 是一个流行的、功能丰富的 TFTP 服务器实现,适用于大多数现代 Linux 发行版。
第 1 步:安装 TFTP 服务器
以 Debian/Ubuntu 为例,使用 apt 安装:
sudo apt update sudo apt install tftpd-hpa
以 CentOS/RHEL/Fedora 为例,使用 yum 或 dnf 安装:
# 对于 CentOS/RHEL 7/8 sudo yum install tftp-server # 对于 Fedora/CentOS Stream/RHEL 9 sudo dnf install tftp-server
第 2 步:创建 TFTP 根目录和测试文件
TFTP 服务器需要一个根目录,所有传输的文件都存放在这里,通常我们放在 /var/lib/tftpboot。

-
创建目录 (如果不存在):
sudo mkdir -p /var/lib/tftpboot
-
设置目录权限: TFTP 服务器通常以
nobody或tftp用户身份运行,这个用户需要对目录有读写权限。# 将目录所有者改为 tftp 用户 (在 Debian/Ubuntu 上是 tftp,在 RHEL/CentOS 上是 nobody) # 对于 Debian/Ubuntu: sudo chown -R tftp:tftp /var/lib/tftpboot # 对于 RHEL/CentOS: sudo chown -R nobody:nobody /var/lib/tftpboot # 给予目录读写和执行权限 (x 对于进入目录至关重要) sudo chmod -R 777 /var/lib/tftpboot
注意:
777权限比较宽松,便于测试,在生产环境中,你应该根据最小权限原则设置更严格的权限,755。 -
放入一个测试文件: 为了方便测试,我们可以在根目录里放一个文件。
(图片来源网络,侵删)echo "Hello from TFTP Server!" | sudo tee /var/lib/tftpboot/test.txt
第 3 步:配置 TFTP 服务器
编辑 TFTP 服务器的配置文件。
-
对于 Debian/Ubuntu (
tftpd-hpa): 配置文件是/etc/default/tftpd-hpa,使用nano或vim打开它:sudo nano /etc/default/tftpd-hpa
修改或确保以下内容存在:
TFTP_USERNAME="tftp" TFTP_DIRECTORY="/var/lib/tftpboot" TFTP_ADDRESS=":69" TFTP_OPTIONS="--secure --create"--secure:这是一个非常重要的安全选项,它限制了 TFTP 客户端只能从TFTP_DIRECTORY目录中读取文件,并且不能写入到该目录之外。--create:允许客户端创建新文件(即上传文件)。
-
对于 RHEL/CentOS (
xinetd方式): 在较新的 RHEL/CentOS 版本中,tftp-server通常由xinetd超级服务器管理。- 编辑配置文件:
sudo nano /etc/xinetd.d/tftp
- 找到
server_args这一行,确保它指向你的 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 disable = no per_source = 11 cps = 100 2 flags = IPv4 }server_args = -s /var/lib/tftpboot:-s选项指定了 TFTP 的根目录。
- 编辑配置文件:
第 4 步:启动并启用 TFTP 服务
-
对于 Debian/Ubuntu (
systemd):# 重启 tftpd-hpa 服务以应用新配置 sudo systemctl restart tftpd-hpa # 将服务设置为开机自启 sudo systemctl enable tftpd-hpa # 检查服务状态 sudo systemctl status tftpd-hpa
-
对于 RHEL/CentOS (
xinetd):- 启用并启动
xinetd服务:sudo systemctl enable --now xinetd
- 检查
xinetd状态:sudo systemctl status xinetd
tftp服务没有生效,可以尝试重启xinetd:sudo systemctl restart xinetd
- 启用并启动
第 5 步:配置防火墙
Linux 系统的防火墙默认会阻止 TFTP 请求(UDP 端口 69)。
-
对于使用
ufw(Uncomplicated Firewall) 的系统 (如 Ubuntu):# 允许 TFTP 服务 (它会自动开放 UDP 69 端口) sudo ufw allow tftp # 重新加载防火墙规则 (ufw allow 会自动加载) # sudo ufw reload
-
对于使用
firewalld的系统 (如 CentOS/RHEL/Fedora):# 添加永久规则,并立即生效 sudo firewall-cmd --permanent --add-service=tftp sudo firewall-cmd --reload
第 6 步:测试 TFTP 服务器
在另一台 Linux 机器上(或者在服务器上使用 localhost),安装 tftp 客户端工具(如果尚未安装):
# Debian/Ubuntu sudo apt install tftp # RHEL/CentOS sudo yum install tftp
现在进行测试:
-
下载文件:
# 从服务器下载 test.txt 文件到当前目录 tftp <你的服务器IP地址> -c get /test.txt
检查当前目录下是否出现了
test.txt文件,并用cat test.txt查看内容。 -
上传文件:
# 创建一个新文件用于上传 echo "This is a test file for upload." > upload.txt # 将 upload.txt 上传到服务器的 /upload.txt tftp <你的服务器IP地址> -c put upload.txt /upload.txt
然后回到 TFTP 服务器上,检查
/var/lib/tftpboot目录下是否存在upload.txt文件。
如果以上命令都成功执行,那么你的 TFTP 服务器就配置成功了!
使用 atftpd
atftpd 是另一个 TFTP 服务器实现,它更注重性能和并发。
安装
# Debian/Ubuntu sudo apt install atftpd # RHEL/CentOS (可能需要 EPEL 源) sudo yum install atftpd
配置
atftpd 的配置相对简单,通常通过命令行参数或启动脚本设置。
-
创建目录和文件 (与方法一相同)
-
创建 systemd 服务文件 (如果不存在) 在
/etc/systemd/system/目录下创建一个名为atftpd.service的文件:sudo nano /etc/systemd/system/atftpd.service ```如下:
[Unit] Description=Advanced TFTP Server After=network.target
[Service] Type=simple ExecStart=/usr/sbin/atftpd --daemon --port 69 --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.255.8.8 --maxthread 100 --verbose=5 /var/lib/tftpboot Restart=on-failure
[Install] WantedBy=multi-user.target
这里的核心是 `ExecStart`,它指定了 TFTP 的根目录是 `/var/lib/tftpboot`。 -
启动并启用服务
sudo systemctl daemon-reload sudo systemctl start atftpd sudo systemctl enable at
