Страницы

Показаны сообщения с ярлыком ftp. Показать все сообщения
Показаны сообщения с ярлыком ftp. Показать все сообщения

среда, 28 мая 2014 г.

Mikrotik. Собственный FTP-сервис на домашнем компьютере. Проброс порта №21

Возникла задача сделать собственный простейших сервис загрузки/выгрузки файлов на домашний ftp-сервер.

Настройка ftp-сервера в ubuntu, можно посмотреть в заметке:
FTP-сервер Vsftpd на Hp proliant microserver

Для уменьшения проблем, клиент FTP надо настроить в пассивном режиме (PASSIVE MODE), который гарантирует, что все соединения будут открывать со стороны клиента к серверу, что гарантирует корректное прохождение NAT на роутере.

Для такого режима (FTP Passive mode) на роутере надо пробросить один порт. Моя конкретная ситуация осложняется тем, что порт № 21, ответственный за управление FTP, фильтруется на стороне провайдера.

Поэтому, сделаем себе другой порт на роутере (к примеру 12121) и его пробросим на стандартный порт № 21 на домашнем компьютере (192.168.1.11).

На Микротике надо добавить первое правило, в таблицу IP NAT.

Вот выкопировка:

$ /ip firewall nat print
 0   ;;; To FTP server. SERVER PASSIVE MODE
     chain=dstnat action=netmap to-addresses=192.168.1.11 to-ports=21
     protocol=tcp in-interface=wan dst-port=12121


Используется специальное действие, предназначенное для таких целей - netmap.
in-interface=wan - это для интернет- интерфейса трансляция.

Чтобы подключаться из домашней сети (bridge-local) я склонировал правило, указав входной интерфейс bridge-local.

Тоже самое проделал и для беспроводной сети, которая у меня удалена из bridge-local, и создает свой мост wireless. Это позволило избежать проблем при трансляции UDP-multicast.

Всё.

Настройка клиентов на Androide и настольном компьютере, простейшая. Только надо выбрать режим PASSIVE (Пассивный). И этот дурацкий 20 порт не будет участвовать в обмене.


Из Android FTP-клиентов очень понравился Turbo client. Так его и искать в Google Play.

Пока замечу, что c FTPS (SSL) у Turbo client в связки с NAT Mikrotik) пока возникают сложности, с которыми ещё надо разобраться. Ниже пример, решения. Другой FTP клиент, заработал, когда ему настроил второе правило, см. ниже.

Для того, чтобы некоторые клиенты корректно работали с FTPS (SSL), помимо настройки сервера, надо добавить проброс открываемых сервером портов, на домашний компьютер (ftp-сервер).

 4   ;;; To FTP Data
     chain=dstnat action=netmap to-addresses=192.168.1.11 to-ports=12122-12199
     protocol=tcp in-interface=wan dst-port=12122-12199


Эти значения корреспондируют с настройками в vstftpd сервере:

pasv_max_port=12199
pasv_min_port=12122
Т.е. FTP-сервер, при необходимости будет делать соединения в этом диапазоне.

Для моих настроек, для android ftp-клиента Turbo client сработало указание типа подключения FTPES. Именно ES. Для AndFTP - тип подключения FTPS (Explicit SSL).
Как-то так. Есть мелкие баги, которые постепенно выковыриваются.

Как результат, есть защищённый, анонимный доступ к домашнему ftp-серверу из внешней сети.

※※※

Часто возникает проблема подключения к ftp-серверу изнутри домашней сети, по его публичному адресу (или динамическому домену). Эта проблема известна - надо использовать дополнительное правило преобразования ip-адресов [3].
В случае несовпадения портов, надо использовать пример в [4].
Пока не настроил, приходится использовать доступ по внутреннему адресу, а при внешнем доступе - по внешнему.


Для упрощения операций на ftp-сервере, я задал права в /etc/vsftpd.conf:
anon_umask=0000
file_open_mode=0777



※※※

Ресурсы


1. FTP-сервер Vsftpd на Hp proliant microserver. http://gimmor.blogspot.ru/2012/09/ftp-vsftpd-hp-proliant-microserver.html
2. Консольный клиент FTP. http://lftp.yar.ru/
3. http://wiki.mikrotik.com/wiki/Hairpin_NAT
4. http://superuser.com/questions/663820/port-forwarding-from-inner-network-to-inner-network-hairpin-nat

※※※

четверг, 13 сентября 2012 г.

Анонимный FTP-сервер Vsftpd на Hp proliant microserver

Настройка ftp сервера VSFTPD

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

Установка ftp сервера на микросервере, под Ubuntu 12.04.

$sudo apt-get install vsftpd

Главный конфигурационный файл /etc/vsftpd.conf
Главный конфигурационный файл в системе  Fedora 32: /etc/vsftpd/vsftpd.conf
Файл журнала /var/log/vsftpd.log

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

root@microserver:~# cat /etc/vsftpd.conf

# Конфигурация FTP сервиса микросервера - /etc/vsftpd.conf
# http://gimmor.blogspot.com/2012/09/ftp-vsftpd-hp-proliant-microserver.html
# 13 сентября 2012
# сервер: микросервер
# Особенности: анонимный доступ на чтение и запись
# Для просмотра всех опций ftp-сервера: man 5 vsftpd.conf

# Сервер будет запущен в отдельном(standalone) режиме

listen=YES
listen_ipv6=NO
# По умолчанию, ftp-сервер доступен на всех локальных интерфейсах микросервера
# Чтобы отобрать интерфейсы, на которых будет доступен ftp-сервер, задается опция:
listen_address=192.168.3.1,192.168.5.1
# в нашем случае, ftp-сервер будет работать в локальной сети

# Порт, на котором  ftp-сервер слушает подключения, 21- стандартный порт FTP.
listen_port=21
#
ftp_data_port=20
connect_from_port_20=YES

# Разрешен доступ анонимных пользователей, с известными именами ftp, anonymous
anonymous_enable=YES
# Не требуется пароль для анонимных пользователей
no_anon_password=YES
# Опция ftp_username позволяет задать имя анонимного пользователя
ftp_username=ftp

# Каталог для анонимных пользователей, /srv/ftp по-умолчанию
# каталог должен принадлежать пользователю ftp, иначе соединение закрывается
anon_root=/srv/ftp


#secure_chroot_dir=/var/run/vsftpd/empty


# Опции разрешающие анонимному пользователю, загружать файлы, создавать, удалять каталоги
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

# Разрешена выгрузка файлов пользователем
download_enable=YES

ls_recurse_enable=YES

# Права на доступ к загруженным пользователем файлам на ftp сервер (вновь созданным)
anon_umask=0013
file_open_mode=0766
chown_upload_mode=0011

# Разрешить доступ локальным пользователям
local_enable=NO


# Журнал ftp-сервера
vsftpd_log_file=/var/log/vsftpd.log

# Можно перенаправить журнальный вывод в стандартный системный журнал
syslog_enable=NO
# Журналирование команд протокола
log_ftp_protocol=NO


# Регистрация активности(выгрузка/загрузка) пользователей в журнале /var/log/vsftpd.log
xferlog_enable=YES
xferlog_file=/var/log/vsftpd.log


Права на каталог /srv/ftp и его файлы


Чтобы было можно создавать,удалять,изменять каталоги в клиенте ftp, бит исполнения (x) должен быть установлен для каталога anon_root, для пользователя, группы, для всех.

$ ls -l /srv
 dr-xrwxr-x 3 ftp ftp 4096 мая   27 19:14 ftp



Также, если возникает ошибка доступа (невозможно зайти):

500 OOPS: vsftpd: refusing to run with writable root inside chroot()
Login failed.
421 Service not available, remote server has closed connection
ftp>

