Запуск vsftpd в Docker (Swarm)

Вопрос или проблема

Я хочу использовать сервер vsftp в своей Docker Swarm, но у меня возникли проблемы с сетью. У меня есть следующий файл compose:

services:
  vsftpd:
    container_name: vsftpd
    image: million12/vsftpd
    restart: always
    volumes:
    - /whatever:/var/ftp/:ro
    environment:
    - ANONYMOUS_ACCESS=true
    - LOG_STDOUT=true
    - CUSTOM_PASSIVE_ADDRESS="<myexternalswarmadress>"
    ports:
    - 20-21:20-21
    - 21100-21110:21100-21110
      #network_mode: "host"

Если я запускаю этот файл compose с помощью docker compose и режима сети “host”, то могу легко к нему подключиться. Если я запускаю его без режима сети “host”, я получаю следующий вывод:

Status: Angemeldet
Status: Empfange Verzeichnisinhalt...
Befehl: PWD
Antwort:    257 "/" is the current directory
Befehl: TYPE I
Antwort:    200 Switching to Binary mode.
Befehl: PASV
Antwort:    500 OOPS: invalid pasv_address
Befehl: PORT 10,10,10,102,10,187
Fehler: Verbindung vom Server geschlossen

Я вижу вход в выводе сервера vsftp:

vsftpd  | [VSFTPD 16:46:41] VSFTPD daemon starting
vsftpd  | Tue Nov 19 16:46:45 2024 [pid 33] CONNECT: Client "<myclientip>"
vsftpd  | Tue Nov 19 16:46:45 2024 [pid 32] [ftp] OK LOGIN: Client "<myclientip>", anon password "[email protected]"

У меня те же результаты, если я запускаю это в swarm. Похоже, у меня проблемы с “пассивными портами” и сетью docker. К сожалению, в swarm нет “network_mode: host” (даже если я привязываю сервис к хосту).

Существует ли возможность запустить vsftpd в пассивном режиме в Swarm, как в Compose с режимом сети? Или есть другие способы запустить работающий ftp-сервер в Swarm?

Ответ или решение

Запуск vsftpd в Docker Swarm: Подробное руководство

Запуск FTP-сервера, такого как vsftpd, в Docker Swarm может представлять некоторые проблемы, особенно в отношении конфигурации сетевых портов. В данном руководстве мы рассмотрим подходы к решению проблем с сетью и обеспечению корректной работы FTP-сервера в Docker Swarm.

Проблема

Проблема, с которой вы столкнулись, заключается в том, что при работе без режима network_mode: host, вы получаете сообщение об ошибке 500 OOPS: invalid pasv_address. Это обычно связано с неправильной настройкой пассивного режима и тем, как Docker обрабатывает запросы к портам в окружении Swarm.

Решения

  1. Настройка пассивного режимаftp

    Чтобы vsftpd работал в пассивном режиме, необходимо убедиться, что вы правильно настроили диапазоны портов и параметры pasv_address.

    • В вашем docker-compose.yml файле, вы уже указали переменную окружения CUSTOM_PASSIVE_ADDRESS. Убедитесь, что вы используете реальный внешний IP-адрес вашего Swarm-кластера в этой переменной.
    • Добавьте к вашему сервису следующие переменные окружения, чтобы явно задать диапазоны портов и адреса:

      environment:
      - ANONYMOUS_ACCESS=true
      - LOG_STDOUT=true
      - CUSTOM_PASSIVE_ADDRESS="<myexternalswarmaddress>"
      - PASV_MIN_PORT=21100
      - PASV_MAX_PORT=21110
  2. Привязка портов

    Убедитесь, что в секции ports вашего docker-compose.yml правильно указаны порты для пассивного режима:

    ports:
     - 20:20
     - 21:21
     - 21100-21110:21100-21110

    Это позволят Docker проксировать трафик с внешних портов на соответствующие порты в контейнере.

  3. Настройка Docker Swarm Network

    В Docker Swarm нет режима host для контейнеров, что означает, что вам нужно использовать сервисную сеть. Создайте внешнюю сеть, которая будет использоваться вашими сервисами в Docker Swarm:

    docker network create --driver overlay my_overlay_network

    Затем укажите эту сеть в вашем docker-compose.yml:

    networks:
     my_overlay_network:
       external: true
    
    services:
     vsftpd:
       networks:
         - my_overlay_network
  4. Тестирование подключения

    После внесения всех изменений перезапустите стек Docker Swarm с помощью:

    docker stack deploy -c docker-compose.yml <имя_стека>

    Попробуйте подключиться к вашему FTP-серверу и проверьте, работает ли пассивный режим. Используйте FTP-клиент с поддержкой пассивного режима для выполнения тестирования.

  5. Дополнительные рекомендации

    • Логи: Проверьте логи vsftpd для более детальной информации об ошибках. Это поможет в дальнейшем устранении неполадок.
    • Безопасность: Если возможно, рассмотрите использование FTP через SSL (FTPS) для повышения безопасности передачи данных.
    • Эксперименты с другими образами: В ситуациях, когда vsftpd не работает должным образом, можно рассмотреть использование других образов FTP-серверов, которые могут иметь лучшую совместимость с Docker Swarm.

Заключение

Запуск FTP-сервера в Docker Swarm требует тщательной конфигурации сетевых параметров и управления портами. Следуя представленным рекомендациям, вы сможете наладить работу вашего vsftpd сервера в Swarm, обеспечив корректное функционирование как активного, так и пассивного режимов.

Оцените материал
Добавить комментарий

Капча загружается...