Bog bos tftp

Пошукова машина search.msn.com протягом 5 років направляла користувачів на цю (неіснуючі всі ці 5 років!) Сторінку. Раз вже їм так хочеться, то доведеться написати;)

Застосовується для завантаження конфігурації або firmware різними пристроями (наприклад, мережевими принтерами або маршрутизаторами) в поєднанні з протоколом bootp (DHCP) і ARP. RARP.

Використовується протокол UDP, стандартний порт для ініціалізації з'єднання - 69, для передачі файлу вибираються порти з випадковим номером з обох сторін. Передача починається з посилки запиту на читання або запис файлу, далі файл пересилається блоками по 512 байт (до них додаються заголовки TFTP, UDP, IP і канального рівня), при отриманні чергового блоку надсилається підтвердження про прийом. Посилка блоку довжиною менше 512 байт сигналізує про кінець файлу. Якщо блок втрачається по дорозі, то приймаюча сторона по закінченню часу очікування повторює передачу свого блоку або підтвердження. У разі помилки (немає такого файлу, немає прав доступу, некоректний пакет, втрата доступу до ресурсу), будь-яка сторона посилає повідомлення про помилку і завершує роботу, не чекаючи підтвердження. Перевірка правильності передачі даних покладається на підрахунок контрольних сум UDP.

Кожен пакет містить заголовок TFTP, що складається з двухбайтового коду пакету:
  1. запит на читання (пакет містить ім'я файлу, що завершується нулем, і режим передачі - netascii або octet)
  2. запит на запис (пакет містить ім'я файлу, що завершується нулем, і режим передачі - netascii або octet)
  3. дані (містить багатобайтових номер блоку, стало бути розмір файлу не може бути більше 32 МБ; довжина власне даних від 0 до 512 байт)
  4. підтвердження (містить багатобайтових номер блоку)
  5. помилка (містить багатобайтових код помилки і рядок повідомлення, що завершується нулем)
    • 0 - Not defined, see error message (if any).
    • 1 - File not found.
    • 2 - Access violation.
    • 3 - Disk full or allocation exceeded.
    • 4 - Illegal TFTP operation.
    • 5 - Unknown transfer ID.
    • 6 - File already exists.
    • 7 - No such user.

Пізніші доповнення до протоколу (RFC 2347, RFC 2348, RFC 2349) дозволяють узгоджувати деякі опції обміну (розмір блоку - blksize від 8 до 65 464 байт, інтервал затримок - timeout від 1 до 255 секунд, розмір файлу - tsize). Імена опцій і їх значення передаються в пакеті запиту на читання або запис. Сервер відповідає на це пакетом підтвердження опцій замість звичайного пакета підтвердження, в якому він вказує опції, з якими він згоден.

Якщо MTU мережі недостатньо, щоб передавати блоки даних (разом з заголовками TFTP, UDP, IP) "одним шматком", то реалізація TCP / IP стека повинна вміти фрагментировать / дефрагментировать IP пакети.

Демон in.tftpd в Solaris 2.5 запускається за допомогою супердемона inetd з правами nobody / nobody. Як параметр задається директорія, щодо якої будуть задаватися імена файлів (за умовчанням - / tftpboot). Ключ "-s" змушує сервер зробити chroot () у вказану директорію, яка в цьому випадку повинна існувати. Допускається читання тільки загальнодоступних файлів. Записувати можна тільки ті файли, які вже існують і доступні на запис всім. Порт і інші параметри задаються у файлі /etc/inetd.conf:

Порт і інші параметри задаються у файлі /etc/xinetd.d/tftp (не забути зробити /etc/rc.d/init.d/xinetd reload):

Так як порти для передачі даних вибираються випадковим чином, то необхідно забезпечити прийом і передачу UDP пакетів на всі порти з інтервалу ip_local_port_range крізь внутрішній екран.

Для iptables досить на клієнті (і проміжних маршрутизаторах) довантажити модуль ядра ip_conntrack_tftp (nf_conntrack_tftp) і дозволити

Особливо обережно треба розпорядитися правами доступу до файлів в директорії / tftpboot:
  • права доступу до директорії / tftpboot повинні бути: root: root --- x - x - x
  • імена файлів в директорії не повинні бути легко угадиваеми
  • права на запис файлів потрібно давати тільки в той момент, коли це необхідно, а потім тут же віднімати (необов'язково давати їм при цьому права на читання)
  • не варто давати права на читання файлів, які містять конфіденційну інформацію