FTP IPv4 zu IPv6 Relais

Crys

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.638
Hallo miteinander,

ich muss auf einen Server per ftp zugreifen, der nur per IPv6 erreichbar ist, von einem anderen reinen IPv4 Server.

Einen öffentlichen VPS habe ich, der einen statische IPv6 und IPv4 hat. Hier sind auch mehrere Relais (http/s, ssh) eingerichtet, die einwandfrei funktionieren.
PowerShell:
socat TCP4-LISTEN:64000,fork,reuseaddr,su=nobody TCP6:[IPv6]:80 # http
socat TCP4-LISTEN:64001,fork,reuseaddr,su=nobody TCP6:[IPv6]:22 # ssh

PowerShell:
socat TCP4-LISTEN:64002,fork,reuseaddr,su=nobody TCP6:[IPv6]:21 # ftp
Wenn ich dasselbe aber für ftp versuche, erhalte ich im Client immer den Fehler:
Illegal PORT command.

Der ftp Server ist per IPv6 auf Port 21 einwandfrei erreichbar.

Was könnte hier falsch laufen?

Vielen Dank!
 
Zuletzt bearbeitet: (Ports)
Es gibt nur 65535 Ports.

Port 98000 und 98001 sind demnach nicht zulässig...

Außerdem ist Port 21 FTP und Port 22 SSH.
 
  • Gefällt mir
Reaktionen: Raijin, qiller und Mojo1987
Port(s) für den Data Channel vergessen? FTP nutzt normalerweise ja Port 21 für den Steuerkanal, und Port 20 für den Datenkanal, wenn es sich um eine aktive Verbindung handelt. Im passiven Modus würfelt der FTP-Server den Datenkanal aus (Port-Range kann man aber einschränken).
 
  • Gefällt mir
Reaktionen: Raijin
@Sephe da hast du recht. IPv6 ist auch keine valide IP Adresse ;)
Die Ports habe ich nur schnell getippt. Zugriff versuche ich auf Post 21 von 64002
Ergänzung ()

qiller schrieb:
Port(s) für den Data Channel vergessen?
Seit 10 Jahren habe ich kein aktive Mode mehr verwendet. Soll man auch nicht, habe ich mal gelesen ...
Aber nein, nichts vergessen, es ist und war immer nur Port 21 offen und geht per IPv6 seit Jahren zuverlässig.
Im Clienten ist aber auch der passive Modus aktiviert. Wenn man auf "auto" schaltet, erkennt er automatisch den passiv Mode.
Ergänzung ()

Ich habe auch andere Port Nummern getestet, wie:
Code:
socat TCP4-LISTEN:12,fork,reuseaddr,su=nobody TCP6:[IPv6]:12
Natürlich beim Host freigeschaltet und per IPv6 erfolgreich getestet. Aber per Relais (socat) immer dieselbe Fehlermeldung
 
Zuletzt bearbeitet:
Kenn mich mit diesem socat Relay nicht aus, aber ich könnte fast wetten, dass du mit dem Active Mode mehr Erfolg hast, weil du da einfach 2 feste Ports hast. Da alle beteiligten Server mit festen, nicht genateten IP-Adressen arbeiten, würde sich das sogar regelrecht anbieten. FTP oldschool halt^^.

Edit: Ums nochmal bildlicher zu machen. Du brauchst bei FTP 2 Ports, egal ob active oder passive. Die Frage bei active oder passive ist, wie der Port für den Datenkanal auf Seiten des FTP-Servers bestimmt wird. Du hast zwar mit deiner Konfig den Steuerkanal mit Port 21 über dein Relay verbunden, aber den Port für den Datenkanal nicht. Und da der im passiven Modus ausgewürfelt wird (bzw man könnte ihn auch per Range vorgeben) und eh alle beteiligten Hosts öffentliche, nicht genatete IP-Adressen (ich geh bei 'Servern' zumindest davon aus) haben, würde ich den Active Mode nehmen und Port 20 noch durchleiten.
 
Zuletzt bearbeitet:
Code:
socat TCP4-LISTEN:20,fork,reuseaddr,su=nobody TCP6:[IPv6]:20
socat TCP4-LISTEN:21,fork,reuseaddr,su=nobody TCP6:[IPv6]:21
Testweise (was produktiv natürlich nicht geht) habe ich mal von Port 20 bis 21 einfach durchgeroutet. Aber immer noch exakt der selbe Fehler.
Per direktem IPv6 geht passive und jetzt auch erzwungener aktiver Modus.

