Вопрос или проблема
Для начала, я совсем новенький в использовании docker engine. У меня есть небольшой кластер из двух серверов с docker engine.
На node1 у меня: один контейнер с openvpn и контейнер с ftp, настроенный в пассивном режиме.
контейнер ftp:
docker run -d -v /var/lib/docker/volumes/ftpuserdb/_data:/home/vsftpd -p 20:20 -p 21:21 -p 21100-21110:21100-21110 -e FTP_USER=bob -e FTP_PASS=12345 -e PASV_ADDRESS=<PUBLIC IP> -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 -e PASV_ADDRESS_ENABLE=YES -e PASV_ENABLE=YES --name ftp-server fauria/vsftpd
На node2 у меня всего лишь контейнер для тестирования подключения ftp (ftpclient).
Я могу подключаться к ftp из (ftpclient), но когда я пытаюсь использовать пассивный режим, я получаю ошибку:
227 Entering Passive Mode (public,ip,from,node1,82,110). (я скрыл ip ^^)
ftp: connect: Connection refused
Когда я проверил брандмауэр: я вижу, что мой порт открыт.
Chain DOCKER (2 references)
target prot opt source destination
ACCEPT udp -- anywhere IP udp dpt:openvpn
ACCEPT tcp -- anywhere IP tcp dpt:3000
ACCEPT tcp -- anywhere IP tcp dpt:21110
ACCEPT tcp -- anywhere IP tcp dpt:21109
ACCEPT tcp -- anywhere IP tcp dpt:21108
ACCEPT tcp -- anywhere IP tcp dpt:21107
ACCEPT tcp -- anywhere IP tcp dpt:21106
ACCEPT tcp -- anywhere IP tcp dpt:21105
ACCEPT tcp -- anywhere IP tcp dpt:21104
ACCEPT tcp -- anywhere IP tcp dpt:21103
ACCEPT tcp -- anywhere IP tcp dpt:21102
ACCEPT tcp -- anywhere IP tcp dpt:21101
ACCEPT tcp -- anywhere IP tcp dpt:21100
Но если я попробую ftp с моего node2 напрямую с хоста, у меня нет проблем. Всё работает.
У кого-нибудь есть идеи? Я пробовал много всего и не могу понять….
С уважением
Согласно Википедии:
В пассивном режиме клиент использует управляющее соединение для отправки сервера команды PASV, после чего получает IP-адрес сервера и номер порта сервера от сервера, который клиент затем использует для открытия соединения данных с произвольного клиентского порта к IP-адресу сервера и номеру порта сервера, полученным от сервера.
Так что по сути клиент может подключиться к любому случайному порту на FTP-сервере.
Некоторые FTP-сервера (proftpd
с директивой PassivePorts
, например) могут быть настроены так, чтобы ограничивать порты, которые они используют для пассивного режима, некоторым диапазоном, который вы могли бы отобразить на тот же диапазон на хосте.
Ответ или решение
Проблема FTP в контейнерах Docker: Решение
В данной статье мы рассмотрим общую проблему, возникающую при подключении к FTP-серверу в контейнере Docker в режиме пассивной передачи. Ниже приводится подробное решение, основанное на вашем описании проблемы и конфигурации.
Описание проблемы
Вы работаете с двумя серверами Docker, на которых настроены контейнеры: на первом сервере (node1) работает FTP-сервер с поддержкой OpenVPN, а на втором (node2) — клиент для тестирования подключения к FTP. При попытке подключения из контейнера FTP-клиента в пассивном режиме возникает ошибка:
227 Entering Passive Mode (public,ip,from,node1,82,110).
ftp: connect: Connection refused
При этом попытка подключения с самого сервера node2 напрямую не вызывает никаких проблем, что указывает на то, что сам FTP-сервер работает корректно.
Причины проблемы
Причинами данной проблемы могут быть:
-
Неверная конфигурация PASV_ADDRESS: Вы указали
PASV_ADDRESS=<PUBLIC IP>
. Убедитесь, что этот IP-адрес действительно соответствует внешнему адресу вашего сервера, к которому пытается подключиться клиент. -
Настройки сети контейнеров: Контейнеры Docker по умолчанию могут иметь различные сетевые настройки. Если клиентский контейнер пытается подключиться к серверу, возможно, он не может достучаться до открытых портов из-за их конфигурации.
-
Проблемы с брандмауэром: Несмотря на наличие открытых портов, проверьте настройки на хостовой машине. Убедитесь, что нет дополнительных правил брандмауэра, которые могут блокировать подключение.
-
Неправильный диапазон портов: Сервер FTP настроен на использование диапазона портов 21100-21110, и эти порты должны быть правильно проброшены через Docker на хост-машину.
Решение
Чтобы решить вашу проблему, выполните следующие действия:
-
Проверьте значение PASV_ADDRESS:
- Убедитесь, что
PASV_ADDRESS
содержит правильный публичный IP-адрес вашего сервера, с которого будет производиться подключение к FTP.
- Убедитесь, что
-
Проверьте сетевые настройки:
- Убедитесь, что контейнеры находятся в одной сети или что настройки сети позволяют им взаимодействовать друг с другом.
- Возможно, вам следует использовать влияние Docker сети, чтобы еще больше упростить взаимосвязь контейнеров. Например, создание сети:
docker network create ftp-network
И запуск контейнеров в этой сети:
docker run --network ftp-network ...
-
Проверьте брандмауэр:
- Убедитесь, что все необходимые порты открыты в брандмауэре:
sudo ufw allow 20/tcp sudo ufw allow 21/tcp sudo ufw allow 21100:21110/tcp
- Убедитесь, что все необходимые порты открыты в брандмауэре:
-
Проверьте проброс портов Docker:
- Убедитесь, что вы правильно пробросили порты на хост для диапазона 21100-21110. Вы можете использовать следующие команды для проверки:
docker ps
Убедитесь, что контейнер FTP отображает правильные порты.
- Убедитесь, что вы правильно пробросили порты на хост для диапазона 21100-21110. Вы можете использовать следующие команды для проверки:
-
Логи и отладка:
- Проверьте логи вашего FTP-контейнера. Это можно сделать с помощью:
docker logs ftp-server
Обратите внимание на ошибки, которые могут помочь понять, почему соединение не устанавливается.
- Проверьте логи вашего FTP-контейнера. Это можно сделать с помощью:
После выполнения всех вышеперечисленных действий ваше подключение к FTP-серверу в пассивном режиме должно успешно функционировать. Не забудьте протестировать соединение через FTP-клиент в контейнере node2, чтобы гарантировать, что все настройки были применены правильно.
Если какие-либо из шагов вызывают затруднения или возникают другие проблемы, пожалуйста, предоставьте дополнительные данные для более детального анализа.