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

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

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

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

``` bash
apt install vsftpd
```

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

* В системі Fedora, файл конфігурації знаходиться за адресою /etc/vsftpd/vsftpd.conf
* В Debian - це /etc/vsftpd.conf

``` 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

# підтримка кирилиці у назвах файлів (v3.0.5 - опція є застарілою)
# 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:

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

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

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

``` bash
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`:

``` bash
mount --bind /path/to/destination /path/to/ftp/destination
```
* тека-донор при цьому стає не доступною (так само як і usb пристрій)
* для рекурсивного монтування вмісту, дивіться `--rbind`

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

``` bash
umount /path/to/ftp/destination
```
* відключення відбудеться після того, як останній процес (клієнт) завершить читання/запис

## Запуск

* systemctl restart vsftpd - застосовуємо конфігурацію перезапуском сервера
* systemctl enable vsftpd - автозапуск сервера при старті системи
* systemctl status vsftpd - перевіряємо статус, після чого можна підключатися

## Посилання

=> https://devzone.org.ua/post/orhanizatsiia-hostyovoho-servera-ftp Веб-версія цієї публікації з коментарями на DevZone

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

=> social-oriented-vsftpd-server-setup.gmi Організація багатокористувацького файло-обмінника на базі FTP / vsftpd