Найти тему
TechrooM

Настройка TFTP для загрузки по сети с Mikrotik часть 1

Настройка 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