Не запускается vsftpd centos

Обновлено: 05.07.2024

vsFTPd и proFTPd — одни из самых простых способов поднять сервер FTP на Linux. В данной инструкции пойдет речь о vsFTPd и Ubuntu (на примере версий 14 и 16).

Установка и настройка

Обновляем списки портов в репозиториях:

apt-get install vsftpd

Открываем конфигурационный файл:

И снимаем комментарий со следующих строк:

* write_enable — разрешить копировать файлы на сервер; chroot_local_user — использовать для пользователей изолированное окружение.

И дописываем следующее:

allow_writeable_chroot=YES
pasv_enable=YES
pasv_max_port=60000
pasv_min_port=65535

* где allow_writeable_chroot разрешаем использовать домашние каталоги с правом на запись; pasv_enable включает пассивный режим работы FTP-сервера; pasv_max_port и pasv_min_port определяют диапазон портов для пассивного режима.

Если используется брандмауэр, необходимо добавить правила и разрешить следующие порты:

  • 20 — основной порт FTP для передачи.
  • 21 — для активного режима. Используется для передачи команд.
  • 60000-65535 — диапазон динамических портов, который нами был определен в конфигурационном файле. Используется для пассивного режима.

Разрешаем и перезапускаем сервис:

systemctl enable vsftpd

systemctl restart vsftpd

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

iptables -I INPUT -p tcp --match multiport --dports 20,21,60000:65535 -j ACCEPT

Для сохранения правил можно использовать утилиту:

apt-get install iptables-persistent

Добавление пользователя

По умолчанию, авторизация выполняется с использованием локальных пользователей. Чтобы использовать специальную учетную запись, для подключения к FTP, создаем пользователя следующей командой:

useradd ftpuser -d /ftp -s /bin/false -m

* где ftpuser — имя учетной записи; /ftp — домашний каталог (в него будем попадать при подключении); /bin/false — запрет пользователю на локальный вход в систему.

Открываем на редактирование следующий файл:

И добавляем следующее:

* мы добавили /bin/false в список разрешенных оболочек. В противном случае, может вернуться ошибка 530 Login incorrect.

Проверка

Для проверки подключения можно воспользоваться FTP-клиентом на другом компьютере (например, FileZilla или Total Commander).

Также можно установить FTP-клиент на сервер:

apt-get install ftp

И для подключения используем следующую команду:

Система запросит логин и пароль.

Настройка SSL/TLS

TLS позволяет настроить безопасный FTP, передача данных через который осуществляется по шифрованному каналу.

Для данной цели можно использовать самоподписанный сертификат. Чтобы его создать, вводим команду:

openssl req -new -x509 -days 1461 -nodes -out /etc/ssl/certs/vsftpd.pem -keyout /etc/ssl/private/vsftpd.key -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=ftp.dmosk.local/CN=ftp"

Открываем на редактирование конфигурационный файл vsFTPd:

rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.key
ssl_enable=YES

* где ssl_enable разрешает использование шифрования; rsa_cert_file — путь к открытому ключу; rsa_private_key_file — путь к закрытому ключу.

И дописываем следующие:

allow_anon_ssl=NO
force_local_data_ssl=NO
force_local_logins_ssl=NO
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
ssl_ciphers=HIGH

  • allow_anon_ssl разрешает использовать SSL анонимным пользователям;
  • force_local_data_ssl требует использования шифрования, и если установить YES, клиенты без шифрования не смогут подключиться;
  • force_local_logins_ssl также требует подключение по SSL;
  • ssl_tlsv1 — использовать TLS версии 1;
  • ssl_sslv2 и ssl_sslv3 — использовать SSL версии 1 и 2;
  • ssl_ciphers — выбор шифра. В данном примере мы говорим использовать максимально безопасный.

systemctl restart vsftpd

Виртуальные пользователи

Устанавливаем pam-модуль, позволяющий аутентифицировать пользователей с помощью passwd-like файлов:

apt install libpam-pwdfile

Открываем конфигурационный файл vsftpd и добавляем следующее:

user_config_dir=/etc/vsftpd_virtuser_conf
guest_enable=YES
virtual_use_local_privs=YES
pam_service_name=vsftpd
nopriv_user=vsftpd
guest_username=vsftpd

  • user_config_dir — каталог для хранения настроек пользователя.
  • guest_enable — разрешаем гостевой вход.
  • virtual_use_local_privs — виртуальные пользователи используют привилегии, как локальные, а не анонимные.
  • pam_service_name — имя pam-сервиса.
  • nopriv_user — под каким пользователем работает сервер, когда ему не нужны привилегии.
  • guest_username — имя гостевого пользователя.

