Passivmodus FTP funktioniert über WAN, aber nicht über LAN

801
Kayson

Ich verwende pure-ftpd 1.0.46 auf Ubuntu 18.04 als Server, wobei TLS und Zertifikate von Let's Encrypt signiert sind. Ich habe keine Probleme beim Verbinden und Übertragen über WAN. Ich verwende den passiven Modus, die Ports werden ordnungsgemäß weitergeleitet und ich habe pure-ftpd so konfiguriert, dass es mit seiner WAN-IP antwortet.

Ich kann jedoch keine Verbindung über LAN herstellen, da es über TLS-Verbindungsbeendigung klagt. Ich habe mehrere Clients ausprobiert, und alle haben einen Timeout-Fehler. Ich vermute, ein Teil des Problems könnte mein DNS-Setup sein. Ich habe einen Domänennamen, der auf mein WAN verweist, und dies ist normalerweise das, was ich für die Verbindung zum Server verwende. Aber ich habe meinen lokalen DNS-Server mit der LAN-IP für die FTP-Maschine antworten. Wenn ich also zu Hause bin, stellt mein Laptop die FTP-Verbindung zu 192.168.1.2 her, aber die PASV-Antwort ist meine WAN-IP 74.xxx. Theoretisch sollte mein Router NAT-Loopback unterstützen, der den Datenverkehr aus dem LAN sendet und für diesen bestimmt ist die WAN-IP zurück an die lokale IP-Adresse, an die sie weitergeleitet wurde. Dies scheint für http gut zu funktionieren, und ich nahm an, da der Client die Passivmodus-TCP-Verbindung initiiert, sollte es auch dafür funktionieren. Aber vielleicht dort ' s etwas Routing Detail fehlt mir. Könnte das das Problem sein?

Kundenprotokoll:

