Сегодня статья будет маленькая. Вообще, на мой взгляд всё довольно просто, но поскольку CentOS8 вышел недавно, гайдов на него мало, а конкретно про tftp под CentOS я видел в Интернете много откровенно вредных советов, поэтому постараюсь задать трэнд на исправление ситуации прямо с момента выхода новой версии. Итак, приступим (к набору тёх жалких пяти команд, которые нам нужны). Для начала установим все требующиеся пакеты:
Теперь создадим (или исправим) файл конфигурации xinetd так, чтобы он запускал сервер tftp при обращении к соответствующему порту, это можно делать через стандартный редактор vi, через nano, который большинству людей привычнее или через vim, отличающийся от входящего в состав системы по умолчанию vi тем, что имеет более широкий функционал, включая подсветку синтаксиса. Я предпочитаю последний пункт, поэтому последним словом в приведенной выше команде был именно этот редактор. Если кого-то устраивают имеющиеся в системе редакторы, vim можно не ставить (хотя помимо использования дополнительных 60 МБ дискового пространства, хуже он тоже не сделает).
Тут надо перейти в режим вставки текста (набрать :set paste и ввод), потом редактирования (клавиша Insert на клавиатуре), потом выделить приведенный ниже конфигурационный файл, скопировать и вставить в окно терминала.
Когда будете редактировать текст конфига, обратите пожалуйста внимание на аргумент server_args. В конце строки задан путь к каталогу, где будут лежать файлы, отдаваемые по tftp. Поменяйте этот каталог на тот, который должен использоваться у вас. Также сразу хочу сказать, что на работу с этим каталогом надо будет настроить tftp сервер в SeLinux, конфигурации «по умолчанию» для tftp сервера в CentOS'е нет. Сейчас я про настройку SeLinux писать не буду, потому что потом как-нибудь подготовлю отдельную статью на эту тему.
Далее, нажать Esc, а потом ":wq" и ввод.
Теперь включаем сервер:
Да, вешать в автозагрузку tftpd не требуется, хоть это и не совсем очевидно.
Далее, надо проверить, что всё работает. Создаём какой-нибудь файл и пытаемся его скачать (я делал для популярного пути хранения файлов, если он у вас другой — измените его тут):
Если в консоли появилось слово «passed», значит сервер работает. Если из локальной сети он при этом будет не доступен — разбирайтесь с зонами в firewalld, мы сделали доступ для зоны public, не всем доступ к tftp нужен именно из неё.
P.S. Если будут вопросы в комментариях, объясню как перевести centos 8 с firewalld на iptables, но ИМХО принципиальной разницы между ними нет.
sudo dnf -y install xinetd tftp-server tftp vim
Теперь создадим (или исправим) файл конфигурации xinetd так, чтобы он запускал сервер tftp при обращении к соответствующему порту, это можно делать через стандартный редактор vi, через nano, который большинству людей привычнее или через vim, отличающийся от входящего в состав системы по умолчанию vi тем, что имеет более широкий функционал, включая подсветку синтаксиса. Я предпочитаю последний пункт, поэтому последним словом в приведенной выше команде был именно этот редактор. Если кого-то устраивают имеющиеся в системе редакторы, vim можно не ставить (хотя помимо использования дополнительных 60 МБ дискового пространства, хуже он тоже не сделает).
sudo vim /etc/xinetd.d/tftp
Тут надо перейти в режим вставки текста (набрать :set paste и ввод), потом редактирования (клавиша Insert на клавиатуре), потом выделить приведенный ниже конфигурационный файл, скопировать и вставить в окно терминала.
Когда будете редактировать текст конфига, обратите пожалуйста внимание на аргумент server_args. В конце строки задан путь к каталогу, где будут лежать файлы, отдаваемые по tftp. Поменяйте этот каталог на тот, который должен использоваться у вас. Также сразу хочу сказать, что на работу с этим каталогом надо будет настроить tftp сервер в SeLinux, конфигурации «по умолчанию» для tftp сервера в CentOS'е нет. Сейчас я про настройку SeLinux писать не буду, потому что потом как-нибудь подготовлю отдельную статью на эту тему.
# default: off
# description: The tftp server serves files using the trivial file transfer # protocol. The tftp protocol is often used to boot diskless # workstations, download configuration files to network-aware printers, # and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -v -s /var/lib/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
Далее, нажать Esc, а потом ":wq" и ввод.
Теперь включаем сервер:
sudo systemctl start xinetd
sudo systemctl enable xinetd
sudo firewall-cmd --permanent --zone=public --add-service=tftp && sudo firewall-cmd --reload
Да, вешать в автозагрузку tftpd не требуется, хоть это и не совсем очевидно.
Далее, надо проверить, что всё работает. Создаём какой-нибудь файл и пытаемся его скачать (я делал для популярного пути хранения файлов, если он у вас другой — измените его тут):
echo passed > ~/test.txt
sudo mv ~/test.txt /var/lib/tftpboot
tftp 127.0.0.1 -c get test.txt
cat test.txt
Если в консоли появилось слово «passed», значит сервер работает. Если из локальной сети он при этом будет не доступен — разбирайтесь с зонами в firewalld, мы сделали доступ для зоны public, не всем доступ к tftp нужен именно из неё.
P.S. Если будут вопросы в комментариях, объясню как перевести centos 8 с firewalld на iptables, но ИМХО принципиальной разницы между ними нет.
Комментарии (9)
vodopad
06.10.2019 18:17+1И почему выбран вариант с xinetd? Почему не systemd-socket, который является более модным и современным?
computingforgeeks.com/how-to-setup-a-tftp-server-on-centos-rhel-8 — вот пример.gecube
06.10.2019 19:44Поддержу. Я тоже не понял зачем тащить xinetd.
Отдельный вопрос — я так понимаю, что при активации через сокет — первый запрос к тфтп инициирует его запуск как демона, поэтому вызывающая сторона вероятно может по тайм-аут отвалиться?
Зато второй запрос обработается как надо ?vodopad
06.10.2019 20:03Нет, всё корректно обрабатывается с первого запуска.
Достаточно включить сокет и засунуть его в автозапуск: systemctl enable --now tftp.socket
Подробнее про сокеты:
Socket units on the other hand don't actually start daemons on their own. Instead, they just sit there and listen on an IP address and a port, or a UNIX domain socket, and when something connects to it, the daemon that the socket is for is started and the connection is handed to it.
This is useful for making sure that big daemons that take up a lot of resources but are rarely used aren't running and taking up resources all the time, but instead they are only started when needed.
tbp2k5
06.10.2019 22:22+1Мне кажется или вся разница в вашей инструкции по сравнению с такой-же для CentOS 7: замена «yum» на «dnf»?
vodopad
На мой взгляд, статью можно существенно сократить. Статья про установку и настройку tftp всё-таки, не стоит так много делать акцент на vim…
Но спасибо.