Главная | Контакты | Настройки СМЕНИТЬ ПАЛИТРУ:

Главная > Программы

Конфигурируем TFTP сервер

Оригинал: http://www.onlamp.com/pub/a/bsd/2003/06/05/FreeBSD_Basics.html
Перевод: Сгибнев Михаил
Примечание: Урезано и сокращено без потери функциональности.

Если Вы имели опыт работы с любыми hardware-based маршрутизаторами, или свичами, то Вы знаете, что зачастую такая техника не имеет жестких дисков для хранения конфигураций и все настройки хранятся в RAM и EEPROM.

Так как чипы имеют гораздо меньшую емкость, чем жесткие диски, то возможность иметь дополнительное место хранения информации становится достаточно интересной, особенно в случае обновления или переустановки встроенной операционной системы.

Обычно, данная возможность реализуется с помощью TFTP - тривиального протокола передачи файлов. Работа данного механизма подобна FTP, но облегчена для простоты реализации в чипе. Обычно маршрутизатор Cisco, или подобное устройство содержит клиента TFTP, а сервер организуется где-нибудь в вашей сети. TFTP сервер будет хранить резервную копию ваших конфигурационных файлов и образы операционных систем.

Задействование TFTP сервера

Ваша FreeBSD система уже содержит TFTP сервер, то есть не требуется установки дополнительного прогораммного обеспечения. Ваша задача состоит только в том, чтобы задействовать TFTP сервер и указать рабочие директории. Итак, давайте включим сервис. Откройте своим любимым текстовым редактором файл /etc/inetd.conf.

Это файл конфигурации inetd - Internet Super Server. Вы заметите, что этот файл содержит несколько дюжин имен сервисов, и каждая строка закомментирована знаком #. Когда на сервер приходит запрос на соединение с определенной службой, сервер inetd запускает данную службу. Такая метода позволяет некоторых случаях снизить нагрузку на машину, так как вместо прослушивания своих портов различными сервисами, используется только один, закускающий сервисы по мере необходимости.

Чтобы сказать inetd слушать запросы сервиса TFTP, найдите две линии, которые начинаются с #tftp и расскомментируйте их. Должно выглядеть примерно так:

tftp   dgram  udp   wait  root  /usr/libexec/tftpd  tftpd -s /tftpboot
#tftp  dgram  udp6  wait  root  /usr/libexec/tftpd  tftpd -s /tftpboot

Обратите внимание, что FreeBSD поддерживает и IPv4 и IPv6 и inetd способен прослушивать оба типа запросов. Также обратите внимание, что TFTP для транспортировеи использует протокол UDP, что означает несколько меньшую надежность по сравнению с FTP (который использует TCP). TFTP обеспечивает возможность broadcasts, что позволяет не конфигурировать TFTP клиент на конкретный адрес сервера.

Как только необходимые строки будут расскоментированы, сохраните изменения. Следующим шагом будет рестарт сервиса inetd, для задействования нового файла конфигурации. Делается это с помощью команды killall:

# killall -1 inetd

Если команда выполнилась, Вы будете возвращены в командную строку. Не ошибитесь в наборе команды - если Вы забудете -1, то сервис inetd будет просто выключен. Повторный его запуск в таком случае можно выполнить просто выполнив команду 'inetd'.

Если вы получили такое сообщение об ошибке:

# killall -1 inetd
No matching processes were found
То это значит, что inetd не запущен. Запустите его, как это было указано выше. Для того, чтобы сервис inetd стартовал автоматически, поместите в /etc/rc.conf следующую запись:
inetd_enable="YES"
Проверим:
USER   COMMAND  PID   FD PROTO  LOCAL ADDRESS   FOREIGN ADDRESS      
root   inetd    1713  4  udp4   *:69            *:*

Работа с файлами через TFTP

Теперь, когда сервис работоспособен, укажем рабочий каталог, куда будут складываться файлы конфигурации и прочая светотень. Назовем его /tftpboot:
# mkdir /tftpboot

Затем, поместите в этот каталог те файлы, которые вы собираетесь залить на устройства. Для примера, Вы хотите обновить Cisco IOS - так возьмите, какой посвежей, и положите его в каталог /tftpboot. Так как имена образов могут быть достаточно сложными, рекомендуем вести соответствующий журнал.

Также Вы можете создать пустые файлы, в которые будет сбрасываться информация с устройств. Желательно, чтоб эти имена несли смысловую нагрузку. Например, по именам соответствующих устройств:

# touch 1602_config PIX_config 1924_config

