Tftp сервер настройка freebsd
Перевод: Сгибнев Михаил
Примечание: Урезано и сокращено без потери функциональности.
Если Вы имели опыт работы с любыми hardware-based маршрутизаторами, или свичами, то Вы знаете, что зачастую такая техника не имеет жестких дисков для хранения конфигураций и все настройки хранятся в RAM и EEPROM.
Так как чипы имеют гораздо меньшую емкость, чем жесткие диски, то возможность иметь дополнительное место хранения информации становится достаточно интересной, особенно в случае обновления или переустановки встроенной операционной системы.
Обычно, данная возможность реализуется с помощью TFTP — тривиального протокола передачи файлов. Работа данного механизма подобна FTP, но облегчена для простоты реализации в чипе. Обычно маршрутизатор Cisco, или подобное устройство содержит клиента TFTP, а сервер организуется где-нибудь в вашей сети. TFTP сервер будет хранить резервную копию ваших конфигурационных файлов и образы операционных систем.
Задействование TFTP сервера
Ваша FreeBSD система уже содержит TFTP сервер, то есть не требуется установки дополнительного прогораммного обеспечения. Ваша задача состоит только в том, чтобы задействовать TFTP сервер и указать рабочие директории. Итак, давайте включим сервис. Откройте своим любимым текстовым редактором файл /etc/inetd.conf.
Это файл конфигурации inetd — Internet Super Server. Вы заметите, что этот файл содержит несколько дюжин имен сервисов, и каждая строка закомментирована знаком #. Когда на сервер приходит запрос на соединение с определенной службой, сервер inetd запускает данную службу. Такая метода позволяет некоторых случаях снизить нагрузку на машину, так как вместо прослушивания своих портов различными сервисами, используется только один, закускающий сервисы по мере необходимости.
Чтобы сказать inetd слушать запросы сервиса TFTP, найдите две линии, которые начинаются с #tftp и расскомментируйте их. Должно выглядеть примерно так: Обратите внимание, что FreeBSD поддерживает и IPv4 и IPv6 и inetd способен прослушивать оба типа запросов. Также обратите внимание, что TFTP для транспортировеи использует протокол UDP, что означает несколько меньшую надежность по сравнению с FTP (который использует TCP). TFTP обеспечивает возможность broadcasts, что позволяет не конфигурировать TFTP клиент на конкретный адрес сервера.
Как только необходимые строки будут расскоментированы, сохраните изменения. Следующим шагом будет рестарт сервиса inetd, для задействования нового файла конфигурации. Делается это с помощью команды killall: Если команда выполнилась, Вы будете возвращены в командную строку. Не ошибитесь в наборе команды — если Вы забудете -1, то сервис inetd будет просто выключен. Повторный его запуск в таком случае можно выполнить просто выполнив команду ‘inetd’.
Если вы получили такое сообщение об ошибке: То это значит, что inetd не запущен. Запустите его, как это было указано выше. Для того, чтобы сервис inetd стартовал автоматически, поместите в /etc/rc.conf следующую запись: Проверим:
Работа с файлами через TFTP
Теперь, когда сервис работоспособен, укажем рабочий каталог, куда будут складываться файлы конфигурации и прочая светотень. Назовем его /tftpboot: Затем, поместите в этот каталог те файлы, которые вы собираетесь залить на устройства. Для примера, Вы хотите обновить Cisco IOS — так возьмите, какой посвежей, и положите его в каталог /tftpboot. Так как имена образов могут быть достаточно сложными, рекомендуем вести соответствующий журнал.
Также Вы можете создать пустые файлы, в которые будет сбрасываться информация с устройств. Желательно, чтоб эти имена несли смысловую нагрузку. Например, по именам соответствующих устройств: Учтите, что TFTP не поддерживает аутентификацию, поэтому, рабочий каталог и файлы должны быть доступны клиентам. Делается это обычно так: В зависимости от TFTP клиента, возможно использование более строгих прав доступа. К сожалению, для устройств Cisco, в настоящий момент это не возможно. Проверим права доступа:
Работа с TFTP сервером
Так как сервер TFTP уже настроен и работоспособен, воспользуемся tftp клиентов, поставляемый с FreeBSD, для проверки работоспособности. Для получения справки по командам используйте ?. Традиционно — get используется для скачивания, put для закачивания, quit для выхода. Если Вы привыкли использовать ftp клиент, то Вы заметите отсутствие таких команд как cd, ls, mget, mput и многих других.
Теперь выполним команду get. Для большей убедительности выберем непустой файл. Все замечательно, выходим: Есть важный момент, на который стоит обратить внимание — файл должен находиться в каталоге /tftpboot , иначе получить доступ к нему будет невозможно. Путь к файлу также не определяется. Вот, что получится, если указать путь: Помните, tftp предполагает, что файл, который Вы хотите передать, уже существует и расположен в /tftpboot. Во вторых, удостоверьтесь, что Вы записываете имя файла правильно. Это особенно важно с теми длинными именами образов Cisco IOS.
Вы, возможно заметили, что при использовании команды get не указывался каталог назначения. Это связано с тем, что получаемый файл автоматически помещается в текущий рабочий каталог. Как правило, на всяких железяках это не проблема, но работая по tftp на Вашей FreeBSD машине — будьте внимательны.
В заключение, используйте команду ls -l, для сравнения размера полученного и исходного файлов. Также это весьма удобная возможность вести документацию, ведь если на вашей машине установлен принтер, то распечатать список рабочего каталога tftp можно следующим образом: Далее в статье идет пример, как скачать с TFTP сервера образ Cisco IOS. Пропустил.
FreeBSD tips: работаем с TFTP
tftp> conn localhost Connected to localhost. Mode: netascii Verbose: on Tracing: on Rexmt-interval: 5 seconds, Max-timeout: 25 seconds tftp> get config getting from localhost:config to config [netascii] Transfer timed out. На приведенном выше листинге показана попытка считать файл при неработающем сервере. Как видите, клиент не обнаруживает наличие проблемы и через каждые 5 секунд (параметр Rexmt-interval) повторяет попытки установить соединение, передавая запрос RRQ и ожидая первый блок данных. Спустя 25 секунд (Max-timeout) эти попытки прекращаются. Обратите внимание, что приглашение вы получите в любом случае, независимо от того, запущен ли на указанном узле TFTP-сервер или нет. Как было описано выше, попытка установить соединение выполняется только при отправке запроса на чтение или запись. До этого момента клиент ничего не знает о наличии сервера на удаленной машине. Пример успешной записи файла на сервер выглядит так (включена трассировка):
tftp> put messages putting messages to test.ru:messages [netascii] Sent 4216 bytes in 0.1 seconds [337280 bits/sec] Клиент tftp не поддерживает согласование размера блока по RFC1783, поэтому размер передаваемого файла ограничивается значением 32 Мб. На трассировке это выглядит следующим образом: Transfer timed out. То есть клиент (рассматривается отправка файла), отослав блок номер 65535, не может отослать следующий из-за переполнения счетчика и повторно отправляет запрос на запись WRQ. Сервер же ожидает следующий блок, повторяя периодически подтверждение блока 65535. По истечении тайм-аута соединение разрывается. При этом передаваемый файл сохраняется на сервере частично (он вроде бы и есть, но попытка его использовать приведет к ошибке). Таким образом, не следует использовать TFTP для обмена большими файлами. Несмотря на букву «d» в конце имени, tftpd не является демоном, его запуск выполняется супердемоном inetd при появлении запроса на порту 69. По умолчанию соответствующая строка в /etc/inetd.conf закомментирована, и для активизации сервера комментарий нужно удалить и перезапустить процесс inetd. Все настройки поведения сервера выполняются с помощью ключей командной строки путем редактирования файла /etc/inetd.conf. Наиболее часто используются следующие опции:
Особое внимание следует уделить вопросу безопасности. Поскольку сам сервер tftpd не выполняет никаких проверок авторизации, то доступ к нему необходимо ограничивать. Наиболее часто для этого используют брандмауэры, пропуская пакеты на 69-й порт только с разрешенных узлов. Также может быть удобен файл /etc/hosts.allow, которым руководствуется inetd, решая, запускать ли соответствующий процесс при попытке установить соединение на том или ином порту или нет. Если нужно позволить клиентам запись любых файлов, то рекомендуется использовать опцию -w совместно с -c, чтобы такая запись была разрешена только с указанных известных адресов. Однако не забывайте о возможности подмены IP-адреса отправителя, что открывает возможность для атаки типа «Отказ в обслуживании» путем переполнения соответствующей файловой системы. Также рекомендуется с файлов, которые предназначены только для считывания, снимать права на запись. Если файл требуется записывать на сервер, но он не предназначен для чтения другими пользователями, можно поставить на него права 222 (-w—w—w-). При включенной опции –w это можно автоматизировать с помощью ключа «-U mask», который определяет маску для создаваемых (самим процессом tftpd по запросу на запись) файлов. Для описанного выше примера следует указать «-U 555» – в этом случае каждый созданный по запросу клиента файл получит разрешение только на запись и не сможет быть никем прочитан (кроме администратора сервера, разумеется). Обмен файлами с маршрутизатором CISCO В качестве примера рассмотрим применение TFTP для сохранения на сервер конфигурации с CISCO (например, для более удобного редактирования или как резервную копию) и последующую загрузку на CISCO с сервера. Итак, предполагая, что обмен с CISCO выполняется по изолированной сети 10.100.100.0/24, а интересующие нас устройства имеют адреса 10.100.100.1 и 10.100.100.2, запуск tftpd удобно выполнять со следующими ключами: tftpd -clw -s /var/tftp/cisco -u tftp Создаем каталог /var/tftp/cisco, и в нем две директории 10.100.100.1 и 10.100.100.2, владельцем которых делаем пользователя tftp (создать его придется вручную). Разрешаем прохождение соединений на порт 69 с указанных адресов через все запущенные в системе пакетные фильтры. Теперь после перезапуска inetd (или перезагрузки сервера) tftpd готов к работе. На CISCO копирование на сервер выполняется командой copy:
Host #copy running-config tftp: Address or name of remote host []? 10.100.100.254 Destination filename [host-confg]? config 20693 bytes copied in 1.044 secs (19821 bytes/sec) Аналогично можно загружать конфигурацию с сервера на CISCO, поменяв местами аргументы команды copy. Надеюсь, эта статья поможет вам эффективно использовать протокол TFTP в своей работе. Главное – не забывайте о безопасности, которую приходится обеспечивать внешними по отношению к TFTP средствами. |