Назад | Перейти на главную страницу

FTP не удалось получить список каталогов

У нашего клиента есть FTP-сервер FileZilla, работающий в Windows, и я использую FileZilla Client для проверки соединения. Подключение работает из моего офиса и со всех наших серверов Azure, кроме одного.

Я установил параметр отладки в FileZilla Client, и ниже указаны как успешные, так и неудачные соединения. Почему на одном сервере устанавливается соединение, а на другом - нет?

Оба наших сервера, подключающиеся к FTP клиентов, находятся в Azure, оба являются виртуальными машинами, работающими под одной и той же ОС.

Успешно

Status: Disconnected from server
Trace:  CRealControlSocket::DoClose(66)
Trace:  CControlSocket::DoClose(66)
Trace:  CFtpControlSocket::ResetOperation(66)
Trace:  CControlSocket::ResetOperation(66)
Trace:  CFileZillaEnginePrivate::ResetOperation(66)
Trace:  CRealControlSocket::DoClose(66)
Trace:  CControlSocket::DoClose(66)
Trace:  CControlSocket::DoClose(66)
Trace:  CFileZillaEnginePrivate::ResetOperation(0)
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpLogonOpData::Send() in state 0
Status: Resolving address of *SERVER DNS*
Status: Connecting to *SERVER IP*:2121...
Status: Connection established, waiting for welcome message...
Trace:  CFtpControlSocket::OnReceive()
Response:   220 PPW FTP Server
Trace:  CFtpLogonOpData::ParseResponse() in state 1
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpLogonOpData::Send() in state 2
Command:    AUTH TLS
Trace:  CFtpControlSocket::OnReceive()
Response:   502 Explicit TLS authentication not allowed
Trace:  CFtpLogonOpData::ParseResponse() in state 2
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpLogonOpData::Send() in state 3
Command:    AUTH SSL
Trace:  CFtpControlSocket::OnReceive()
Response:   502 Explicit TLS authentication not allowed
Trace:  CFtpLogonOpData::ParseResponse() in state 3
Status: Insecure server, it does not support FTP over TLS.
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpLogonOpData::Send() in state 5
Command:    USER printiq
Trace:  CFtpControlSocket::OnReceive()
Response:   331 Password required for printiq
Trace:  CFtpLogonOpData::ParseResponse() in state 5
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpLogonOpData::Send() in state 5
Command:    PASS ********
Trace:  CFtpControlSocket::OnReceive()
Response:   230 Logged on
Trace:  CFtpLogonOpData::ParseResponse() in state 5
Status: Logged in
Trace:  Measured latency of 46 ms
Trace:  CFtpControlSocket::ResetOperation(0)
Trace:  CControlSocket::ResetOperation(0)
Trace:  CFileZillaEnginePrivate::ResetOperation(0)
Status: Retrieving directory listing...
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpListOpData::ListSend() in state 0
Trace:  CFtpChangeDirOpData::Send() in state 0
Trace:  CFtpChangeDirOpData::Send() in state 1
Command:    PWD
Trace:  CFtpControlSocket::OnReceive()
Response:   257 "/" is current directory.
Trace:  CFtpChangeDirOpData::ParseResponse() in state 1
Trace:  CFtpControlSocket::ResetOperation(0)
Trace:  CControlSocket::ResetOperation(0)
Trace:  CControlSocket::ParseSubcommandResult(0)
Trace:  CFtpListOpData::SubcommandResult() in state 1
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpListOpData::ListSend() in state 2
Trace:  CFtpControlSocket::ResetOperation(0)
Trace:  CControlSocket::ResetOperation(0)
Status: Directory listing of "/" successful
Trace:  CFileZillaEnginePrivate::ResetOperation(0)

Не смогли

