tftp-hpa-trq/README.md
Alexander Zhirov 7064919d23
All checks were successful
Build / build (push) Successful in 19s
Сборка пакета
2025-04-29 03:57:13 +03:00

141 lines
5 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-trq
- [Описание](#описание)
- [Пример запроса на PHP](#пример-запроса-на-php)
- [Пример запроса на Python](#пример-запроса-на-python)
- [Сборка пакета в 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);
```
## Пример запроса на Python
Создание пакета на Python для создания символической ссылки, отправляемого на TFTP-сервер:
```python
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
Склонировать репозиторий в удобное место:
```sh
git clone https://git.zhirov.kz/alexander/tftp-hpa-trq.git
```
Войти в оболочку alpine для сборки пакета запустив `docker` командой:
```sh
docker run --rm -it -v $PWD/tftp-hpa-trq:/home/packager/reposerve/main/tftp-hpa-trq alpine:latest /bin/ash
```
Установить инструменты разработчика:
```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
cd /home/packager/reposerve/main/tftp-hpa-trq
REPODEST=~/packages/latest abuild -r
```
Для установки в других экземплярах `alpine` возможно понадобятся сгенерированные ранее ключи для сборки пакета (`/home/packager/.abuild/{*.rsa,*.rsa.pub}`).
### Генерация ключей
Сгенерировать ключи:
```sh
abuild-keygen -a -i
```
Или же прокинуть в контейнер свои ключи в `/home/packager/.abuild`.
## Безопасность
Отсутствует проверка на источник запроса, так как сформировать запрос на создание/удаление символической ссылки выполняется в произвольной форме.