Настройка TFTP для загрузки по сети с Mikrotik часть 1
Содержание:
Настройка TFTP для загрузки по сети с Mikrotik
Настраиваем Syslinux и GRUB для PXE
Поднимаем NAS через WoL после загрузки необходимых файлов через TFTPБонус
Рано или поздно встает вопрос о загрузке хоста по сети и не важно с какой целью будь то работы по восстановлению упавшей системы (передаем привет дешевым SSD из поднебесной ) или необходимость перевести пользователя на тонкий клиент и тут на помощь приходит TFTP.
Настройка TFTP в Mk связана с нюансами, в частности в зависимости от того как настроен роутер будет зависит объем настроек, самый просто вариант у нас есть один WAN интерфейс и группа Ethernet 1-4 объединенная в bridge, тогда для настройки TFTP выполним следующую команду:
/ip tftp
add allow=yes allow-overwrite=yes allow-rollover=no disabled=no ip-addresses=\
"" read-only=no reading-window-size=none real-filename=disk1/tftp/ \
req-filename=.*
Обратим внимание что поле req-filename является местом куда необходимо указать регулярное выражение и если запрашиваемый файл совпадет то сервер вернет указанный вами файл или перенаправит в указанный каталог, как в примере ниже.
При настройке TFTP стоит уделить внимание глобальному параметру размер пакета, узнать его можно с помощью любого сниффер tcpdump или Wireshark, для корректного обмена по TFTP это критично, так как пакеты с иным размером будут отброшены клиентом.
Примечание:
Для windows и linux tftp клиентов размер полезной части 512 байт, но если вы настраиваете встраиваемые системы, такие как ip-телефоны и т.д. размер может отличаться.
/ip tftp settings
set max-block-size=512
Теперь переходим к настройке DHCP сервера, нам необходимо передать клиенту параметры в которых будет указан файл который нужно будет загрузить и ip сервера с которого необходимо файл забрать, для этого воспользуемся разделом /ip dhcp-server option
/ip dhcp-server option
add code=66 name=pxe-boot-server value="'10.1.1.1'"
add code=67 name=boot-file-value value="'pxelinux.0'"
Примечание:
в моем примере используется загрузчик syslinux, у Вас файл может отличаться.
За файл отвечает опция с кодом 67 , а за ip сервера опция с кодом 66
Не забываем помещать значения в пару ' ' это критично и для winbox и для консольного ввода.
Теперь отдельные опции необходимо объединить в группу, делаем это в разделе /ip dhcp-server option sets
/ip dhcp-server option sets
add name=NetworkBoot options=boot-file-value,pxe-boot-server
Теперь вносим изменения в настройки уже запущенного DHCP сервера
/ip dhcp-server
set number=0 dhcp-option-set=NetworkBoot
/ip dhcp-server network
add address=10.1.1.0/24 caps-manager="" dhcp-option="" dns-server="" gateway=\
10.1.1.1 next-server=10.1.1.1 ntp-server="" wins-server=""
На текущем этапе все готово для загрузки, осталось только разместить файлы в каталоге (ранее мы указывали его при настройке tftp параметр real-filename), сделать это можно с помощью Winbox или через SMB если вы используете CHR от Mikrotik.
Проверить корректность работы можно с помощью любой ВМ, что поддерживает загрузку по сети, в моем случае это была VMware Workstation.
Примечание:
В качестве тестовой ОС для загрузки предлагаю использовать Kolibri OS (https://kolibrios.org/ru/) так как она минимальна по размеру 1,44 Мб и при условии, что вы пользуетесь CHR где в бесплатном режиме ограничение на передачу и прием трафика в 1 мегабит, она будет грузиться быстро, а при возникновении ошибок ждать долго не придется.
Если есть firewall?
Теперь усложним задачу, а что если интерфейс на котором сидит TFTP подключен не совсем к доверенной среде или мы не хотим с этого порта открывать свободный доступ ко все сервисам роутера?
Предположим что правило по умолчанию drop для всего трафика, кроме разрешенного, тогда опишем этот разрешенный трафик:
/ip firewall filter
add action=accept chain=input in-interface=ether1 port=69 protocol=udp
На текущем этапе сессия по скачиваю файла закончится примерно такой ошибкой:
Время иcтекло
tftp timeout get file
Что приводит пользователя в ступор, вед tftp использует 69 порт, что не так?
Но если ознакомиться с RFC 1350 на TFTP или быть совсем ленивым и посмотреть трафик с помощью Wireshark или tcp dump то мы обратим внимание, что протокол из 80-х не так прост :D
После получения пакета на 69 порт, ответ уходит с произвольного порта, который потом используется на протяжении всего обмена с клиентом и что самое главное он случайно выбирается из диапазона от 0 до 65535, согласно RFC 1350, а в реальности от 1025 до 65535 (так как порты от 1024 до 1 требуют особенных прав ).
Так что одного правила тут будет явно недостаточно, так что введем дополнительные правила для обработки исходящего трафика:
add action=accept chain=input in-interface=ether1 packet-size=32 port=1025-65535 protocol=udp
Теперь мы готовы к загрузке по сети в не совсем доверенной среде =)
Полезные ссылки:
RFC 1350 https://2rfc.net/1350