Actually my intuition already was that Net::FTPServer isn't the problem...
A look into the code of Net::FTPServer revealed that the error is raised by
if (!$self->{_test_mode} && $hostaddrstring ne $self->{peeraddrstr
+ing})
{
# See RFC 2577 section 3.
$self->reply (504, "Proxy FTP is not allowed on this server.")
+;
return;
}
so $self->{peeraddrstring} is compared with $hostaddrstring.
Data::Dumper shows me that $self->{peeraddrstring} correctly holds the IP of my client machine. And $hostaddrstring is constructed from the address my client sends to the ftp-server via the PORT command.
Here lies the error. As I could see in my gFTP log, gFTP sends: PORT "192,168,xxx,xxx,xxx,xxx"
And this finally ends up in the $hostaddrstring. But as you can see from the address, this is the local-network-address of my workstation on our LAN here and not my actual public IP. That's why the test in Net::FTPServer fails.
My FTP client does this all the time and I don't know why other FTP servers never complained. Net::FTPServer seems to be stricter here.
Anyway, now that we know Net::FTPServer isn't the actual problem. Does anyone know where in my client/workstation/linux-machine setup the flaw is? (as a reminder: if the test would pass, for example by enabling proxy ftp, my ftp-client goes into infinite wait with "150 Opening data connection for file listing.")