Вопрос или проблема
Я хочу использовать сервер 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.
Решения
-
Настройка пассивного режима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
- В вашем
-
Привязка портов
Убедитесь, что в секции
ports
вашегоdocker-compose.yml
правильно указаны порты для пассивного режима:ports: - 20:20 - 21:21 - 21100-21110:21100-21110
Это позволят Docker проксировать трафик с внешних портов на соответствующие порты в контейнере.
-
Настройка 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
-
Тестирование подключения
После внесения всех изменений перезапустите стек Docker Swarm с помощью:
docker stack deploy -c docker-compose.yml <имя_стека>
Попробуйте подключиться к вашему FTP-серверу и проверьте, работает ли пассивный режим. Используйте FTP-клиент с поддержкой пассивного режима для выполнения тестирования.
-
Дополнительные рекомендации
- Логи: Проверьте логи vsftpd для более детальной информации об ошибках. Это поможет в дальнейшем устранении неполадок.
- Безопасность: Если возможно, рассмотрите использование FTP через SSL (FTPS) для повышения безопасности передачи данных.
- Эксперименты с другими образами: В ситуациях, когда vsftpd не работает должным образом, можно рассмотреть использование других образов FTP-серверов, которые могут иметь лучшую совместимость с Docker Swarm.
Заключение
Запуск FTP-сервера в Docker Swarm требует тщательной конфигурации сетевых параметров и управления портами. Следуя представленным рекомендациям, вы сможете наладить работу вашего vsftpd сервера в Swarm, обеспечив корректное функционирование как активного, так и пассивного режимов.