tftp-hpa/README.md

116 lines
4.2 KiB
Markdown
Raw Permalink Normal View History

# 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-<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`:
```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}`).
## Безопасность
Отсутствует проверка на источник запроса, так как сформировать запрос на создание/удаление символической ссылки выполняется в произвольной форме.