Status: Disconnected from server
Trace:  CRealControlSocket::DoClose(66)
Trace:  CControlSocket::DoClose(66)
Trace:  CFtpControlSocket::ResetOperation(66)
Trace:  CControlSocket::ResetOperation(66)
Trace:  CFileZillaEnginePrivate::ResetOperation(66)
Trace:  CRealControlSocket::DoClose(66)
Trace:  CControlSocket::DoClose(66)
Trace:  CControlSocket::DoClose(66)
Trace:  CFileZillaEnginePrivate::ResetOperation(0)
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpLogonOpData::Send() in state 0
Status: Resolving address of *SERVER DNS*
Status: Connecting to **SERVER IP**:2121...
Status: Connection established, waiting for welcome message...
Trace:  CFtpControlSocket::OnReceive()
Response:   220 PPW FTP Server
Trace:  CFtpLogonOpData::ParseResponse() in state 1
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpLogonOpData::Send() in state 2
Command:    AUTH TLS
Trace:  CFtpControlSocket::OnReceive()
Response:   502 Explicit TLS authentication not allowed
Trace:  CFtpLogonOpData::ParseResponse() in state 2
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpLogonOpData::Send() in state 3
Command:    AUTH SSL
Trace:  CFtpControlSocket::OnReceive()
Response:   502 Explicit TLS authentication not allowed
Trace:  CFtpLogonOpData::ParseResponse() in state 3
Status: Insecure server, it does not support FTP over TLS.
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpLogonOpData::Send() in state 5
Command:    USER printiq
Trace:  CFtpControlSocket::OnReceive()
Response:   331 Password required for printiq
Trace:  CFtpLogonOpData::ParseResponse() in state 5
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpLogonOpData::Send() in state 5
Command:    PASS ********
Trace:  CFtpControlSocket::OnReceive()
Response:   230 Logged on
Trace:  CFtpLogonOpData::ParseResponse() in state 5
Status: Logged in
Trace:  Measured latency of 38 ms
Trace:  CFtpControlSocket::ResetOperation(0)
Trace:  CControlSocket::ResetOperation(0)
Trace:  CFileZillaEnginePrivate::ResetOperation(0)
Status: Retrieving directory listing...
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpListOpData::ListSend() in state 0
Trace:  CFtpChangeDirOpData::Send() in state 0
Trace:  CFtpChangeDirOpData::Send() in state 1
Command:    PWD
Trace:  CFtpControlSocket::OnReceive()
Response:   257 "/" is current directory.
Trace:  CFtpChangeDirOpData::ParseResponse() in state 1
Trace:  CFtpControlSocket::ResetOperation(0)
Trace:  CControlSocket::ResetOperation(0)
Trace:  CControlSocket::ParseSubcommandResult(0)
Trace:  CFtpListOpData::SubcommandResult() in state 1
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpListOpData::ListSend() in state 2
Trace:  CFtpRawTransferOpData::Send() in state 1
Command:    TYPE I
Trace:  CFtpControlSocket::OnReceive()
Response:   200 Type set to I
Trace:  CFtpRawTransferOpData::ParseResponse() in state 1
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpRawTransferOpData::Send() in state 2
Command:    PASV
Trace:  CFtpControlSocket::OnReceive()
Response:   227 Entering Passive Mode (*SERVER IP*,234,225)
Trace:  CFtpRawTransferOpData::ParseResponse() in state 2
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpRawTransferOpData::Send() in state 4
Trace:  Binding data connection source IP to control connection source IP 10.0.0.4
Command:    MLSD
Trace:  CFtpControlSocket::OnReceive()
Response:   425 Can't open data connection for transfer of "/"
Trace:  CFtpRawTransferOpData::ParseResponse() in state 4
Trace:  CFtpControlSocket::ResetOperation(2)
Trace:  CControlSocket::ResetOperation(2)
Trace:  CControlSocket::ParseSubcommandResult(2)
Trace:  CFtpListOpData::SubcommandResult() in state 3
Trace:  CFtpControlSocket::ResetOperation(2)
Trace:  CControlSocket::ResetOperation(2)
Error:  Failed to retrieve directory listing
Trace:  CFileZillaEnginePrivate::ResetOperation(2)

Обычно это проблема активного / пассивного режима FTP.

Большинство сценариев FTP сервер / клиент работают в пассивном режиме, и вы можете увидеть в журнале, что ваш клиент переключился в режим PASV.

Чтобы дать немного предыстории, при подключении к FTP-серверу устанавливается управляющее соединение и соединение для передачи данных. Команды FTP отправляются и ответы принимаются через управляющее соединение. Фактические данные, такие как список файлов или список каталогов, отправляются через соединение для передачи данных.

В активном режиме FTP ваш клиент инициирует управляющее соединение с сервером, а сервер инициирует соединение для передачи данных с клиентом. В современных ИТ-сетях это работает не очень хорошо, потому что большинство клиентов находятся за сетью NAT, и для этого потребуется переадресация портов.

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

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

Следовательно, брандмауэр между клиентом и сервером блокирует соединение, которое клиент пытается инициировать с сервером. Поскольку другие клиенты могут подключиться нормально, это, вероятно, не на стороне сервера, но вполне может быть, если он блокирует определенные IP-адреса или порты, которые связаны с подключением от клиента.

Режим PASV - это типичный и наиболее надежный режим, если и сервер, и клиент не имеют общедоступного IP-адреса или если на стороне клиента не были сделаны какие-либо другие модификации сети для поддержки случайных подключений к данным FTP.

Причина в том, что ваш успешный клиент не использует пассивную команду PASV

Command:    PASV
Trace:  CFtpControlSocket::OnReceive()
Response:   227 Entering Passive Mode (*SERVER IP*,234,225)

сервер сказал вам, что он открыл порт 60385 на IP-адрес СЕРВЕРА, (брандмауэр открыт?)

Trace:  CFtpRawTransferOpData::ParseResponse() in state 2
Trace:  CControlSocket::SendNextCommand()
Trace:  CFtpRawTransferOpData::Send() in state 4
Trace:  Binding data connection source IP to control connection source IP 10.0.0.4

ваш клиент не может подключиться к вашему серверу через порт 60385 с источником 10.0.0.4