It would be easier to help if you posted an entire script, or a reduced test case that illustrates the problem.
I would think that a timeout would occur when you construct the ftp connection, not when you issue dir(). If you invoke the connection as described in Net::FTP you should get an error message when the connection fails. You can also include Debug=>1 to have more information printed to stderr.
my $ftp = Net::FTP->new($hostname,Debug=>1)
or die "Cannot connect to $hostname: $@";
Although I might think that the timeout would occur at construction, I am apparently wrong. Sorry. With the updated information posted below and your code, it appears the problem is different that I had initially thought.