Для возможности использовать утилиту htpasswd ставим следующий пакет:

apt install apache2-utils

Создаем каталог для хранения файла виртуальных пользователей и двух пользователей:

htpasswd -cd /etc/vsftpd/ftpd.passwd virt1

htpasswd -d /etc/vsftpd/ftpd.passwd virt2

* обратите внимание, опция -c команды htpasswd используется только при создании файла (при первом вводе команды). Мы создаем два пользователя — virt1 и virt2.

Архивируем имеющийся pam-сервис для vsftpd:

mv /etc/pam.d/vsftpd /etc/pam.d/back_vsftpd

Создаем новый со следующим содержимым:

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so

В самой системе создаем пользователя, которого используем как гостевого:

useradd vsftpd -d /home/vsftpd -g nogroup -m -s /bin/false

* с домашней директорией /home/vsftpd, основной группой nogroup и без возможности входа в систему (-s /bin/false).

Создаем каталог хранения настроек виртуальных пользователей:

и создаем настройку для первого:

* local_root — домашняя директория для FTP пользователя virt1.

Создаем домашний каталог для нашего пользователя virt1 и задаем правильные права:

На текущий момент есть две удачные реализации FTP-сервера для Linux: vsFTPd и proFTPd. В данной инструкции речь пойдет о первом, так как его актуальная версия более свежая, в то время, как последняя версия proFTPd выпущена в 2013 году.

Установка и базовая настройка vsFTPd

Запускаем процесс установки:

yum install vsftpd

После открываем на редактирование следующий файл:

И приводим его к следующему виду:

allow_writeable_chroot=YES
pasv_min_port=40900
pasv_max_port=40999

Отключаем SELinux следующими командами:

sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config

* первая команда отключит SELinux, вторая — отключит его автозапуск после перезагрузки.

Добавляем правила в брандмауэр для корректной работы FTP-сервера:

firewall-cmd --permanent --add-port=20-21/tcp

firewall-cmd --permanent --add-port=40900-40999/tcp

Разрешаем автозапуск vsFTPd и запускаем его:

systemctl enable vsftpd

systemctl start vsftpd

По умолчанию, к vsFTPd нельзя подключиться с использованием учетной записи root. Поэтому нужно использовать другую пользовательскую запись или создать новую следующей командой:

useradd ftpuser -d /var/www -s /sbin/nologin

* ftpuser — имя учетной записи; /var/www — домашняя директория; /sbin/nologin запрещает локальный вход в систему.

Задаем пароль новому пользователю:

Базовая настройка закончена — можно пробовать подключаться к FTP-серверу.

vsFTPd через TLS

TLS позволяет настроить безопасный FTP, передача данных через который осуществляется по зашифрованному каналу.

Для начала создаем сертификат:

openssl req -new -x509 -days 1461 -nodes -out /etc/vsftpd/vsftpd.pem -keyout /etc/vsftpd/vsftpd.pem -subj "/C=RU/ST=SPb/L=SPb/O=Global Security/OU=IT Department/CN=test.dmosk.local/CN=test"

* в данном примере мы создаем самоподписный сертификат на 4 года для URL test.dmosk.local или test. Обратите внимание, это один файл, в котором содержится открытый и закрытый ключи.

Открываем на редактирование конфигурационный файл vsFTPd:

И дописываем в него следующее:

ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=NO
force_local_logins_ssl=NO
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
rsa_cert_file=/etc/vsftpd/vsftpd.pem

* где ssl_enable разрешает использование шифрования; allow_anon_ssl разрешает использовать SSL анонимным пользователям; force_local_data_ssl требует использования шифрования, и если установить YES, клиенты без шифрования не смогут подключиться; force_local_logins_ssl также требует подключение по SSL; ssl_tlsv1 — использовать TLS версии 1; ssl_sslv2 — использовать SSL версии 2; ssl_sslv3 — использовать SSL версии 3; rsa_cert_file — путь к сертификату.

systemctl restart vsftpd

Виртуальные пользователи

Устанавливаем пакет compat-db:

yum install compat-db

На всякий случай, сохраняем pam файл для авторизации vsftpd:

mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.back

Создаем новый файл со следующим содержимым:

auth required pam_userdb.so db=/etc/vsftpd/virtual_users
account required pam_userdb.so db=/etc/vsftpd/virtual_users
session required pam_loginuid.so

* где /etc/vsftpd/virtual_users — файл, в котором мы будем хранить пользователей.

Открываем конфигурационный файл сервера FTP:

И добавляем следующее:

guest_enable=YES
guest_username=ftp
virtual_use_local_privs=YES
user_sub_token=$USER
local_root=/home/$USER

