tftp-hpa/README.md

116 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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