Инструкция по настройке TFTP
Появилась необходимость поднять в сети сервер TFTP (Trivial File Transfer Protocol — простой протокол передачи файлов. В отличие от FTP, он не содержит возможности аутентификации и основан на транспортном протоколе UDP). Он понадобился для закачки новых версий прошивок на cisco-роутеры, cisco-телефоны, маршрутизаторы dell и 3com, для выполнения автоматического сохранения конфигурация различного сетевого оборудования.
______________________
За основу была взята статья Алексея Цветного с сайта OpenNET.
Мой TFTP-сервер будет работать под управлением FreeBSD 7.2-RELEASE и представлять собой пакет tftp-hpa-0.49.
(после нескольких “гневных” отзывов, что приведенный ниже алгоритм не работает, несколько переделал статью. теперь все написанное справедливо для FreeBSD 8.4, 10.0, 10.1 (такие системы в моём подчинении) с установленным пакетом tftp-hpa
# pkg info | grep tftp tftp-hpa-5.2 Advanced tftp server
а на самом деле вся беда заключалась в неправильных кавычках в скрипте запуска…)
Установка порта tftp-hpa:
# cd /usr/ports/ftp/tftp-hpa/ # make config # make install clean
Так как tftp-сервер будет запускаться как самостоятельный сервис, для увеличения безопасности необходимо создать непривилегированного пользователя, от имени которого будут запускаться все дочерние процессы, а так же его группу. Добавляем новую группу:
# pw groupadd tftpd
Добавляем нового пользователя:
# pw useradd tftpd -c tftp_manager -d /nonexistent -g tftpd -s /usr/sbin/nologin
Проверяем:
# vipw # $FreeBSD: src/etc/master.passwd,v 1.40.20.1 2009/04/15 03:14:26 kensmith Exp $ # ... tftpd:*:1005:1004::0:0:tftp_manager:/nonexistent:/usr/sbin/nologin ...
Выход из текстового редактора vi :q
+ ввод.
Теперь необходимо создать рабочий каталог, в который будет осуществляться chroot и где будут храниться необходимые нам файлы. Пусть это будет /home/tftp
# mkdir /home/tftp
Дадим права доступа на него для только что созданных пользователя и группы, а так же запретим другим непривилегированным пользователям доступ в этот каталог:
# chown tftpd:tftpd /home/tftp # chmod 750 /home/tftp
По-умолчанию все протоколирование будет вестись в файл лог /var/log/xferlog
.
Теперь создадим конфигурационный файл обработки скачиваемых/закачиваемых файлов. Для безопасности все имена файлов прозрачно будут преобразовываться при записи из ИМЯ в IP-ИМЯ, а при чтении наоборот – из IP-ИМЯ в ИМЯ. Это позволит ограничить доступ к файлам, основываясь на IP-адресе клиента. Т.е. одно и тоже имя файла от абсолютно разных хостов на сервере будет сохраняться под разными именами и у каждого хоста будет доступ только к своей копии файла.
# touch /usr/local/etc/tftpd-remap.conf # chmod 440 /usr/local/etc/tftpd-remap.conf # chown tftpd:tftpd /usr/local/etc/tftpd-remap.conf
Добавьте в этот файл /usr/local/etc/tftpd-remap.conf с помощью вашего любимого текстового редактора следующие строки:
# Rename all files # If WRQ: filename -> IP-filename # If RRQ: IP-filename -> filename r .* \i-\0
Теперь необходимо переделать стартовый скрипт tftp-hpa под наши нужды. Скопируйте существующий скрипт /usr/local/etc/rc.d/tftpd
куда-нибудь и внесите в него следующие изменения (напоминаю, что все кавычки – прямые "
!):
#!/bin/sh # PROVIDE: tftpd # REQUIRE: DAEMON # BEFORE: LOGIN # KEYWORD: shutdown . /etc/rc.subr name=“tftpd” rcvar=tftpd_enable load_rc_config $name : ${tftpd_enable=“NO”} : ${tftpd_pidfile=”/var/run/tftpd.pid”} : ${tftpd_remapfile=”/usr/local/etc/tftpd-remap.conf”} : ${tftpd_datadir=”/home/tftp”} : ${tftpd_flags=”-vcps -u tftpd -U 037 -B 1468”} extra_commands=“reload” start_cmd=“tftpd_start” stop_postcmd=“tftpd_poststop” reload_cmd=“tftpd_reload” required_files=”/usr/local/etc/tftpd-remap.conf” pidfile=$tftpd_pidfile procname=”/usr/local/libexec/in.tftpd” tftpd_start() { /bin/echo -n “Starting tftpd” /usr/local/libexec/in.tftpd $tftpd_flags -l -m $tftpd_remapfile $tftpd_datadir /bin/ps x | /usr/bin/grep in.tftpd | /usr/bin/grep -v grep | /usr/bin/awk ‘{print $1}’ > $tftpd_pidfile /bin/echo “.” } tftpd_poststop() { /bin/rm -f $tftpd_pidfile } tftpd_reload() { /bin/kill -1 `cat $tftpd_pidfile` } run_rc_command “$1”
Нам осталось разрешить запуск этого скрипта в /etc/rc.conf
, добавив в него следующие строчки:
tftpd_enable="YES" tftpd_flags="-4 -vcps -u tftpd -U 037 -B 1468"
И конечно же, если у вас работает файервол, надо разрешить в его настройках доступ к вашему tftp-серверу. Я использую pf и мои настройки выглядят так:
#tftp pass in quick on $int_if proto {tcp,udp} from $int_net to $int_addr port 69 pass in quick on $int_if proto {tcp,udp} from $int_net to $int_addr port {1024:65535} pass in quick on $ext_if proto {tcp,udp} from $some_host to $ext_addr port 69 pass in quick on $ext_if proto {tcp,udp} from $some_host to $ext_addr port {1024:65535}
Где:
- $int_if – внутренний интерфейс сервера;
- $ext_if – внешний интерфейс сервера;
- $int_net – внутренняя сеть (которой вы доверяете);
- $int_addr – внутренний ip-адрес;
- $ext_addr – внешний ip-адрес;
- $some_host – некоторый внешний хост, который будет работать с вашим tftp-сервером.
Теперь запустим наш tftp-сервер:
# /usr/local/etc/rc.d/tftpd start Starting tftpd.
Проверим, что демон работает:
# ps -x | grep tftp | grep -v grep 24600 ?? Is 0:00,00 /usr/local/libexec/in.tftpd -4 -vcps -u tftpd -U 037 -B 1468 -l -m /usr/local/etc/tftpd-remap.conf /home/tftp
Если вы увидели что-то подобное – значит все работает. Попробуйте что-нибудь записать на ваш tftp-сервер. В каталоге /home/tftp
вы увидите файл, преобразованный в вид ipадрес-имяфайла. Например, вы копировали running-config с маршрутизатора cisco с ip-адресом 192.168.0.1 на tftp-сервер с ip-адресом 192.168.0.2
cisco#copy running-config tftp://192.168.0.2 Address or name of remote host [192.168.0.2]? Destination filename [cisco-confg]? !! 2032 bytes copied in 1.408 secs (1434 bytes/sec) cisco#
На вашем tftp-сервере в каталоге /home/tftp
появится файл с именем 192.168.0.1-cisco-confg.
Если вам наоборот, необходимо скопировать с вашего tftp-сервера какой-нибудь файл, переименуйте его в вид ipадресс-имяфала. Только так к нему получит доступ сетевое устройство по tftp-протоколу. В противном случае вы будете получать на нем ошибку вида:
error code 2 received - Only absolute filenames allowed
Вот в принципе и все. Удачи!
Зачем в /etc/rc.conf дообавлять tftpd_flags, если эти флаги запуска уже прописаны в стартовом скрипте?
в статье я постарался обобщить весь процесс настройки tftp. к тому же, добавляя флаг —ipv4 (которого нет в скрипте запуска), мы указываем, что надо использовать только IPv4 адресное пространство. остальные флаги – да, можно опустить. но статья не панацея, у каждого могут быть свои требования.