Організація гостьового сервера FTP
Постало завдання десь зберігати дампи україномовних сайтів у сирому HTML. Розгортати повноцінний Git хостинг поки не хочу, зокрема й тому що при кожному апдейті там будуть оновлюватись хеші файлів, це не дуже доречно. Утім, хочеться якось "розподілити" дані між користувачами.
Для цієї мети, вирішив підняти старий добрий публічний сервер FTP (для локальної мережі) з анонімним доступом до сервера в активному та пасивному режимах. Доступ до файлів тут в режимі read-only, я додаю їх від користувача по окремому потоку SSH.
Нижче описані кроки з налаштувань, щоб наступного не лазити по закладкам, може комусь стане в нагоді.
apt install vsftpd
Налаштування
- В системі Fedora, файл конфігурації знаходиться за адресою /etc/vsftpd/vsftpd.conf
- В Debian - це /etc/vsftpd.conf
# дозволити підключення в анонімному режимі 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
- інші опції я лишив як є, але це актуально лише для моєї версії vsftdp - будьте уважні!
Фаєрвол
Тепер важливо відкрити потрібні порти. Так як я не використовую режим 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
- для Mycelium вказуємо 0400::/7
Мульти-мережний режим
Я особисто використовую правила без from (дозволяю підключення звідусіль) оскільки в мене крутиться декілька IPv6 мереж і якщо правильно не забіндити сервер на одній з них - можливі помилки підключення в пасивному режимі. Якщо не вдається підключитись через таймаут - дивіться /var/log/ufw.log і спробуйте тимчасово викнути фаєрвол взагалі, щоб перевірити чи справа дійсно в ньому (ufw disable).
Нотатки
Монтування теки до публічного кореня FTP
Сервер vsftpd не підтримує символічні посилання, утім, в Linux це обмеження можна обійти монтуванням з аргументом `--bind`:
mount --bind /path/to/destination /path/to/ftp/destination
- тека-донор при цьому стає не доступною (так само як і usb пристрій)
- для рекурсивного монтування вмісту, дивіться `--rbind`
Відмонтувати:
umount /path/to/ftp/destination
- відключення відбудеться після того, як останній процес (клієнт) завершить читання/запис
Запуск
- systemctl restart vsftpd - застосовуємо конфігурацію перезапуском сервера
- systemctl enable vsftpd - автозапуск сервера при старті системи
- systemctl status vsftpd - перевіряємо статус, після чого можна підключатися