Linux Passive FTP Not Working Problem And Solution

by on January 4, 2007 · 11 comments· last updated at October 12, 2008

Q. I'm running GNU/Linux system with FTP server and passive ftp client requests are not working. What can I do to fix this problem under Linux iptables Firewall?

A. An ftp connection also needs a data transfer channel using active or passive session.

Make sure firewall is not blocking your FTP session. If ports are open make sure IPtables is allowing passive ftp. To solve this problem add ip_conntrack_ftp module. Type the following command to load this module:
# modprobe ip_conntrack_ftp

Iptables passive ftp rules

Same iptables firewall script to deal with incoming ftp requests including Active and Passive connections.

#!/bin/bash
# Sample iptables shell script to deal with FTP server issues including
# active and passive FTP connections issues.
IPT=/sbin/iptables
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
 
# Setting default filter policy
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
 
# Allow FTP connections @ port 21
$IPT -A INPUT  -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
 
# Allow Active FTP Connections
$IPT -A INPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
 
# Allow Passive FTP Connections
$IPT -A INPUT -p tcp --sport 1024: --dport 1024:  -m state --state ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -p tcp --sport 1024: --dport 1024:  -m state --state ESTABLISHED,RELATED -j ACCEPT
 
### Add the rest of rules below ###
 
### log and drop everything else
$IPT -A INPUT -j LOG
$IPT -A FORWARD -j LOG
$IPT -A INPUT -j DROP
 


You should follow me on twitter here or grab rss feed to keep track of new changes.

Featured Articles:

{ 11 comments… read them below or add one }

1 Dalibor Straka February 3, 2009 at 2:45 pm

At first glance I thought it is for client not for server ;-)

This is very nice article except that my FW didn’t work right untill I added RELATED here:

$IPT -A INPUT -p tcp –sport 1024: –dport 1024: -m state –state ESTABLISHED,RELATED -j ACCEPT

I guess that nf_conntrack_ftp reads the port in payload for port 21 and then the new tcp packet from 12345 -> 54321 has SIN flag, thus is RELATED to the first connection, but in no way is established.

Reply

2 Bart Calixto April 1, 2009 at 11:29 pm

Thanks!, looking for hours for a solution.
My problem was fixed right after i typed : modprobe ip_conntrack_ftp

What this means / do ?

Greetings,
Bart.

Reply

3 arun kumar July 4, 2009 at 8:13 am

hp laserjet printer 1020 not working in linux at local network

Reply

4 kitt August 7, 2009 at 12:29 am

Why do you need this “$IPT -A OUTPUT -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT” if you default accept outgoing packets “$IPT -P OUTPUT ACCEPT”

Reply

5 Antonio Díaz M. December 23, 2009 at 5:06 pm

but you are opening ports that allow connections to other applications such as P2P, MSN Messenger, etc…

Reply

6 Victor Henriquez September 23, 2010 at 11:03 pm

Excellent Post…My FTP Works great, thanks….

Reply

7 Nishi March 6, 2011 at 11:34 pm

FTP might work great, but what about that rule that says block all else incoming?? I’m now locked out of the server….

Reply

8 lol October 10, 2012 at 3:05 pm

now you know not to copy and paste haha

Reply

9 Nitin July 5, 2011 at 5:06 am

Worked fine. Thanks.

Reply

10 Ryan Griggs August 23, 2011 at 7:56 pm

In addition to the firewall rules, on CentOS I had to edit /etc/sysconfig/iptables-config to tell it to load the correct modules.

Add the following to the IPTABLES_MODULES line:
“ip_conntrack_netbios_ns ip_conntrack ip_conntrack_ftp”

So your IPTABLES_MODULES line should read:
IPTABLES_MODULES=”ip_conntrack_netbios_ns ip_conntrack ip_conntrack_ftp”

Restart IPTABLES (‘service iptables restart’) and you should see it load the conntrack modules.

All is good!

Ryan

Reply

11 Patrice December 11, 2011 at 6:47 pm

Why to open the port 1024??? Passive connection use port 21 and then a port from 1024 to 65545…

Reply

Leave a Comment

You can use these HTML tags and attributes for your code and commands: <strong> <em> <ol> <li> <u> <ul> <kbd> <blockquote> <pre> <a href="" title="">

Tagged as: , , , , , , , ,

Previous Faq:

Next Faq: