UMGUM.COM (лучше) 

TFTP ( ATFTPd + Linux Debian Squeeze. )

22 ноября 2011  (обновлено 15 августа 2016)

OS: Debian GNU/Linux Squeeze.

Задача состоит в том, чтобы установить и настроить TFTP-сервер для непериодического редкого использования. TFTP (Trivial File Transfer Protocol, использует для подключения 69-ый порт UDP) создан специально для простейшей, практически неуправляемой передачи данных, довольно давно, примерно в 1980 году, и, в силу своей предельной простоты и отсутствия необходимости, с тех пор не изменялся. Протокол примитивен настолько, что реализация сервера не подразумевает никакой вариантности; в связи с чем мы не наблюдаем для него массы разнообразного программного обеспечения - практически для Linux есть только сервер "tftpd" и клиент "tftp".

Сервер "tftpd" написан ещё в те времена, когда принято было порты прослушивать "супер-сервером" (например: "inetd") с последующей трансляцией запросов и ответов на обработку соответствующему приложению. Ныне это не модно и не к чему. У меня, на сотни поддерживаемых сервисов нигде не используется "inetd"; дополнительно устанавливать его на ноутбук, ради прошивки раз в месяц или квартал какого-нибудь оборудования, мне не представляется рациональным.

Запрос типа "tftp+standalone" в поисковой системе выдал мне в виде результата рекомендацию присмотреться к серверу "atftpd" (Advanced TFTPD). Не уверен, но похоже на то, что это "форк" "tftpd", с несколько расширенным набором параметров запуска и возможностью самостоятельного обслуживания сетевых соединений. Сервер "atftpd" может работать в двух режимах: полной эмуляции классического "tftpd", для чего создаются соответствующие символические ссылки и необходимые настройки спарки с "inetd", и автономного сетевого приложения-сервера. Этой самой, второй, возможностью мы и воспользуемся далее.


Первые TFTP-серверы работали со специально выделенной для этого директорией "/tftpboot", элементарно не принимая обращения за пределы таковой. После, в связи с изменением взгляда на организацию файлового пространства в UNIX системах, ему выделили директорию "/srv/tftp". Сейчас, как мне думается, и это место не совсем удобно. Все современные реализации TFTP-серверов умеют не выпускать подключившегося клиента из выделенной серверу директории, представляя её как корневую, используя функционал "chroot", в связи с чем считаю размещение хозяйства TFTP-сервера где-нибудь в "/var/lib/tftp" более уместным.

Создаём необходимые для работы директории и файлы:

# mkdir -p /var/lib/tftp
# mkdir -p /var/log/tftp
# touch /var/log/tftp/atftpd.log
# chown -R nobody:nogroup /var/lib/tftp /var/log/tftp
# chmod -R o-rwx /var/lib/tftp

Загружаем и устанавливаем пакеты сервера "atftpd" и традиционного клиента "tftp", без рекомендованных пакетов сервиса "inetd":

# aptitude install --without-recommends atftpd tftp

Первым делом нужно пройти в конфигурационный файл "супер-сервера" и заблокировать строку инициализации "tftpd" или "atftpd" в "/etc/inetd.conf", если она там ещё имеется:

# cat /etc/inetd.conf

....
#:BOOT: TFTP service is provided primarily for booting
#tftp  dgram  udp  wait  nobody  /usr/sbin/tcpd  /usr/sbin/in.tftpd -s /var/lib/tftp
....

Далее следует явно указать на отсутствие необходимости в использовании "inetd", установив соответствующее значение переменной "USE_INETD" в файлах "/etc/default/atftpd" и "/etc/init.d/atftpd":

....
#USE_INETD=true
USE_INETD=false
....

В скрипте управления сервером "/etc/init.d/atftpd" переменой "OPTIONS" передаём параметры запуска:

....
OPTIONS="--logfile /var/log/tftp/atftpd.log --user nobody --bind-address 0.0.0.0 --no-multicast /var/lib/tftp"
....

Где:

--logfile - указываем имя уже существующего файла для журналирования;
--user - указываем максимально непривилегированного пользователя для запуска сервиса от его имени;
--bind-address - указываем IP, запросы на который будут приниматься сервером;
--no-multicast - указываем на то, что сервер работает только по прямым подключениям, не отвечая на "multicast" или "broadcast";
directory - в конце строки указываем имя директории, с которой будет работать TFTP-сервер в режиме "chroot".

Запускаем сервер:

# /etc/init.d/atftpd start

Ищем его в списке запущенных приложений:

# ps wax | grep -i atftp

4730 ?  Ss  0:00 /usr/sbin/atftpd --daemon --user nobody --bind-address 0.0.0.0 --no-multicast /var/lib/tftp

Проверяем, тот-ли порт он прослушивает, что положено:

# netstat -apn | grep -i atftp

udp  0  0 0.0.0.0:69  0.0.0.0:*  4691/atftpd

Запускаем клиента и пробуем передать и получить файлы:

$ tftp 127.0.0.1

tftp> put /tmp/test /test
Sent 7 bytes in 0.0 seconds
tftp>

TFTP-сервер он на то и сервер, чтобы запускаться вместе с компьютером и корректно завершать работу с его выключением. Так-то оно так, но в данном конкретном случае нам это совсем ни к чему. Воспользуемся утилитой управления уровнями запуска "update-rc.d" для удаления всех символических ссылок на скрипт управления TFTP-сервера, оставляя таковой для ручного управления:

# update-rc.d -f atftpd remove


Заметки и комментарии к публикации:


Оставьте свой комментарий ( выразите мнение относительно публикации, поделитесь дополнительными сведениями или укажите на ошибку )