Організація гостьового сервера FTP

Постало завдання десь зберігати дампи україномовних сайтів у сирому HTML. Розгортати повноцінний Git хостинг поки не хочу, зокрема й тому що при кожному апдейті там будуть оновлюватись хеші файлів, це не дуже доречно. Утім, хочеться якось "розподілити" дані між користувачами.

Для цієї мети, вирішив підняти старий добрий публічний сервер FTP (для локальної мережі) з анонімним доступом до сервера в активному та пасивному режимах. Доступ до файлів тут в режимі read-only, я додаю їх від користувача по окремому потоку SSH.

Нижче описані кроки з налаштувань, щоб наступного не лазити по закладкам, може комусь стане в нагоді.

apt install vsftpd

Налаштування

# дозволити підключення в анонімному режимі
anonymous_enable=YES

# заборонити логін локальних користувачів
local_enable=NO

# заборонити запис (додаю файли через SSH)
write_enable=NO

# маска, я її лишив здається стандартною
local_umask=022

# дозволити отримання списку директорій (для зручності навігації)
dirmessage_enable=YES

# вимкнув, щоб отримувати журнали в файл (див. vsftpd_log_file)
xferlog_std_format=NO

# вимкнув IPv4, оскільки я користуюсь тільки IPv6 (Yggdrasil/Mycelium)
listen=NO
listen_ipv6=YES

# в мене не стандартна локація на примонтованому пристрої
anon_root=/path/to/public

# дозволив відображення "прихованих" файлів що починаються з крапки
force_dot_files=YES

# увімкнув пасивний режим явно та вказав діапазон портів для iptables
# про активний і пасивний режими, конструктивно тут: https://vps.ua/wiki/ukr/ftp-mode/
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10100

# можна також обмежити конективність для певних конфігурацій
# pasv_address=
# pasv_addr_resolve=NO
# connect_from_port_20=YES

# файл журналів
vsftpd_log_file=/var/log/vsftpd.log

# підтримка кирилиці у назвах файлів
utf8_filesystem=YES

Фаєрвол

Тепер важливо відкрити потрібні порти. Так як я не використовую режим SSL, мені потрібно дозволити тільки порти 20, 21 і 10000-10100 (pasv_min_port і pasv_max_port відповідно).

На Fedora, я досі не навчився користуватись новомодним firewalld через командний рядок, тому зробив це через GUI Firewall / firewall-config (https://firewalld.org). Тут важливо додати ці правила до групи Permanent щоб вони не злетіли після ребуту.

В Debian, для перманентної зміни iptables, я користуюсь ufw:

ufw allow 20/tcp
ufw allow 21/tcp
ufw allow 10000:10100/tcp

Альтернативні мережі

Якщо потрібно дозволити підключення тільки для користувачів Yggdrasil:

ufw allow from 0200::/7 port 20 proto tcp
ufw allow from 0200::/7 port 21 proto tcp
ufw allow from 0200::/7 port 10000:10100 proto tcp

Мульти-мережний режим

Я особисто використовую правила без from (дозволяю підключення звідусіль) оскільки в мене крутиться декілька IPv6 мереж і якщо правильно не забіндити сервер на одній з них - можливі помилки підключення в пасивному режимі. Якщо не вдається підключитись через таймаут - дивіться /var/log/ufw.log і спробуйте тимчасово викнути фаєрвол взагалі, щоб перевірити чи справа дійсно в ньому (ufw disable).

Нотатки

Монтування теки до публічного кореня FTP

Сервер vsftpd не підтримує символічні посилання, утім, в Linux це обмеження можна обійти монтуванням з аргументом `--bind`:

mount --bind /path/to/destination /path/to/ftp/destination

Відмонтувати:

umount /path/to/ftp/destination

Запуск

Посилання

Веб-версія цієї публікації з коментарями на DevZone

Дивіться також

Організація багатокористувацького файло-обмінника на базі FTP / vsftpd