* где guest_enable разрешает виртуальных пользователей; guest_username — имя системной учетной записи, от которой работаю виртуальные пользователи; virtual_use_local_privs — виртуальные пользователи с такими же привилегиями, что и локальные; user_sub_token — имя учетной записи храниться в переменной $USER; local_root задает домашнюю директорию виртуальному пользователю.

Создаем файл с виртуальными пользователями со следующим содержимым:

ftp1
passwd1
ftp2
passwd2

* где ftp1 и ftp2 — логины; passwd1 и passwd2 — пароли.

Сразу генерируем из файла базу:

db_load -T -t hash -f /etc/vsftpd/virtual_users /etc/vsftpd/virtual_users.db

Необходимо убедиться, что для пользователей есть соответствующие домашние директории:

И также у системной учетной записи есть соответствующие права:

chown -R :ftp /home/ftp

systemctl restart vsftpd

Хранение пользователей в базе данных

В качестве базы данных можно использовать MySQL или MariaDB. В данном примере будет использоваться последняя.

Устанавливаем СУБД следующей командой:

yum install mariadb mariadb-server

Разрешаем автозапуск и запускаем сервис:

systemctl enable mariadb

systemctl start mariadb

Задаем пароль для пользователя root:

mysqladmin -u root password

Запускаем командную оболочку mariadb:

Создаем базу данных и пользователя с правами только на выборку данных:

> CREATE DATABASE vsftpd;

Подключаемся к созданной базе и создаем таблицу:

> CREATE TABLE `users` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) NOT NULL ,
`password` VARCHAR( 50 ) NOT NULL ,
UNIQUE (`username`)
) ENGINE = MYISAM ;

Теперь добавим пользователя:

* где ftpm1 — логин, password — пароль.

Выходим из оболочки mariadb:

Устанавливаем модуль pam_mysql:

Сохраняем копию pam файла:

mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.back

Создаем новый и приводим его к следующему виду:

session optional pam_keyinit.so force revoke
auth required pam_mysql.so user=vsftpd passwd=passwordftp host=localhost db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=3
account required pam_mysql.so user=vsftpd passwd=passwordftp host=localhost db=vsftpd table=users usercolumn=username passwdcolumn=password crypt=3

* где user=vsftpd passwd=passwordftp — логин и пароль для подключения к базе данных; db=vsftpd table=users — имя созданной базы данных и таблицы с пользователями; usercolumn=username passwdcolumn=password — название полей, из которых извлекаем логины и пароли для FTP-пользователей.

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

Возможные проблемы

Ошибка GnuTLS -15: An unexpected TLS packet was received

Ошибка возникает в том случае, когда у учетной записи, от которой идет подключения есть права на запись в корневую домашнюю директорию, а также используется безопасное соединение через TLS. В vsFTPd, по умолчанию, это приводит к ошибке.

Для решения проблемы воспользуйтесь любым из способов:

  1. Убираем права на запись для корневой директории, например: chmod a-w /var/www
  2. В конфигурационном файле vsftpd добавляем следующую строку:
    allow_writeable_chroot=YES

500 OOPS: vsftpd: refusing to run with writable root inside chroot()

Ошибка возникает в том случае, когда у учетной записи, от которой идет подключения есть права на запись в корневую домашнюю директорию. В vsFTPd, по умолчанию, это приводит к ошибке.

Для решения проблемы воспользуйтесь любым из способов:

  1. Убираем права на запись для корневой директории, например: chmod a-w /var/www
  2. В конфигурационном файле vsftpd добавляем следующую строку:
    allow_writeable_chroot=YES

500 OOPS: cannot change directory:/.

Не существует директории или нет прав на чтение.

Проверьте правильность настроек и то, что директория, действительно существует.

SFTP как альтернатива FTP

Если необходимо разово перенести на сервер данные, можно обойтись протоколом SSH File Transfer Protocol или SFTP. Все, что для этого нужно — доступ по SSH и программа клиент, например, WinSCP.

FTP-клиент на CentOS

Для более удобной проверки настроек можно установить FTP-клиент прямо на сервер и с его помощью выполнять подключения.

Для этого выполняем установку клиента:

yum install ftp

И подключаемся к нашему серверу командой:

Вводим логин и пароль, которые будут запрошены. После подключения мы увидим следующее:

Trying ::1.
Connected to localhost (::1).
220 (vsFTPd 3.0.2)
Name (localhost:root): ftpm1
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

Для теста можно загрузить файл на сервер FTP:

* сам файл должен быть в каталоге, в котором мы были перед подключение к серверу FTP.

Если мы получим ошибку 500 active mode is disabled, use passive mode instead, просто переключаемся в пассивный режим:

Читайте также: