# tftp-hpa - [Описание](#описание) - [Пример запроса на `php`](#пример-запроса-на-php) - [Сборка пакета в Docker](#сборка-пакета-в-docker) - [Безопасность](#безопасность) ![protocol](img/protocol.png) ## Описание К [стандартным](http://isp.vsi.ru/library/Networking/TCPIPIllustrated/tftp_tri.htm) `opcodes` `RRQ` и `WRQ` был добавлен `TRQ` (*Thinstation Request*) со значением `6`, позволяющий создать символическую ссылку на файл-загрузчик для PXE-сервера. Структура `filename` принимаемая TFTP-сервером состоит из частей, разделённая `;`: ```sh 01-;; ``` где - `01` - указывается как префикс MAC-адреса тонкого клиента - `mac-address` - MAC-адрес тонкого клиента в нижнем регистре, разделённого `-`, например `ff-ff-ff-ff-ff-ff` - `command` - команда (`cr`/`rm`) для создания/удаления символической ссылки на файл - `source-file` - основной файл, на который необходимо создать символическую ссылку Символическая ссылка создаётся в директории `mac.cfg` с правами `drwxrwxrwx`, расположенной в корневой директории TFTP сервера. Например, структура `filename` создания симолической ссылки на файл `thinstation`: ```sh 01-ff-ff-ff-ff-ff-ff;cr;thinstation ``` Удаление символической ссылки: ```sh 01-ff-ff-ff-ff-ff-ff;rm ``` Структура каталога `tftpboot`: ```sh . └── tftpboot    └── [drwxrwxrwx] mac.cfg ├── 01-ff-ff-ff-ff-ff-ff -> thinstation    └── thinstation ``` ## Пример запроса на PHP Создание пакета на `php` для создания символической ссылки, отправляемого на TFTP-сервер: ```php $opcode = 6; // TRQ opcode $request = '01-ff-ff-ff-ff-ff-ff;cr;thinstation'; $mode = 'octet'; $ip = '192.168.1.1'; $port = 69; $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); $package = chr(0) . chr($opcode) . $request . chr(0) . $mode . chr(0); socket_sendto($sock, $package, strlen($package), MSG_EOF, $ip, $port); socket_close($sock); ``` ## Сборка пакета в Docker Склонировать репозиторий в удобное место: ```sh git clone https://git.zhirov.website/alexander/tftp-hpa.git tftp-hpa ``` Войти в оболочку `alpine` для сборки пакета запустив `docker` командой: ```sh docker run --rm -it -v $PWD/tftp-hpa:/home/packager/reposerve/main/tftp-hpa alpine:latest sh ``` Установить инструменты разработчика: ```sh apk add sudo build-base alpine-sdk ``` Cоздать пользователя `packager` и добавьте его в список sudo ```sh adduser -D packager addgroup packager abuild echo 'packager ALL=(ALL) NOPASSWD:ALL' >/etc/sudoers.d/packager ``` Войти под созданным пользователем `packager`: ```sh sudo -u packager sh ``` Сгенерировать ключи: ```sh abuild-keygen -a -i ``` Собрать пакет: ```sh cd /home/packager/reposerve/main/tftp-hpa REPODEST=~/packages/latest abuild -r ``` Для установки в других экземплярах `alpine` возможно понадобятся сгенерированные ранее ключи для сборки пакета (`/home/packager/.abuild/{*.rsa,*.rsa.pub}`). ## Безопасность Отсутствует проверка на источник запроса, так как сформировать запрос на создание/удаление символической ссылки выполняется в произвольной форме.