Я запускаю TFTPD через xinetd на сервере Centos 5.4. Я могу получить доступ к файлам через tftp в порядке, поэтому я знаю, что служба работает нормально. Однако всякий раз, когда я пытаюсь загрузить файл, я получаю сообщение 0 Permission denied.
Я уже создал файл в / tftpboot и установил разрешения на 666.
Моя конфигурация tftpd имеет подробное ведение журнала (-vvvv), но все, что я вижу в моем / var / log / messages:
НАЧАЛО: tftp pid = 20383 from = 192.168.77.4
Я видел некоторые упоминания о том, что SELinux может предотвращать загрузку TFTPD, но я ожидал увидеть что-то в журналах. У меня SELinux установлен в разрешающий режим.
Любые идеи?
Я нашел другое, лучшее решение этой проблемы. Я не мог поверить, что люди, которые писали файлы политик selinux, не думали, что людям нужна загрузка tftp, поэтому я немного покопался. Я не смог найти в Интернете ничего, что еще не упоминалось здесь, но, выполнив поиск по политике selinux, я смог найти другой контекст безопасности, уже существующий в системе для записи tftp. Изменение контекста / tftpboot устранило проблему.
# sesearch -a | grep tftpdir |grep tftpd_
allow tftpd_t tftpdir_t : file { read getattr };
allow tftpd_t tftpdir_t : dir { read getattr search };
allow tftpd_t tftpdir_t : lnk_file { read getattr };
allow tftpd_t tftpdir_rw_t : file { ioctl read write create getattr setattr lock append unlink link rename };
allow tftpd_t tftpdir_rw_t : dir { ioctl read write create getattr setattr lock unlink link rename add_name remove_name reparent search rmdir };
allow tftpd_t tftpdir_rw_t : lnk_file { read create getattr setattr unlink link rename };
# ls -Z /tftpboot/ -a
drwxrwxrwx root root system_u:object_r:tftpdir_t .
drwxr-xr-x root root system_u:object_r:root_t ..
# chcon -t tftpdir_rw_t /tftpboot
# ls -Z /tftpboot/ -a
drwxrwxrwx root root system_u:object_r:tftpdir_rw_t .
drwxr-xr-x root root system_u:object_r:root_t ..
Следил за информацией на http://grimwell.wikispaces.com/tftpd, обращая особое внимание на «промыть и повторить», чтобы применить политики selinux. После нескольких попыток все заработало - закачка и создание новых файлов.
Коротко:
-c -v -s /tftpboot
в строке аргументов сервераgrep tftp /var/log/audit/audit.log | audit2allow -m tftpwrite
создать политику selinux. Убедитесь, что политика включает запись и создание строк. Если нет, попробуйте написать и создать еще раз, чтобы генерировать предупреждения в журнале аудита, и повторите попытку.grep tftp /var/log/audit/audit.log | audit2allow -M tftpwrite
затем установите его, используя semodule -i tftpwrite.pp
service xinetd reload
и попробуйте использовать tftp.Великолепно. Надеюсь, другие сочтут это полезным!
Вы запускаете tftpd с параметром -s? Некоторые клиенты могут этого ожидать, например загрузка файла с именем foo
к /foo
действительно предназначен для /tftpboot/foo
на сервере. Добавление -s /tftpboot
по сути, указывает серверу выполнить "chroot" для этого каталога.
Попробуйте запустить tftpd вручную, например не через xinetd, и посмотрите, что будет на выходе. Вы также можете попробовать запустить его с помощью strace
чтобы увидеть, какие именно файлы он пытается открыть и какие системы вызывают.
Двойная проверка /etc/hosts.allow
и /etc/hosts.deny
чтобы убедиться, что трафик разрешен на сервер.
Что касается SELinux, в зависимости от того, как настроена ваша система, он может выполнять вход в /var/log/audit/audit.log
если вы включили auditd. См. Раздел 5 эта страница.