Andere Clienten geben aber auch neue Fehlermeldungen aus, bei erzwungen active Mode über den VPS:
Code:
Verbinde mit IPv4...
Status:    Verbindung hergestellt, warte auf Willkommensnachricht...
Status:    Angemeldet
Status:    Empfange Verzeichnisinhalt...
Status:    Vom Server gesendete Adresse für den Passiv-Modus ist nicht routingfähig. Benutze stattdessen die Serveradresse.
Befehl:    LIST
Fehler:    Die Datenverbindung konnte nicht hergestellt werden: ECONNREFUSED - Verbindung durch Server verweigert
 
Crys schrieb:
Testweise (was produktiv natürlich nicht geht) habe ich mal von Port 20 bis 21 einfach durchgeroutet. Aber immer noch exakt der selbe Fehler.
Hm, evt. musst du die FTP-Server IP mit der des Gateways masquerieren. Kenn das nur vom proftpd.
Code:
MasqueradeAddress <Gateway-IPv4>
... steht dann in der Konfig. Eigentlich ist das Setting für den Passive-Modus und genateten Anschlüssen. Vlt hat dein FTP-Server ja eine ähnliche Einstellung.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Crys
Ich nutze vsftpd, das ist ja der kleine einfache Bruder 🙃

Bei vsftpd heißt es vsftpd pasv_address. Wenn ich hier die IPv6 Adresse hinterlege, dann bringt er:
Code:
Status:    Verbindung zum Server getrennt
Status:    Verbinde mit IPv4:21...
Status:    Verbindung hergestellt, warte auf Willkommensnachricht...
Status:    Angemeldet
Status:    Empfange Verzeichnisinhalt...
Befehl:    PWD
Antwort:    257 "/" is the current directory
Befehl:    TYPE I
Antwort:    200 Switching to Binary mode.
Befehl:    PASV
Antwort:    500 OOPS: invalid pasv_address
Befehl:    PORT #lokale_IPv4#,241,160
Fehler:    Verbindung vom Server geschlossen
Ich habe die IPv6 des Relais und des Hosts getestet. Dann kommt die obige Meldung.

Wenn ich irgendeine IPv4 eingebe, z.B. die des Relais oder die lokale Host IPv4 (eine externe Host IPv4 gibt es ja nicht), dann kommt die Fehlermeldung, wie im alten Post.

Was sollte bei der Adresse hinterlegt werden?
 
Zuletzt bearbeitet:
Crys schrieb:
Testweise (was produktiv natürlich nicht geht) habe ich mal von Port 20 bis 21 einfach durchgeroutet. Aber immer noch exakt der selbe Fehler.
Bei Active FTP geht der Data Channel auch in die andere Richtung - vom Server zum Client. Entsprechend musst du für Port 20 die Regel "in die andere Richtung" anlegen.
 
  • Gefällt mir
Reaktionen: qiller und Crys
riversource hat da nochn Punkt. Ich würd einfach noch ne 3. Regel für die andere Richtung von Port 20 hinzufügen.
Code:
socat TCP6-LISTEN:20,fork,reuseaddr,su=nobody TCP4:IPv4:20
...so in etwa (ka, wie die Syntax korrekt ist).
 
Wie kann man beim active Mode die Ports statisch definieren?
Ich finde dazu leider überhaupt nichts. Wenn das nicht geht, dann bringt mir das leider alles nichts, da der Relais Server selbst einen ftp-Server hat (der gerade deaktiviert ist) und weitere ftp-Server auf anderen Ports eingerichtet werden müssen.
Aber später probiere ich das mal aus ...

Ich denke aber, dass ein passiv Mode weiterhin die beste und einfachste Lösung ist
 
Versuch macht kluch. Bin leider auch weiter überfragt, eine "Kombo" aus obigen Hinweise sollte eigentlich funktionieren, egal ob passive o. active.

Ich selber hoste einen ftp-server hinter einem Doppel-NAT IPv4-only-Anschluss. Hier funktioniert per se nur der Passive-Mode und da hab ich in proftpd halt folgende Settings für drin:

Code:
PassivePorts       60000 60100
MasqueradeAddress     <externe, öffentliche IPv4 bzw. FQDN vom FTP-Server Anschluss>

