On a Windows Server 2008 R2 Web server, I have a Windows Service which uploads files to an external FTP server. Actually multiple servers (Google, Bing, etc.). This is a .NET application which uses the built-in .NET FTP libraries.
I'm getting a mixture of the following errors:
The operation has timed out.
The remote server returned an error: (425) Can't open data connection.
Windows Firewall (Domain, Private, Public) is set to allow outbound connections.
FTP is not a firewall-friendly protocol. It predates the Internet era where firewalls were common, so assumes it's perfectly oK for both sides of a conversation to open ports with each other. The COMMAND channel, which is what you open when you connect to an FTP server, is a connection you initiate between you and the server. The DATA channel, what you use to download stuff, is a connection initiated by the FTP Server to you. What's worse, the port your FTP chooses to present is a random high port so configuring your firewall to allow the right ports is tricky.
This is why they created "Passive" mode in the FTP protocol. This is the PASV verb. This tells the FTP server to reverse the initiation direction of the DATA channel; it gives the client the high port to connect to, the client initiates the connection, and the server feeds data over that connection. Much easier to firewall.
For .NET's libraries, you'll probably get better luck setting the UsePassive property to True.