У нашего клиента есть 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