Сегодня статья будет маленькая. Вообще, на мой взгляд всё довольно просто, но поскольку CentOS8 вышел недавно, гайдов на него мало, а конкретно про tftp под CentOS я видел в Интернете много откровенно вредных советов, поэтому постараюсь задать трэнд на исправление ситуации прямо с момента выхода новой версии. Итак, приступим (к набору тёх жалких пяти команд, которые нам нужны). Для начала установим все требующиеся пакеты:

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)


  1. vodopad
    06.10.2019 18:00

    На мой взгляд, статью можно существенно сократить. Статья про установку и настройку tftp всё-таки, не стоит так много делать акцент на vim…

    Но спасибо.


  1. vodopad
    06.10.2019 18:17
    +1

    И почему выбран вариант с xinetd? Почему не systemd-socket, который является более модным и современным?

    computingforgeeks.com/how-to-setup-a-tftp-server-on-centos-rhel-8 — вот пример.


    1. gecube
      06.10.2019 19:44

      Поддержу. Я тоже не понял зачем тащить xinetd.
      Отдельный вопрос — я так понимаю, что при активации через сокет — первый запрос к тфтп инициирует его запуск как демона, поэтому вызывающая сторона вероятно может по тайм-аут отвалиться?
      Зато второй запрос обработается как надо ?


      1. 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.


        1. gecube
          06.10.2019 20:52

          Ну, это все понятно. Но я говорил именно о времени между принятием запроса на сокет и полноценным стартом демона и передачей запроса ему.


          1. vodopad
            06.10.2019 20:54

            tftp запускается очень быстро, не думаю, что отвалится по таймауту.


          1. nioliz Автор
            10.10.2019 19:27

            Никаких задержек нет.


  1. Mako_357
    06.10.2019 22:08

    Centos 8 вышел. Спасибо, не знал. Я думал их прикрыли после выкупа RH


  1. tbp2k5
    06.10.2019 22:22
    +1

    Мне кажется или вся разница в вашей инструкции по сравнению с такой-же для CentOS 7: замена «yum» на «dnf»?