FTP-сервер не может выполнить рукопожатие SSL (VSFTPD)

1253
mr_johnson22

Я пытаюсь настроить доступный через Интернет FTP-сервер с шифрованием, используя VSFTPD в качестве серверной программы на Fedora 25. Несмотря на то, что все выглядит правильно, я никогда не могу подключиться к серверу извне моей локальной сети, когда включено шифрование. Однако подключение возможно, если я отключаю шифрование или подключаюсь из локальной сети.

У меня проблема в том, что сервер VSFTPD не может завершить рукопожатие SSL после получения команды AUTH от клиента. Используя Wireshark, я вижу, что сервер пытается отправить то, что выглядит как ответ на рукопожатие, несколько раз.

Если это помогает, вот отчет Wireshark о клиенте, пытающемся подключиться к серверу:

From Info ------ ---- Client 64423 → 21 [ACK] Seq=1 Ack=1 Win=13952 Len=0 TSval=996262 TSecr=3062736173 Server Response: 220 (vsFTPd 3.0.3) Client 64423 → 21 [ACK] Seq=1 Ack=21 Win=13952 Len=0 TSval=996281 TSecr=3062736371 Client Request: AUTH TLS Server 21 → 64423 [ACK] Seq=21 Ack=11 Win=29056 Len=0 TSval=3062736436 TSecr=996282 Server Response: 234 Proceed with negotiation. Server [TCP Retransmission] 21 → 64423 [PSH, ACK] Seq=21 Ack=11 Win=29056 Len=31 TSval=3062736822 TSecr=996282 Server [TCP Retransmission] 21 → 64423 [PSH, ACK] Seq=21 Ack=11 Win=29056 Len=31 TSval=3062737214 TSecr=996282 Server [TCP Retransmission] 21 → 64423 [PSH, ACK] Seq=21 Ack=11 Win=29056 Len=31 TSval=3062737214 TSecr=996282 Server [TCP Retransmission] 21 → 64423 [PSH, ACK] Seq=21 Ack=11 Win=29056 Len=31 TSval=3062737214 TSecr=996282 ... 

Другая информация: у меня есть VSFTPD, настроенный для использования TLSv1 или выше, для работы в пассивном режиме и с явным FTPS, и с самозаверяющим сертификатом RSA. Я не думаю, что есть проблема с моим сертификатом, так как я могу использовать тот же сертификат для размещения сервера https с httpd, к которому я могу получить доступ из-за пределов локальной сети. Так что проблема должна быть как-то связана с ВСФТПД.

Я также настроил свой маршрутизатор и брандмауэр на переадресацию и прием 21 порта для соединений через порт управления ftp. Я также настроил VSFTPD на использование порта 2048 в качестве единственного порта данных PASV, но по какой-то причине мне не нужно было переадресовывать этот порт на моем маршрутизаторе, чтобы разрешить работу незашифрованных FTP-подключений ... и, кроме того, моя ошибка во всяком случае, происходит до того, как порт данных подключается.

У кого-нибудь есть идеи как это исправить? Есть ли что-то очевидное, что я здесь скучаю?

1
Предложите включить журнал отладки на VSFTPD и найдите там причину. Для справки: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/3/html/Reference_Guide/s1-ftp-vsftpd-conf.html. Oleg 6 лет назад 1
Благодарю. Когда я включаю ведение журнала и отладку SSL, мой файл vsftpd.log добавляет эти строки при каждой попытке соединения и терпит неудачу: `CONNECT: Client" :: ffff:"ОТЛАДКА: Клиент" :: ffff:"," Ошибка SSL_accept: ошибка: 00000000: lib (0): func (0): причина (0) "` mr_johnson22 6 лет назад 0

1 ответ на вопрос

1
Steffen Ullrich
Server Response: 234 Proceed with negotiation. Server [TCP Retransmission] 21 → 64423 [PSH, ACK] Seq=21 Ack=11 Win=29056 Len=31 TSval=3062736822 TSecr=996282 

То, что вы видите, не является рукопожатием TLS. Рукопожатие TLS будет запущено клиентом, что здесь не так. Вместо этого вы видите повторную передачу последнего ответа сервера, то 234 Proceed with negotiation.\r\nесть ровно 31 байт.
Это означает, что сервер не получает ACK от клиента на этот ответ и, следовательно, он ретранслирует его, то есть обычное поведение соединений TCP при пропущенном ACK.

Вопрос в том, почему сервер не получает ACK. Из вашего вопроса не ясно, был ли захват пакета выполнен на стороне клиента или сервера, но я предполагаю, что это было сделано на стороне сервера. В этом случае я полагаю, что между клиентом и сервером существует некий брандмауэр, который вмешивается в соединение:
поскольку FTP - это протокол с динамическими портами для передачи данных, и эти динамические порты обмениваются внутри управляющего соединения, брандмауэр должен иметь чистый текст доступ к управляющему соединению, чтобы узнать, какие динамические порты используются, и открыть эти порты. Если управляющее соединение зашифровано (AUTH TLS), это больше невозможно, поэтому некоторые брандмауэры пытаются явно или непреднамеренно заблокировать использование TLS. И то, что вы видите, может быть результатом этого.

Да, журнал Wireshark был сделан на стороне сервера. Кроме того, я только что попытался установить FTP-соединение после кратковременного отключения брандмауэров, и тот же сбой все еще происходил, так что это, вероятно, не проблема брандмауэра в конце концов ... но, возможно, в LTE-интернете моего телефона есть брандмауэр, который я использовал в качестве моего FTP-клиента. mr_johnson22 6 лет назад 0
@ mr_johnson22: * ... LTE интернет моего телефона ... * - не исключено. Мобильные соединения часто используют частный IPv4 в сочетании с NAT, и в этом случае необходимо также выполнить специальную обработку FTP. Просто сравните IP-адрес клиента, который вы видите на сервере, с IP-адресом вашего телефона, чтобы узнать, так ли это. Смотрите также https://en.wikipedia.org/wiki/Carrier-grade_NAT Steffen Ullrich 6 лет назад 0
Это объясняет вещи. (Мой FTP-сервер видит тот же IP-адрес, который есть у моего телефона, но я мог что-то упустить.) Я также провел некоторое исследование, и похоже, что некоторые клиенты / брандмауэры блокируют FTPS с помощью самозаверяющих сертификатов. Я просто буду использовать SFTP вместо этого. mr_johnson22 6 лет назад 0

Похожие вопросы