Учтите, что TFTP не поддерживает аутентификацию, поэтому, рабочий каталог и файлы должны быть доступны клиентам. Делается это обычно так:

# chmod -R 777 /tftpboot

В зависимости от TFTP клиента, возможно использование более строгих прав доступа. К сожалению, для устройств Cisco, в настоящий момент это не возможно. Проверим права доступа:

# ls -l /tftpboot
total 0
-rwxrwxrwx  1 root  wheel  0 May 18 15:24 1602_config
-rwxrwxrwx  1 root  wheel  0 May 18 15:24 1924_config
-rwxrwxrwx  1 root  wheel  0 May 18 15:24 PIX_config
-rwxrwxrwx  1 root  wheel  4194172 May 18 15:33 c1600-ny-mz.112-11.P.bin

Работа с TFTP сервером

Так как сервер TFTP уже настроен и работоспособен, воспользуемся tftp клиентов, поставляемый с FreeBSD, для проверки работоспособности.
# tftp 127.0.0.1
tftp>

Для получения справки по командам используйте ?. Традиционно - get используется для скачивания, put для закачивания, quit для выхода. Если Вы привыкли использовать ftp клиент, то Вы заметите отсутствие таких команд как cd, ls, mget, mput и многих других.

Теперь выполним команду get. Для большей убедительности выберем непустой файл.

tftp> get c1600-ny-mz.112-11.P.bin
Received 4194172 bytes in 1.6 seconds
Все замечательно, выходим:
tftp> quit

Есть важный момент, на который стоит обратить внимание - файл должен находиться в каталоге /tftpboot , иначе получить доступ к нему будет невозможно. Путь к файлу также не определяется. Вот, что получится, если указать путь:

tftp> get /tftpboot/c1600-ny-mz.112-11.P.bin
Error code 1: File not found

Помните, tftp предполагает, что файл, который Вы хотите передать, уже существует и расположен в /tftpboot. Во вторых, удостоверьтесь, что Вы записываете имя файла правильно. Это особенно важно с теми длинными именами образов Cisco IOS.

Вы, возможно заметили, что при использовании команды get не указывался каталог назначения. Это связано с тем, что получаемый файл автоматически помещается в текущий рабочий каталог. Как правило, на всяких железяках это не проблема, но работая по tftp на Вашей FreeBSD машине - будьте внимательны.

В заключение, используйте команду ls -l, для сравнения размера полученного и исходного файлов. Также это весьма удобная возможность вести документацию, ведь если на вашей машине установлен принтер, то распечатать список рабочего каталога tftp можно следующим образом:

# ls -l /tftpboot | lpr
Далее в статье идет пример, как скачать с TFTP сервера образ Cisco IOS. В переводе он пропущен. <goodguys>

Статья взята с сайта DreamCatcher.

[ опубликовано 30/04/2004 ]

Dru Lavigne. Перевод: Михаил Сгибнев - Конфигурируем TFTP сервер  

Настройка TFTP сервера для FreeBSD 5.x+

Version: 1.0
Copyright (c) 2006 Alexey Tsvetnov

1. Постановка задачи.
2. Решение задачи.
3. Пошаговая реализация.

1. Постановка задачи.

Необходимо настроить сервер для сохранения (восстановления) конфигурации коммутаторов и маршрутизаторов по протоколу tftp. Сервер должен быть достаточно стабильным в работе и обеспечивать оптимальный уровень безопасности, учитывая специфику tftp-протокола.

2. Решение задачи.

В качестве tftp-сервера был выбран tftp-hpa by Brooks Davis.
Программа позволяет запускать дочерний процесс от непривилегированного пользователя, создавать от его имени и с определёнными правами новые файлы, выполнять chroot в выбранный каталог, ограничивать доступ к файлам по таким критериям, как имя файла и переданная комманда (WRQ или RRQ), выполнять прозрачное переименовывание файлов в зависимости от IP-адреса клиента. Программа прекрасно работает как самостоятельный сервер и не нуждается в использовании inetd. В поставке идёт так же достаточно удобная клиентская программа, которая в отличае от поставляемой с базовой системой, позволяет передавать желаемые команды прямо в строке вызова.

 
 Предложенная ниже конфигурация обеспечивает:

    * программа используется как самостоятельный сервис, без использования inetd; 


    * умеренное протоколирование через syslog по ftp facility. Уровень детализации
      протоколирования задаётся в строке парамметров, от полного отсутствия до 
      максимального (-vvv);


    * дочерние процессы выполняются от имени непривилегированного пользователя tftpd;


    * осуществляется chroot в каталог /var/tftp;


    * разрешено создавать новые файлы, если такие отсутствую в рабочем каталоге;


    * все новые файлы создаются от имени tftpd:tftpd и назначаются права 740, т.е. к
      файлу имеют доступ только владелец и группа;


    * доступ для всех остальных пользователей, как к файлам, так и к рабочему каталогу
      /var/tftp не требуется;


    * все имена файлов прозрачно преобразуются при записи из ИМЯ в IP-ИМЯ, а при
      чтении - из IP-ИМЯ в ИМЯ. Это позволяет ограничить доступ к файлам, основываясь
      на IP-адресе клиента. Т.е. одно и тоже имя файла от абсолютно разных хостов на
      сервере будет сохраняться под разными именами и у каждого хоста будет доступ
      только к своей копии файла.
 
 
 