Dann im Router+FW die TCP-Portweiterleitungen für Port 21 und die TCP-Portrange 60000:60100 (das fällt bei dir natürlich weg - dafür aber evt. Firewall-Freigaben notwendig, falls du eine aktiv hast).

Und irgendwie ist so ein 'Selbstbau-FTP-Relay' ja fast so ähnlich. Man muss dem Server im Passive-Mode per 'MasqueradeAddress' nur verklickern, dass er dem Client eine andere IP-Adresse für den Datenkanalaufbau mitteilen soll, weil sonst schickt der Server halt die IP-Adresse vom gebindeten Netzwerkadapter mit, wo der Client aber keinen Datenkanal hin aufbauen kann. Bei mir wärs die interne IPv4, die er nicht erreicht, bei dir wärs die IPv6-Adresse.
 
  • Gefällt mir
Reaktionen: Crys
Wäre es vielleicht praktikabel hier einen SSH Tunnel zum VPS aufzubauen und die FTP Ports weiterzuleiten?

Oder den Ziel-Server als SFTP Server erreichbar machen, dann hast du nur Port 22 bzw. nur einen frei definierten Port.
 
  • Gefällt mir
Reaktionen: Crys
h00bi schrieb:
Wäre es vielleicht praktikabel hier einen SSH Tunnel zum VPS aufzubauen und die FTP Ports weiterzuleiten?
Das wäre auch eine Option. Die socat werden ohnehin noch verschlüsselt.

sftp geht leider nicht, die meisten Geräte unterstützten nur ftp.
 
h00bi schrieb:
SSH Tunnel zum VPS
Ein ssh -L lokaler_port: remote_adresse: remote_port username@server.com -Tunnel funktioniert nur "lokal"? Das heißt, wenn ich auf dem VPS eine Verbindung zu dem lokalen Port, das zum ftp-Host führt, aufbaue, dann habe ich eine Verbindung. Wenn ich aber von extern (dritten PC) auf dasselbe Port des VPN zugreife, dann bekommen ich keine Verbindung?
So ist das zumindest gerade bei mir ...
 
Crys schrieb:
Ein ssh -L lokaler_port: remote_adresse: remote_port username@server.com -Tunnel funktioniert nur "lokal"?
Manpage sagt:
By default, the local port is bound in accordance with the GatewayPorts setting. However, an explicit bind_address may be used to bind the connection to a specific address. The bind_address of “localhost” indicates that the listening port be bound for local use only, while an empty address or ‘*’ indicates that the port should be available from all interfaces.
GatewayPorts wird vom sshd aus konfiguriert und dort steht folgendes:
GatewayPorts
Specifies whether remote hosts are allowed to connect to ports forwarded for the client. By default,
sshd(8) binds remote port forwardings to the loopback address. This prevents other remote hosts from
connecting to forwarded ports.
GatewayPorts can be used to specify that sshd should allow remote port
forwardings to bind to non-loopback addresses, thus allowing other hosts to connect. The argument may
be no to force remote port forwardings to be available to the local host only, yes to force remote
port forwardings to bind to the wildcard address, or clientspecified to allow the client to select the
address to which the forwarding is bound. The default is no.
Das muss also erst umkonfiguriert werden.
 
  • Gefällt mir
Reaktionen: Crys
riversource schrieb:
Bei Active FTP geht der Data Channel auch in die andere Richtung - vom Server zum Client. Entsprechend musst du für Port 20 die Regel "in die andere Richtung" anlegen.
qiller schrieb:
riversource hat da nochn Punkt. Ich würd einfach noch ne 3. Regel für die andere Richtung von Port 20 hinzufügen.
Das geht nicht, da Port 20/21 bei meinem Host ja schon in benutzung ist, deshalb erhalte ich nur ein Address already in use

ssh-Tunnel funktioniert auch nicht
Code:
bind [::]:21: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 21
Could not request local forwarding.

Ich weiß nicht mehr weiter.
Was geht:
  • http/s per vHost und socat
  • ssh per socat
Aber beides auf dem Weg Relais <-> Host unverschlüsselt.
Per OPENSSL-LISTEN klappt die Verschlüsselung, aber nicht mehr das Portmapping IPv4 to IPv6 🙄

  • Ich möchte nur den http/https/ssh/ftp IPv4 Traffic vom Relais-Server (VPS) zu mehreren Hosts liefern (der IPv4 Traffic von mehreren Servern kommt am Relais-Server an, der IPv6 Traffic wird an die Hosts gleich direkt versendet)