Это особенность сервера vsftpd, ограничивающего доступ к анонимному корню (папке /srv/ftp или /var/ftp).
Для исправления, надо убрать для всех  права на запись в каталог anon_root (/srv/ftp), а если и доступ локальных пользователей то и для local_root.

Было:
# ls - l /srv/ftp
итого 4
drwxrwxrwx. 3 ftp ftp 4096 мая 16 17:27 ftp

Станет:
# chmod a-w /srv/ftp

Стало:
# ls /srv -l
итого 4
dr-xr-xr-x. 3 ftp ftp 4096 мая 16 17:27 ftp

Чтобы можно было читать (загружать c ftp, Download) файлы, у любого файла должны быть права на чтения для пользователя, группы, для всех.
# ls -l /srv/ftp/test
-rw-r--r-- 1 ftp ftp 528881 мая   27 19:45 IMG_20140525_004452.jpg

Для задания прав на загружаемый файл есть основная опция, file_open_mode, задающая права на доступ к созданному (загруженному)файлу.
Затем к этому значению, применяются маски anon_umask и chown_upload_mode.

Пример - будут созданы файлы, загруженные на ftp (Upload), файлы с правами на чтение и запись, при этом будет сброшена возможность записи для всех остальных, но пользователь (ftp) и его группа (ftp) смогут читать и писать в файл. Также для всех будет сброшена исполняемость файла, т.е. файлы
anon_umask=0113
file_open_mode=0666
chown_upload_mode=0111

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

Например: 07 = b111 - rwx, 06 = b110 - rw-, 01 = b001 - --x

Часто используется значение 0644 - которое разрешает на запись и чтение, только пользователю, а всем остальным - только чтение.

Чтобы анонимный пользователь мог создавать папку (например, копировать целую папку на ftp-сервер), бит исполнения для вновь создаваемой папки должен быть. Т.е. маска file_open_mode = 0766
Тогда
anon_umask=0013
file_open_mode=0766
chown_upload_mode=0011


Есть некоторый баг, что невозможно загрузить в корневой каталог ftp-сервера какой-либо файл. Выручает в этом случае, предварительное создание любого каталога на сервере.

# mkdir /srv/ftp/testdir
# chown ftp:ftp /srv/ftp/testdir



Запуск сервера в standalone режиме



из под пользователя root
# /usr/sbin/vsftpd

Запуск сервера в системе с Systemd


# systemctl start vsftpd.service

# systemctl status vsftpd.service
vsftpd.service - Vsftpd ftp daemon
     Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
     Active: active (running) since Sun 2012-05-17 19:22:54 MSK; 5s ago
    Process: 8710 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=0/SUCCESS)
   Main PID: 8711 (vsftpd)
      Tasks: 1 (limit: 9171)
     Memory: 540.0K
        CPU: 6ms
     CGroup: /system.slice/vsftpd.service
             └─8711 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

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

# systemctl enable --now vsftpd
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.

Проблемы доступа, вызванные подсистемой SELinux

Быстрый способ оценить, влияют ли политики безопасности на проблему доступа к ftp-серверу vsftpd - временно перевести подсистему SELinux в нестрогий (permissive) режим наблюдения и регистрации.

# setenforce 0

# sestatus

SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   permissive
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Memory protection checking:     actual (secure)
Max kernel policy version:      32

Если после этого  дело пошло, тогда возможно подкорректировать политики.

Посмотреть политики относящиеся к ftpd:

# sestatus -b | grep "ftpd"
ftpd_anon_write                             on
ftpd_connect_all_unreserved                 on
ftpd_connect_db                             off
ftpd_full_access                            on
ftpd_use_cifs                               off
ftpd_use_fusefs                             off
ftpd_use_nfs                                off
ftpd_use_passive_mode                       on


Включаются эти переменные так:

# setsebool -P ftpd_anon_write on
# setsebool -P ftpd_full_access on
# setsebool -P ftpd_use_passive_mode on

Также можно посмотреть контекст безопасности для anon_root:

# ls --context /srv -l
итого 4

dr-xr-xr-x. 3 ftp ftp unconfined_u:object_r:public_content_t:s0 4096 мая 16 17:27 ftp

public_content_t - контекст на чтение
public_content_rw_t - контекст на чтение и запись

Сменить контекст (рекурсивно на вложенные каталоги) можно так:

# semanage fcontext -a -t public_content_rw_t "/srv/ftp"
# restorecon -F -R -v /srv/ftp
Relabeled /srv/ftp from unconfined_u:object_r:public_content_t:s0 to system_u:object_r:public_content_rw_t:s0
Relabeled /srv/ftp/upload from unconfined_u:object_r:public_content_t:s0 to system_u:object_r:public_content_rw_t:s0


Проблемы доступа вызванные настройкой Firewall

На примере дистрибутива Fedora 32 Workstation.

Быстро оценить влияние настроек брэндмауэра на доступ к серверу fsvtpd - временно отключить встроенный Firewalld.

# systemctl stop firewalld.service

Если влияет. включаем для отладки:

# systemctl start firewalld.service

Основная команда управления firewall-cmd.

Зоны, сервисы, порты.

# firewall-cmd --get-default-zone
FedoraWorkstation

# firewall-cmd --info-zone=FedoraWorkstation
FedoraWorkstation (active)
  target: default
  icmp-block-inversion: no
  interfaces: wlp4s0b1
  sources:
  services: dhcpv6-client ftp mdns samba-client ssh
  ports: 1025-65535/udp 1025-65535/tcp 40000-40010/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Добавим описание сервиса FTP в зону по умолчанию:

# firewall-cmd --add-service=ftp --permanent
# firewall-cmd --service=ftp --add-port=21/tcp --permanent


Просмотрим, правильность описания FTP-сервера:
# firewall-cmd --info-service=ftp


Анонимный доступ к серверу пользователя ftp


$ ftp://ftp@microserver/
$ ftp microserver.local

ftp@ - это указывает пользователя

$ ftp
ftp> open microserver.local


Локальные (зарегистрированые) пользователи и их доступ к FTP серверу


Для локальных пользователей есть свои опции:
local_enable=YES
local_root=/home
chroot_local_user=YES
# Маска доступности файла, другим пользователям. Здесь - недоступна всем, но доступна на чтение группе зарегистрировавшегося пользователя
local_umask=0013

После этого, локальные, системные пользователи из /etc/passwd будут попадать в /home
Выхода за пределы /home у них не будет, но вот друг друга просматривать будут, что не есть хорошо.

Вполне возможно, что использовать локальных пользователей для доступа по ftp не самая хорошая идея.
Но тут приходят на выручку - виртуальные пользователи, т.е. те кто могут заходить по ftp, но они не системные.

Публикация ftp-сервера посредством avahi

При установленном на сервере пакете avahi-daemon, возможно публикация сервиса ftp, посредством mDNS.
Для этого создается файл, в папке /etc/avahi/services/ следующего содержания:

root@microserver:~# cat /etc/avahi/services/ftp.service 

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<!-- Публикация FTP сервера
     8 сентября 2012 
     сервер: микросервер
-->
    <service-group>
    <name>Microserver File Transfer</name>
    <service>
    <type>_ftp._tcp</type>
    <port>21</port>
    </service>
    </service-group>

Возможно потребуется перезапуск демона Avahi:
# systemctl restart avahi-daemon

После этого, сервис доступен для просмотра с помощью Nautilus. Ссылки на ftp-сервер микросервера появляются во всех программах поддерживающих mDNS (Nautilus, Web-Epiphany)

Просмотр опубликованного сервиса FTP через Nautilus
Вход на ftp-сервер настроен для анонимного использования (для быстрого доступа).

Вход на FTP сервер через Nautilus