Also, make sure if your FTP server is running on some flavour of Linux OS, to allow your passive ports in iptables and restart the firewall/iptables process.
I cannot stress this enough to have both processes restarted after iptables has been changed.
Witnessed this first hand, troubleshooting FTP passive mode that was working only up to the point for the initial connection to port 21 and not any further.
We saw when passive mode came into action and it was taking one of the ports from the passive ports defined in Checkpoint firewall, but when directory listing needed to complete, the connection timed.
A packet capture was taken to try and help us further in troubleshooting, this showed that when the passive port was negotiated with the FTP server a SYN was being send to the FTP server but the 3-WAY handshake never completed.
So no SYN-ACK and ACK.
Sysadmin assured the config of FTP box was solid and iptables where good, doublechecking and confirming it.
After restarting iptables - which was already configured to allow the passive ports - and restarting the firewall process ... BINGO, everything was working!
Internal Linux iptables/firewall was the culprit, still blocking the allowed passive ports because the processes where not restarted after the config change.
Hope this info is still helping anybody out there.