Настройка FTP-сервера в Linux (vsftpd)

Проблема

Вам нужно организовать обмен файлами с партнёрами или между отделами компании. Протокол FTP простой и распространённый способ передачи файлов, но стандартный FTP передаёт логин, пароль и сами файлы в открытом виде. Это неприемлемо, если данные чувствительны или передаются через интернет.

Можно, конечно, использовать SCP или SFTP (через SSH), но не все клиенты их поддерживают. Некоторые партнёры привыкли работать именно с FTP, а во внутренней сети офиса шифрование не всегда требуется. Нужен FTP-сервер, который будет быстрым, надёжным, а при необходимости поддерживающим шифрование.

Кстати на винде можно плюс-минус тоже самое , смотрите ftp server на Windows .

Решение

vsftpd (Very Secure FTP Daemon) это FTP-сервер, разработанный с акцентом на безопасность, производительность и стабильность . Он является стандартным FTP-сервером в большинстве дистрибутивов Linux (RHEL, CentOS, Fedora, Ubuntu) .

Ключевые особенности vsftpd:

  • поддержка анонимного и локального доступа;
  • возможность изоляции пользователей в их домашних директориях (chroot);
  • поддержка FTPS (FTP over SSL/TLS) для шифрования канала ;
  • настройка прав на загрузку, скачивание и создание каталогов;
  • гибкое управление списками пользователей;
  • высокая производительность даже при большом количестве соединений.

Мы настроим vsftpd на Ubuntu Server (инструкции с небольшими изменениями подойдут для Debian, CentOS/RHEL). Пройдём от установки до создания защищённого FTPS-сервера.

Пошаговая инструкция

Шаг 1. Установка vsftpd

Ubuntu/Debian:

В терминале набираем:

sudo apt update
sudo apt install vsftpd -y

CentOS/RHEL:

Дальше все команды приведенные ниже в терминале Линукс.

sudo yum install vsftpd -y

После установки служба запускается автоматически. Проверьте статус:

sudo systemctl status vsftpd

Если не запущена, запустите и добавьте в автозагрузку:

sudo systemctl start vsftpd
sudo systemctl enable vsftpd

Шаг 2. Базовая конфигурация

Основной конфигурационный файл vsftpd:

  • Ubuntu/Debian: /etc/vsftpd.conf
  • CentOS/RHEL: /etc/vsftpd/vsftpd.conf

Сделайте резервную копию исходного конфига:

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak   # Ubuntu/Debian
sudo cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak   # CentOS/RHEL

Откройте файл для редактирования:

sudo nano /etc/vsftpd.conf   # Ubuntu/Debian
sudo nano /etc/vsftpd/vsftpd.conf   # CentOS/RHEL

Базовая конфигурация для локальной сети (с поддержкой локальных пользователей и возможностью записи):

# Базовая конфигурация vsftpd
listen=YES
listen_ipv6=NO

# Анонимный доступ (отключаем, если не нужен)
anonymous_enable=NO

# Доступ локальных пользователей системы
local_enable=YES

# Разрешить запись
write_enable=YES

# Маска прав для новых файлов (022 = права 755 для папок, 644 для файлов)
local_umask=022

# Включить логирование
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES

# Баннер приветствия
ftpd_banner=Welcome to FTP server.

# Пассивный режим (важно для работы через NAT/брандмауэр)
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000

Подробное описание всех опций доступно в man-странице vsftpd.conf :

man vsftpd.conf

Шаг 3. Настройка анонимного доступа (если нужен)

Если требуется предоставить публичный доступ без аутентификации, измените параметры:

anonymous_enable=YES
anon_upload_enable=YES          # разрешить анонимную загрузку
anon_mkdir_write_enable=YES     # разрешить создание папок
anon_root=/srv/ftp              # корневая папка для анонимов

По умолчанию анонимный пользователь работает в директории /srv/ftp (или /var/ftp в CentOS/RHEL) . Создайте эту папку и настройте права:

sudo mkdir -p /srv/ftp/upload
sudo chmod 755 /srv/ftp
sudo chown ftp:ftp /srv/ftp/upload

Для анонимной загрузки может потребоваться дополнительная настройка SELinux (на CentOS/RHEL) :

sudo setsebool -P allow_ftpd_anon_write on

Шаг 4. Изоляция пользователей (chroot)

Чтобы ограничить локальных пользователей их домашними директориями и не дать им видеть остальную файловую систему, включите chroot:

chroot_local_user=YES

При включённом chroot домашняя директория пользователя становится корнем FTP. Однако в новых версиях vsftpd требуется, чтобы домашняя папка не была доступна на запись для самого пользователя (иначе возникает ошибка 500) . Решение — создать внутри домашней папки поддиректорию для загрузок или включить опцию:

allow_writeable_chroot=YES

Если нужно изолировать только некоторых пользователей, используйте список:

chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

Затем добавьте в файл /etc/vsftpd.chroot_list имена пользователей, которых нужно изолировать .

Шаг 5. Ограничение доступа по списку пользователей