Status: Connecting to 192.168.1.2:21... Status: Connection established, waiting for welcome message... Trace: CFtpControlSocket::OnReceive() Response: 220---------- Welcome to Pure-FTPd [privsep] [TLS] ---------- Response: 220-You are user number 9 of 50 allowed. Response: 220-Local time is now 16:01. Server port: 21. Response: 220-This is a private system - No anonymous login Response: 220-IPv6 connections are also welcome on this server. Response: 220 You will be disconnected after 15 minutes of inactivity. Trace: CFtpLogonOpData::ParseResponse() in state 1 Trace: CControlSocket::SendNextCommand() Trace: CFtpLogonOpData::Send() in state 2 Command: AUTH TLS Trace: CFtpControlSocket::OnReceive() Response: 234 AUTH TLS OK. Trace: CFtpLogonOpData::ParseResponse() in state 2 Status: Initializing TLS... Trace: CTlsSocketImpl::Handshake() Trace: CTlsSocketImpl::ContinueHandshake() Trace: TLS handshake: About to send CLIENT HELLO Trace: TLS handshake: Sent CLIENT HELLO Trace: CTlsSocketImpl::OnSend() Trace: CTlsSocketImpl::OnRead() Trace: CTlsSocketImpl::ContinueHandshake() Trace: CTlsSocketImpl::OnRead() Trace: CTlsSocketImpl::ContinueHandshake() Trace: TLS handshake: Received SERVER HELLO Trace: TLS handshake: Processed SERVER HELLO Trace: CTlsSocketImpl::OnRead() Trace: CTlsSocketImpl::ContinueHandshake() Trace: TLS handshake: Received CERTIFICATE Trace: TLS handshake: Processed CERTIFICATE Trace: TLS handshake: Received SERVER KEY EXCHANGE Trace: TLS handshake: Processed SERVER KEY EXCHANGE Trace: TLS handshake: Received SERVER HELLO DONE Trace: TLS handshake: Processed SERVER HELLO DONE Trace: TLS handshake: About to send CLIENT KEY EXCHANGE Trace: TLS handshake: Sent CLIENT KEY EXCHANGE Trace: TLS handshake: About to send FINISHED Trace: TLS handshake: Sent FINISHED Trace: CTlsSocketImpl::OnRead() Trace: CTlsSocketImpl::ContinueHandshake() Trace: TLS handshake: Received NEW SESSION TICKET Trace: TLS handshake: Processed NEW SESSION TICKET Trace: TLS handshake: Received FINISHED Trace: TLS handshake: Processed FINISHED Trace: TLS Handshake successful Trace: Protocol: TLS1.2, Key exchange: ECDHE-RSA, Cipher: AES-256-GCM, MAC: AEAD Status: Verifying certificate... Status: TLS connection established. Trace: CControlSocket::SendNextCommand() Trace: CFtpLogonOpData::Send() in state 5 Command: USER ***** Trace: CTlsSocketImpl::OnRead() Trace: CFtpControlSocket::OnReceive() Response: 331 User ******* OK. Password required Trace: CFtpLogonOpData::ParseResponse() in state 5 Trace: CControlSocket::SendNextCommand() Trace: CFtpLogonOpData::Send() in state 5 Command: PASS ********** Trace: CTlsSocketImpl::OnRead() Trace: CFtpControlSocket::OnReceive() Response: 230 OK. Current directory is / Trace: CFtpLogonOpData::ParseResponse() in state 5 Trace: CControlSocket::SendNextCommand() Trace: CFtpLogonOpData::Send() in state 9 Command: OPTS UTF8 ON Trace: CTlsSocketImpl::OnRead() Trace: CFtpControlSocket::OnReceive() Response: 200 OK, UTF-8 enabled Trace: CFtpLogonOpData::ParseResponse() in state 9 Trace: CControlSocket::SendNextCommand() Trace: CFtpLogonOpData::Send() in state 10 Command: PBSZ 0 Trace: CTlsSocketImpl::OnRead() Trace: CFtpControlSocket::OnReceive() Response: 200 PBSZ=0 Trace: CFtpLogonOpData::ParseResponse() in state 10 Trace: CControlSocket::SendNextCommand() Trace: CFtpLogonOpData::Send() in state 11 Command: PROT P Trace: CTlsSocketImpl::OnRead() Trace: CFtpControlSocket::OnReceive() Response: 200 Data protection level set to "private" Trace: CFtpLogonOpData::ParseResponse() in state 11 Status: Logged in Trace: Measured latency of 3 ms Trace: CFtpControlSocket::ResetOperation(0) Trace: CControlSocket::ResetOperation(0) Trace: CFtpLogonOpData::Reset(0) in state 14 Trace: CFileZillaEnginePrivate::ResetOperation(0) Status: Retrieving directory listing... Trace: CControlSocket::SendNextCommand() Trace: CFtpListOpData::Send() in state 0 Trace: CFtpChangeDirOpData::Send() in state 0 Trace: CFtpChangeDirOpData::Send() in state 1 Command: PWD Trace: CTlsSocketImpl::OnRead() Trace: CFtpControlSocket::OnReceive() Response: 257 "/" is your current location Trace: CFtpChangeDirOpData::ParseResponse() in state 1 Trace: CFtpControlSocket::ResetOperation(0) Trace: CControlSocket::ResetOperation(0) Trace: CFtpChangeDirOpData::Reset(0) in state 1 Trace: CFtpListOpData::SubcommandResult(0) in state 1 Trace: CControlSocket::SendNextCommand() Trace: CFtpListOpData::Send() in state 2 Trace: CFtpRawTransferOpData::Send() in state 1 Command: TYPE I Trace: CTlsSocketImpl::OnRead() Trace: CFtpControlSocket::OnReceive() Response: 200 TYPE is now 8-bit binary Trace: CFtpRawTransferOpData::ParseResponse() in state 1 Trace: CControlSocket::SendNextCommand() Trace: CFtpRawTransferOpData::Send() in state 2 Command: PASV Trace: CTlsSocketImpl::OnRead() Trace: CFtpControlSocket::OnReceive() Response: 227 Entering Passive Mode (75,85,*,*,46,161) Trace: CFtpRawTransferOpData::ParseResponse() in state 2 Trace: CControlSocket::SendNextCommand() Trace: CFtpRawTransferOpData::Send() in state 4 Trace: Destination IP of data connection does not match peer IP of control connection. Not binding source address of data connection. Command: MLSD Trace: CTransferSocket::OnConnect Trace: CTlsSocketImpl::Handshake() Trace: Trying to resume existing TLS session. Trace: CTlsSocketImpl::ContinueHandshake() Trace: TLS handshake: About to send CLIENT HELLO Trace: TLS handshake: Sent CLIENT HELLO Trace: CTlsSocketImpl::OnSend() Trace: CTlsSocketImpl::OnSend() Trace: CTlsSocketImpl::OnRead() Trace: CTlsSocketImpl::ContinueHandshake() Trace: CTlsSocketImpl::OnRead() Trace: CTlsSocketImpl::ContinueHandshake() Trace: CTlsSocketImpl::Failure(-110) Error: GnuTLS error -110: The TLS connection was non-properly terminated. Status: Server did not properly shut down TLS connection Trace: CTlsSocketImpl::OnSocketEvent(): close event received Trace: CTransferSocket::OnClose(106) Error: Transfer connection interrupted: ECONNABORTED - Connection aborted Trace: CTransferSocket::TransferEnd(3) Trace: CFtpControlSocket::TransferEnd() Trace: CFtpControlSocket::ResetOperation(10) Trace: CControlSocket::ResetOperation(10) Trace: CFtpRawTransferOpData::Reset(10) in state 6 Trace: CFtpControlSocket::ResetOperation(10) Trace: CControlSocket::ResetOperation(10) Trace: CFtpListOpData::Reset(10) in state 3 Error: Directory listing aborted by user Trace: CFileZillaEnginePrivate::ResetOperation(10) 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) 
-2

