iptables rules for NAT with FTP active / passive connections

If you have an FTP server running behind a server that acts as the gateway or firewall, here are the rules to enable full NAT for active and passive connections.

# general rules for forwarding traffic between external interface tap0 and internal interface eth0
iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE
iptables -A FORWARD -i tap0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tap0 -j ACCEPT

# NAT for active/passive FTP. would be your internal ftp server
iptables -t nat -A PREROUTING -p tcp --dport 20 -j DNAT --to
iptables -t nat -A PREROUTING -p tcp --dport 21 -j DNAT --to
iptables -t nat -A PREROUTING -p tcp --dport 1024:65535 -j DNAT --to
iptables -A FORWARD -s -p tcp --sport 20 -j ACCEPT
iptables -A FORWARD -s -p tcp --sport 21 -j ACCEPT
iptables -A FORWARD -s -p tcp --sport 1024:65535 -j ACCEPT

# allowing active/passive FTP
iptables -A OUTPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT

You must also have IPv4 forwarding enabled, check by

# should return 1
cat /proc/sys/net/ipv4/ip_forward

# otherwise
sysctl -w net.ipv4.ip_forward=1
and edit /etc/sysctl.conf like so “net.ipv4.ip_forward = 1″

You also need to have ip_nat_ftp and ip_conntrack_ftp modules loaded. Check for them

lsmod | grep ip_nat_ftp
lsmod | grep ip_conntrack_ftp
# if no result then load them until next reboot, google for making it permanent depending on your OS
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp

add to /etc/sysconfig/iptables-config
IPTABLES_MODULES=″ip_nat_ftp ip_conntrack_ftp″
2016   forwarding   ftp   iptables   port