5 KiB
tftp-hpa-trq
Описание
К стандартным opcodes
RRQ
и WRQ
был добавлен TRQ
(Thinstation Request) со значением 6
, позволяющий создать символическую ссылку на файл-загрузчик для PXE-сервера.
Структура filename
принимаемая TFTP-сервером состоит из частей, разделённая ;
:
01-<mac-address>;<command>;<source-file>
где
01
- указывается как префикс MAC-адреса тонкого клиентаmac-address
- MAC-адрес тонкого клиента в нижнем регистре, разделённого-
, напримерff-ff-ff-ff-ff-ff
command
- команда (cr
/rm
) для создания/удаления символической ссылки на файлsource-file
- основной файл, на который необходимо создать символическую ссылку
Символическая ссылка создаётся в директории mac.cfg
с правами drwxrwxrwx
, расположенной в корневой директории TFTP сервера.
Например, структура filename
создания симолической ссылки на файл thinstation
:
01-ff-ff-ff-ff-ff-ff;cr;thinstation
Удаление символической ссылки:
01-ff-ff-ff-ff-ff-ff;rm
Структура каталога tftpboot
:
.
└── tftpboot
└── [drwxrwxrwx] mac.cfg
├── 01-ff-ff-ff-ff-ff-ff -> thinstation
└── thinstation
Пример запроса на PHP
Создание пакета на PHP для создания символической ссылки, отправляемого на TFTP-сервер:
$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);
Пример запроса на Python
Создание пакета на Python для создания символической ссылки, отправляемого на TFTP-сервер:
import socket
opcode = 6 # TRQ opcode
request = '01-ff-ff-ff-ff-ff-ff;cr;thinstation'
mode = 'octet'
ip = '192.168.0.11'
port = 69
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
package = chr(0) + chr(opcode) + request + chr(0) + mode + chr(0)
sock.sendto(package.encode(), (ip, port))
sock.close()
Сборка пакета в Docker
Склонировать репозиторий в удобное место:
git clone https://git.zhirov.kz/alexander/tftp-hpa-trq.git
Войти в оболочку alpine
для сборки пакета запустив docker
командой:
docker run --rm -it -v $PWD/tftp-hpa-trq:/home/packager/reposerve/main/tftp-hpa-trq alpine:latest /bin/ash
Установить инструменты разработчика:
apk add sudo build-base alpine-sdk
Cоздать пользователя packager
и добавьте его в список sudo
adduser -D packager
addgroup packager abuild
echo 'packager ALL=(ALL) NOPASSWD:ALL' >/etc/sudoers.d/packager
Войти под созданным пользователем packager
:
sudo -u packager sh
Собрать пакет:
cd /home/packager/reposerve/main/tftp-hpa-trq
REPODEST=~/packages/latest abuild -r
Для установки в других экземплярах alpine
возможно понадобятся сгенерированные ранее ключи для сборки пакета (/home/packager/.abuild/{*.rsa,*.rsa.pub}
).
Генерация ключей
Сгенерировать ключи:
abuild-keygen -a -i
Или же прокинуть в контейнер свои ключи в /home/packager/.abuild
.
Безопасность
Отсутствует проверка на источник запроса, так как сформировать запрос на создание/удаление символической ссылки выполняется в произвольной форме.