vsftpd позволяет контролировать, какие пользователи могут входить:

userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd.user_list
  • userlist_deny=NO — разрешён вход только пользователям из списка.
  • userlist_deny=YES — запрещён вход пользователям из списка.

Создайте файл и добавьте в него разрешённых пользователей (по одному на строку):

echo "username" | sudo tee -a /etc/vsftpd.user_list

Для дополнительной безопасности можно запретить доступ системным пользователям через файл /etc/ftpusers (формат — один пользователь на строку) .

Шаг 6. Настройка пассивного режима и брандмауэра

Для работы FTP через NAT (домашний роутер, облачный сервер) обязательно включите пассивный режим и укажите диапазон портов:

pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000

Откройте порты в брандмауэре:

Ubuntu/Debian (ufw):

sudo ufw allow 21/tcp
sudo ufw allow 30000:31000/tcp
sudo ufw reload

CentOS/RHEL (firewalld):

sudo firewall-cmd --permanent --add-service=ftp
sudo firewall-cmd --permanent --add-port=30000-31000/tcp
sudo firewall-cmd --reload

Подробнее о конфигурации пассивного режима можно прочитать в официальной документации RHEL .

Шаг 7. Применение конфигурации

После внесения изменений проверьте конфигурацию и перезапустите службу:

sudo systemctl restart vsftpd

Проверьте, что служба запустилась без ошибок:

sudo systemctl status vsftpd

Логи vsftpd пишутся в файл, указанный в xferlog_file (по умолчанию /var/log/vsftpd.log). Для отладки можно посмотреть логи в реальном времени:

sudo tail -f /var/log/vsftpd.log

Шаг 8. Настройка FTPS (FTP over SSL/TLS)

Для шифрования передаваемых данных и паролей необходимо настроить FTPS. Сначала создайте самоподписанный сертификат :

Ubuntu/Debian:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/ssl/private/vsftpd.key \
    -out /etc/ssl/certs/vsftpd.pem

CentOS/RHEL:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout /etc/pki/tls/private/vsftpd.key \
    -out /etc/pki/tls/certs/vsftpd.pem

Затем добавьте в конфигурационный файл vsftpd:

# Включить SSL
ssl_enable=YES

# Пути к сертификату и ключу
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key

# Разрешить SSL для анонимов
allow_anon_ssl=NO

# Требовать SSL для локальных пользователей
force_local_logins_ssl=YES
force_local_data_ssl=YES

# Разрешить TLS (рекомендуется, TLS безопаснее SSL)
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO

# Отключить требование сертификата от клиента (для простоты)
require_ssl_reuse=NO

После перезапуска vsftpd сервер будет принимать только защищённые соединения. Клиенты должны использовать Explicit FTPS (порт 21) с включённым TLS/SSL .

Полная документация по настройке SSL в vsftpd доступна в Red Hat Knowledgebase .

Шаг 9. Создание пользователя для FTP

Если нужно создать выделенного пользователя только для FTP (без возможности входа в систему через SSH):

sudo useradd -m -s /bin/false ftpuser
sudo passwd ftpuser

Добавьте /bin/false в список разрешённых оболочек, чтобы PAM не блокировал вход :

echo /bin/false | sudo tee -a /etc/shells

Если вы используете список разрешённых пользователей (userlist_deny=NO), добавьте ftpuser в файл /etc/vsftpd.user_list.

Шаг 10. Проверка работы

Тестирование через командную строку:

ftp localhost
# или для FTPS используйте lftp:
lftp -u ftpuser,password ftp://localhost

Тестирование через FileZilla (Windows/Linux):

  • Протокол: FTP — File Transfer Protocol
  • Шифрование: Требовать явное FTP over TLS (для FTPS)
  • Хост: IP-адрес сервера
  • Логин и пароль: созданные учётные данные

Если всё настроено правильно, вы сможете подключаться, загружать и скачивать файлы.

Устранение распространённых проблем

ПроблемаПричинаРешение
Ошибка 500 «OOPS: cannot change directory»SELinux блокирует доступsudo setsebool -P ftpd_full_access on 
Ошибка 530 «Login incorrect»Пользователь не в списке разрешённых или неверный парольПроверьте userlist_enable и userlist_deny, добавьте пользователя в список
Ошибка 500 после включения chrootДомашняя папка доступна на записьВключите allow_writeable_chroot=YES или измените права папки
Пассивный режим не работаетНе открыты порты в брандмауэреОткройте порты pasv_min_portpasv_max_port
FTPS не подключаетсяКлиент использует не тот тип шифрованияИспользуйте Explicit FTPS (порт 21), не Implicit
Пользователь с /bin/false не может войти/bin/false отсутствует в /etc/shellsДобавьте оболочку в /etc/shells 

vsftpd это надёжный, безопасный и высокопроизводительный FTP-сервер, который подходит как для простых внутренних задач, так и для защищённой передачи данных через интернет. Благодаря гибкой системе конфигурации вы можете тонко настроить права доступа, изоляцию пользователей и шифрование канала.

Menu