Задача состоит в том, чтобы установить и настроить 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
# 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
....
#: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
....
#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"
....
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".
--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>
Sent 7 bytes in 0.0 seconds
tftp>
TFTP-сервер он на то и сервер, чтобы запускаться вместе с компьютером и корректно завершать работу с его выключением. Так-то оно так, но в данном конкретном случае нам это совсем ни к чему. Воспользуемся утилитой управления уровнями запуска "update-rc.d" для удаления всех символических ссылок на скрипт управления TFTP-сервера, оставляя таковой для ручного управления:
# update-rc.d -f atftpd remove
22 ноября 2011 в 23:47
23 ноября 2011 в 10:20
24 августа 2012 в 09:28
24 августа 2012 в 14:22