1 Antwort auf die Frage

1
Appleoddity
Destination IP of data connection does not match peer IP of control connection. Not binding source address of data connection. 

Das ist ziemlich definitiv. Der Client akzeptiert keine Kontrollverbindung, die über eine lokale IP-Adresse aufgebaut ist, und eine Datenverbindung über eine andere IP-Adresse.

Die beste Lösung sollte sein, nur das lokale DNS zu ändern, um die öffentliche IP-Adresse bereitzustellen. Sollte nicht schaden, wenn es funktioniert.

Zuerst dachte ich, es wäre vielleicht der Kunde, der diese Art von Setup ablehnte, aber ich habe mehrere Kunden ausprobiert und keine davon. Sie sind einfach aus dem Weg ... Ich versuche das DNS-Setup generell zu vermeiden, da mein Router nicht über genügend CPU-Leistung verfügt, um mein Gigabit-Ethernet zu sättigen, während er zurückgeschleift wird. Die meisten Dienste werden also über LAN geroutet und ich kann die volle Geschwindigkeit erreichen. Es macht mir nichts aus, wenn ftp loops zurück läuft und langsamer ist, da ich hauptsächlich smb für Dateiübertragungen verwende, aber ich möchte, dass es zumindest funktioniert ... Kayson vor 5 Jahren 0
@Kayson im Protokoll des von Ihnen aufgelisteten Clients steht oben, und der Client lehnt dieses Setup ab. Es ist wahrscheinlich eine Sicherheitsfunktion. Möglicherweise kann es an Optionen im Client geändert werden. Es wird jedoch keine Verbindung hergestellt, wenn die beiden IPs unterschiedlich sind. Appleoddity vor 5 Jahren 0
Ja, das macht Sinn. Vielen Dank. Ich denke, ich muss einen anderen Server einrichten Kayson vor 5 Jahren 0
Dies ist eine schreckliche Lösung, aber ich habe meinen FTP-Server geändert, um auf passive Anforderungen mit der lokalen IP-Adresse zu antworten. Beim Zugriff über WAN erkennt der Filezilla-Client die interne IP und ignoriert sie. Stattdessen wird die IP des Steuerungshosts verwendet. Bei einem Zugriff über LAN funktioniert alles einwandfrei. Kayson vor 5 Jahren 0