- Рука помощи
- 1. Создание каталога для хранения данных tftp-сервера
- 2. Установка сервера
- 2.1 Установка tftpd-hpa
- 2.2 Установка atftpd
- 2.3 Установка и настройка tftpd
- 3. Устранение возможных проблем
- Заключение
- TFTP в Linux. Организация сервера TFTP
- Установка atftp в Linux
- Настройка TFTP сервера atftpd
- Запуск atftpd из командной строки
- Запуск atftpd автоматически при старте системы
- Запуск atftpd автоматически по запросу
Рука помощи
TFTP – простой протокол передачи файлов. В нем, в отличии от FTP, отсутствует авторизация. Используется в большей части для загрузки обновлений и конфигураций в сетевые устройства. В моей практике широко используется в работе с коммутаторами, также известно, что ряд АТС и телефонных аппаратов требуют наличия TFTP сервера для проверки обновлений и получения конфигурации при загрузке.
Предлагаю рассмотреть развертывание TFTP сервера на базе Ubuntu с учетом того, чтобы была возможность изменять его файлы посредством обычного FTP.
В Ubuntu доступно несколько TFTP-серверов, рассмотрим установку и настройку tftpd-hpa, atftpd и tftpd. Работать одновременно на 69 порту они не могут, так что Вам необходимо выбрать, какой именно сервер будет использоваться или в конфигурации указывать номер порта для каждого сервиса.
1. Создание каталога для хранения данных tftp-сервера
Я предлагаю пойти довольно простым путем. Создать пользователя tftp и в его домашней директории создать каталог, с которым будет работать tftp-сервера. Это обеспечит доступ по FTP при условии, если у Вас установлен FTP-сервер
# sudo adduser tftp
Добавляется пользователь «tftp» .
Добавляется новая группа «tftp» (1002) .
Добавляется новый пользователь «tftp» (1001) в группу «tftp» .
Создаётся домашний каталог «/home/tftp» .
Копирование файлов из «/etc/skel» .
Введите новый пароль UNIX:
Повторите ввод нового пароля UNIX:
passwd: password updated successfully
Changing the user information for tftp
Enter the new value, or press ENTER for the default
Full Name []: TFTP User
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Данная информация корректна? [Y/n] y
# sudo mkdir /home/tftp/tftp
# sudo chown tftp:tftp /home/tftp/tftp/
Пароль, который Вы укажете при создании пользователя, в дальнейшем используется при доступе по FTP для пользователя tftp
2. Установка сервера
2.1 Установка tftpd-hpa
В файле /etc/default/tftpd-hpa изменяем путь к tftp-каталогу и опции работы. Пример файла конфигурации
TFTP_USERNAME=»tftp» #Имя нашего пользователя
TFTP_DIRECTORY=»/home/tftp/tftp» #Путь к каталогу
TFTP_ADDRESS=»:69″ # IP-адрес и порт на котором работает сервер
TFTP_OPTIONS=»—secure —create» #—create – дает возможность производить запись, если ее не указать возможно только чтение
Перезапускаем сервис, чтобы изменения вступили в силу
2.2 Установка atftpd
sudo apt-get install atftpd
sudo touch /var/log/atftpd
Правим файл конфигурации /etc/default/atftpd на
USE_INETD=false
OPTIONS=»—tftpd-timeout 300 —retry-timeout 5 —mcast-port 1758 —mcast-addr 239.239.239.0-255 —mcast-ttl 1 —maxthread 100 —verbose=5 —port 69 —user tftp –group tftp —logfile /var/log/atftpd /home/tftp/tftp»
В примере конфигурационного файла указано ведение логов в файл /var/log/atftpd, если это Вам не нужно, уберите —logfile /var/log/atftpd
2.3 Установка и настройка tftpd
Это наиболее простой tftp-сервер, работает, как сервис inetd
В файле конфигурации /etc/inetd.conf
Данный TFTP-сервер «умеет» только отдавать файлы, но не принимает их.
3. Устранение возможных проблем
Посмотреть сервис, который занимает порт tftp
Если при работе сервера возникают ошибки, возможно, проблемы с правами доступа к каталогу. Для исправления прав доступа выполните:
Заключение
Для работы я предлагаю выбирать tftpd-hpa или atftpd, они имеют возможность «тонкой настройки», позволяя легко и быстро добиться нужного результата. В примере настроек, описанных выше, Вы сможете, как получать файлы, так и записывать их на TFTP-сервер, что полезно в случае, если необходимо хранить резервные копии конфигурации сетевого оборудования.
Если у Вас возникли вопросы, задавайте их в комментариях.
TFTP в Linux. Организация сервера TFTP
В репозиториях операционных систем на базе ядра Linux вы найдете множество серверов, реализующих протокол TFTP: некоторые делают упор на простоте конфигурации и малом потребление ресурсов, другие предоставляют расширенные возможности, но все они созданы с одной целью — принимать и отдавать файлы. Мы будем рассматривать настройку TFTP сервера в Linux на примере atftpd — сервера TFTP с расширенными возможностями. Будьте уверены, освоив atftpd, вы без труда справитесь с любым другим TFTP сервером в Linux.
Установка atftp в Linux
Попытка установить сервер atftpd из репозиториев приведет к установке еще одного сервера — одного из супер-серверов inet — демона, запускающего программы по событию, в данном случае по факту появления на 69 порту UDP запросов на подключение. Вы скажите: «А что же тут плохого?». Вообщем-то ничего, но если вы используете Debian версии 8 и выше или Ubuntu версии 15.04 и выше, то вы наверняка слышали о SystemD. SystemD — новый менеджер инициализации, пришедший на смену init. На конец 2015 года поддержка SystemD не реализована для серверов TFTP — мы сделаем это вручную. Поэтому, лучше устанавливать TFTP сервер из исходных текстов и сразу перейти в соответствующий раздел нашей статьи, но если вы всё же решили поизвести установку atftpd из репозиторией комадой
незабудьте остановить подтянувшийся inet и, собственно, сам atftpd
systemctl stop atftpd inetd
systemctl disable atftpd inetd
Для избежания недоразумений также рекоменду удалить скрипт запуска atftpd из /etc/init.d/
И стереть его упоминание из конфигурационного файла inet с помощью, например редактора nano:
nano /etc/inetd.conf #удалите строчку, начинающуюся с tftp
Избежать всего этого поможет сборка TFTP сервера из исходных текстов. Для этого нужно скачать архив с исходниками например c сайта sourceforge с помощью wget
wget http://downloads.sourceforge.net/project/atftp/atftp-0.7.1.tar.gz #версия может отличаться
tar -xzvf atftp-0.7.1.tar.gz #версия может отличаться
Перейти в каталог с распакованным содержимым
cd atftp-0.7.1 #версия может отличаться
Выполнить конфигурационный скрипт, указав в качестве папки назначения /opt/atftp (вы, конечно, можете выбрать любую другую папку)
И, наконец, собранные файлы, закинуть в папку назначения
На последок почистим за собой
и создадим символические ссылки на исполняемые файлы
ln -svi /opt/atftp/sbin/atftpd /sbin/
ln -svi /opt/atftp/bin/atftp /usr/bin/
Настройка TFTP сервера atftpd
TFTP сервер atftpd не читает никакой конфигурационный файл. Вместо этого все параметры ему передаются в качестве ключей запуска, например:
—logfile /PATH_TO_FLE #задает файл в который atftpd будет писать лог
—verbose=FROM_1_TO_7 # задает уровень документирования событий
—user USER.GROUP #задает от имени какого пользователя и группы будет запущен atftpd
—port PORT_NUMBER #задает UDP порт, который будет слушать сервер
—bind-address SERVER_IP_ADDRESS #задает IP адрес, который будет слушать сервер
В конце командной строки atftpd следует передать полный абсолютный путь до папки, в которой и будет осуществляться вся деятельность TFTP сервера в вашей ОС Linux
Далее мы рассмотрим несколько примеров сценариев запуска atftpd, в зависимости от которых нам понадобяться те или иные ключи запуска
Запуск atftpd из командной строки
Этот способ подойдет тем, хочет единовременно запустить TFTP сервер, отдать или принять файл и завершиться.
Минимальный набор команд будет такой:
atftpd —daemon —no-fork /mnt/share
Вы наверняка заметили два новых ключа запуска: «daemon» и «no-fork». Ключ «—daemon» заставляет atftpd «висеть» в ожидании соединения, а ключ «—no-fork» предотвращает его переход в фон. Когда все операции с передачей файлов будут завершены, мы сможете просто нажать Ctrl+C для завершения atftpd. Если же ключ «—no-fork» не использовать, то завершить процесс можно будет командой
Стоить отметить тот факт, что чтобы папка, которую мы передали TFTP серверу для работы, была доступна не только на чтение, но и на запись, нужно выдать это право обезличенному пользователю (anonymous), так как TFTP, как протокол, вообще не предусматривает никакой аутенфикации:
chmod -R o=rwx /mnt/share #папка может отличаться
Запуск atftpd автоматически при старте системы
Если вы хотите, чтобы atftpd запускался автоматически при старте компьютера, в системах на базе SystemD следует создать в дирректории /lib/systemd/system/ unit-файл atftpd.service для SystemD вот такого минимально содержания:
[Unit]
Description=Extended TFTP server
[Service]
Type=forking
ExecStart=/opt/sbin/atftpd —daemon /mnt/share
В параметре ExecStart нужно указать ту папку и бинарный файл atftpd, в которую вы его устанавливали, а также все ключи запуска, которые считаете нужными. Заметьте, что ключ «—no-fork» в данном случае противопоказан, а вот «—daemon» обязателен, так как по сценарию планируется, что atftpd будет «висеть» в системе постоянно, ожидая соединения
После того, как файл будет создан, нужно, чтобы SystemD перечитал свою конфигурацию
а затем активировать уже сам сервис:
systemctl enable atftpd.service
Теперь atftpd будет запускаться автоматически при старте системы. Вручную его можно запускать и останавливать командами
systemctl stop atftpd.service
systemctl start atftpd.service
Запуск atftpd автоматически по запросу
Мы с вами рассмотрели ситуацию, когда TFTP сервер atftpd, запущенный единожды при старте компьютера, остается «висеть» в системе, ожидая новых подключений. При этом вначале статьи упоминули, что при установке из репозиторией atftp тянет за забой супер-сервер inet, способный запускать atftpd только тогда, когда запрос реально поступает на сервер. Это очень удобно с той точки зрения, что пока TFTP не используется — он остановлен и не потребляет системных ресурсов. Так же мы отметили тот факт, что SystemD имеет такую функциональность «из коробки», и что необходимости теперь и в самом супер-сервере inet нет. Осталось научить SystemD это делать. Для этого SystemD должен сам слушать входящий порт на предмет поступления запросов и, в случае обнаружения, запустить atftpd и отдать ему сокет. Кроме того, после обработки соединения atftpd должен еще и корректно завершиться. Чтобы SystemD стал прослушить соответствующий UDP сокет, нужно создать unit-файл, описывающий этот сокет, и положить его туда же — в /lib/systemd/system/. При этом его имя должно соответствовать имени сервис-файла, который ему придеться запускать, за исключением суффикса, который нужно поменять с «.service» на «.socket». В нашем случае файл должен называться atftpd.socket. Создадим его вот с таким содержанием:
[Unit]
Description=TFTP socker for atftpd
Запись ListenDatagram=0.0.0.0:69 означает, что SystemD будет слушать порт UDP 69 на всех доступных ему IP адресах. Вы вправе (да и так будет лучше) указать конкретный IP адрес вашего сервера — это улучшит безопасность.
Но это еще не все. Раз мы выбрали способ запуска по событию, мы не хотим более, чтобы atftpd запускался автоматически при старте системы. Выключим его:
systemctl disable atftpd.service
И сам service-файл /lib/systemd/system/atftpd.service тоже подкорректируем:
- убираем ключ «—daemon» — мы больше не хотим, чтобы atftpd «висел» в системе постоянно
- добавляем ключ «—tftpd-timeout 10» — TFTP сервер корректно завершиться, если в течение 10 сек. к нему не поступит более обращений
- добавляем параметр StandartInput=socket в секцию [Service], чтобы SystemD передавал сокет с данными на вход atftpd
- удаляем секцию [Install] целиком — мы больше не хотим, чтобы atftpd запускался при старте системы
Должно получиться что-то вроде этого:
[Unit]
Description=Extended TFTP server
[Service]
ExecStart=/opt/atftp/sbin/atftpd —verbose=7 —logfile /var/log/atftpd —tftpd-timeout 10 /mnt/share
StandardInput=socket
Не забываем перечитывать конфигурацию SystemD:
И активируем наш сокет-файл
systemctl enable atftpd.socket
Можно перезагрузиться, можно включить сокет вручную:
systemctl start atftpd.socket
Можно увидеть, что порт 69 прослушивает некий «init», который на самом деле является символической ссылкой на SystemD
udp 0 0 0.0.0.0:69 0.0.0.0:* 1/init
При этот, если вы обратитесь к серверу каким-нибудь tftp клиентом, SystemD запустит atftpd и передаст ему клиента. А после того, как передача файлов завершиться, atftpd по истечению таймаута корректно завершиться.