3. Пошаговая реализация.

 Установить программу:
# cd /usr/ports/ftp/tftp-hpa && make install clean
Добавить новую группу:
# pw groupadd tftpd
Добавить нового пользователя:
# pw useradd tftpd -c tftp_manager -d /nonexistent -g tftpd -s /usr/sbin/nologin
Создать рабочий каталог для размещения скачанных/закаченных данных:
# mkdir /var/tftp && chown tftpd:tftpd /var/tftp && chmod 750 /var/tftp

Настроить syslog на протоколирование от ftp.* и ротацию протокола. Если настройки по-умолчанию syslog и newsyslog не менялись, то ни чего настраивать не нужно. Протоколирование в этом случае будет производиться в /var/log/xferlog Создать конфигурационный файл обработки файлов (переименование, контроль доступа):

# 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
Создать стартовый скрипт:
# touch /usr/local/etc/rc.d/tftpd.sh && chmod +x /usr/local/etc/rc.d/tftpd.sh
Добавить в файл /usr/local/etc/rc.d/tftpd.sh:
        #!/bin/sh
        #
        # tftp-hpa init script
        # Copyright (c) 2006 by Alexey Tsvetnov, vorakl@fbsd.kiev.ua
        #
        # PROVIDE: tftpd
        # REQUIRE: DAEMON
        # BEFORE: LOGIN
        # KEYWORD: shutdown
        #
        # Define these tftpd_* variables in one of these files:
        #       /etc/rc.conf
        #       /etc/rc.conf.local
        #       /etc/rc.conf.d/tftpd
        #
        # tftpd_enable (bool):		Set it to "YES" to enable tftpd.
        #				            Default is "NO".
        # tftpd_pidfile (path):           Set full path to tftpd.pid.
        #                                           Default is "/var/run/tftpd.pid".
        # tftpd_remapfile (path):      Set full path to remap file.
        #				            Default is "/usr/local/etc/tftpd-remap.conf".
        # tftpd_datadir (path):		Set full path to directory with data.
        #				            Default is "/var/tftp".
        # tftpd_flags (str):        	    Extra flags passed to start command.
        #                             	            Default is "-cps -u tftpd -U 037 -B 1468".
        #

        . /etc/rc.subr

        name="tftpd"
        rcvar=`set_rcvar`

        load_rc_config $name

        # DO NOT CHANGE THESE DEFAULT VALUES HERE

        : ${tftpd_enable="NO"}
        : ${tftpd_pidfile="/var/run/tftpd.pid"}
        : ${tftpd_remapfile="/usr/local/etc/tftpd-remap.conf"}
        : ${tftpd_datadir="/var/tftp"}
        : ${tftpd_flags="-vvcps -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"
Требуемые настройки firewall:
а) для сервера:
            UDP  ServerIP [69] 	    	<-   ClientIP [1024-65535]
            UDP  ServerIP [1024-65535]  <->  ClientIP [1024-65535]
ipfw:
            ipfw -q add pass udp from ${tftp_clnt} 1024-65535 to me 69 in
            ipfw -q add pass udp from me 1024-65535 to ${tftp_clnt} 1024-65535 out
            ipfw -q add pass udp from ${tftp_clnt} 1024-65535 to me 1024-65535 in
б) для клиента:
#             UDP  ClientIP [1024-65535]   ->  ServerIP [69]
            UDP  ClientIP [1024-65535]  <->  ServerIP [1024-65535]
ipfw:
            ipfw -q add pass udp from me 1024-65535 to ${tftp_srv} 69 out
            ipfw -q add pass udp from ${tftp_srv} 1024-65535 to me 1024-65535 in
            ipfw -q add pass udp from me 1024-65535 to ${tftp_srv} 1024-65535 out
Статья взята с сайта http://www.opennet.ru/base/net/tftpd_freebsd.txt.html.
Главная > Программы