Habt ihr eine alternative Idee für das Portmapping?
 
Crys schrieb:
Das geht nicht, da Port 20/21 bei meinem Host ja schon in benutzung ist, deshalb erhalte ich nur ein Address already in use
Warum ist Port 20 schon in Benutzung? Du brauchst ihn nur ein Mal, vom Server zum Client.
 
ok, verrückt

Wenn ich per Ubuntu auf meinen ftp-Server per VPS zugreifen möchte, geht das:
Code:
$ ftp usr@IPv4_VPS
Connected to IPv4_VPS.
220 (vsFTPd 3.0.5)
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
229 Entering Extended Passive Mode (|||22198|)
150 Here comes the directory listing.
[...]
226 Directory send OK.
ftp> exit
221 Goodbye.
Auf 6 anderen Ubuntu 22 Systemen, die an verschiedenen Router sitzen, geht es auch, wie oben beschrieben.

Auf dem VPS läuft:
Code:
socat TCP4-LISTEN:21,fork TCP6:IPv6_Host:21
socat TCP4-LISTEN:22198,fork TCP6:IPv6_Host:22198
socat TCP4-LISTEN:22199,fork TCP6:IPv6_Host:22199
... mehr nicht!

/etc/vsftpd.conf
Code:
listen=NO
#
listen_ipv6=YES
#
anonymous_enable=NO
#
dirmessage_enable=YES
message_file=/usr/local/ftp_msg
#
use_localtime=YES
#
xferlog_enable=YES
#
#connect_from_port_20=YES
#
secure_chroot_dir=/var/run/vsftpd/empty
#
pam_service_name=vsftpd
#
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
#
utf8_filesystem=YES
#
local_enable=YES
userlist_deny=NO
userlist_enable=YES
userlist_file=/etc/vsftpd.user_list
#
write_enable=YES
allow_writeable_chroot=YES
#
chroot_local_user=YES
#
# ab hier habe ich etwas geändert:
#
pasv_address=IPv4_VPS
pasv_promiscuous=YES
pasv_max_port=22199
pasv_min_port=22198
seccomp_sandbox=NO
isolate_network=NO

In den Windows Clienten, in denen ich es getestet habe geht dies auch nie. Es kommt immer: Illegal PORT command. oder Vom Server gesendete Adresse für den Passiv-Modus ist nicht routingfähig. Benutze stattdessen die Serveradresse..
Per PowerShell Win10 geht dies auch nichts. Kann wohl kein passive Mode. Ubuntu 18, Debian geht auch nicht, hier kommt:
Code:
$ ftp IPv4_VPS
Connected to IPv4_VPS.
220 (vsFTPd 3.0.5)
Name (IPv4_VPS:usr): usr
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
500 Illegal PORT command.
ftp: bind: Address already in use
ftp> dir
500 Illegal PORT command.
ftp> cd PfadDenEsGibt
250 Directory successfully changed.
ftp> cd qwertz
550 Failed to change directory.
ftp> exit
221 Goodbye.
Hier muss eine Verbindung bestehen, es wird korrekt geprüft, ob ein Verzeichnis vorhanden ist! Aber es kann nichts angezeigt werden.
 
Code:
$ ftp -p FQDN_VPS
Connected to FQDN_VPS
220 (vsFTPd 3.0.5)
Name (FQDN_VPS:usr): usr
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (IPv4_VPS,86,183).
^C
ist bei 227 Entering Passive Mode (IPv4_VPS,86,183). das 86,183 das die Port Adressen? Wenn ja, ist das falsch.

Was ich herausgefunden habe ist, mein Server geht nur im Extended Passive Mode! Immer, auch lokal nur so.
Ergänzung ()

qiller schrieb:
Kenn das nur vom proftpd.
Ich habe mal vsftps purgend und proftpd installiert. Alles auf default gelassen. Aber selbst auch hier kann ich mit dem ftp-Server selbst lokal nur im Extended Passive Mode verbinden.

Code:
ftp -p usr@localhost
Connected to localhost.
220 ProFTPD Server (HuhuFtp) [::ffff:127.0.0.1]
331 Password required for extern
Password:
230 User usr logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
229 Entering Extended Passive Mode (|||14603|)
150 Opening ASCII mode data connection for file list
[...]
226 Transfer complete
ftp> exit
221 Goodbye.

Firewall (ufw) ist beim Host und VPS deaktiviert.
 
Zuletzt bearbeitet:
Zurück
Oben