Налаштування TFTP сервера в Linux, HippoLab - блог системного адміністратора
У репозиторіях операційних систем на базі ядра 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 з репозиторією комадою
apt-get install atftpd
Не забудьте зупинити inet, що підтягнувся, і, власне, сам atftpd
systemctl stop atftpd inetd
А також вимкнути їх
systemctl disable atftpd inetd
Для уникнення непорозумінь також рекомендую видалити скрипт запуску atftpd з /etc/init.d/
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 (ви, звичайно, можете вибрати будь-яку іншу папку)
Створити цю папку
І, нарешті, зібрані файли, закинути в папку призначення
Наостанок почистимо за собою
cd .. rm -R atftp-0.7.1
і створимо символічні посилання на файли, що виконуються.
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 порт, який слухатиме сервер
В кінці командного рядка 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 автоматично на запит
[Unit] Description=TFTP socker for atftpd
Але це ще не все. Якщо ми вибрали спосіб запуску за подією, ми не хочемо більше, щоб 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
netstat -lupvn grep 69
Можна побачити, що порт 69 прослуховує якийсь "init", який насправді є символічним посиланням на SystemD
udp 0 0 0.0.0.0:69 0.0.0.0:* 1/init
При цьому, якщо ви звернетеся до сервераяким-небудь tftp клієнтом SystemD запустить atftpd і передасть йому клієнта. А після того, як передача файлів завершиться, atftpd після закінчення таймауту коректно завершиться.