如何使被动 FTP 穿过 Iptables 防火墙?

如何使被动 FTP 穿过 Iptables 防火墙?

我在 Fedora Linux 服务器上运行了一个 iptables 防火墙,它基本上被用作防火墙路由器和 OpenVPN 服务器。就是这样。多年来,我们一直在使用相同的 iptables 防火墙代码。我确实在 12 月 21 日做了一些更改,以重新路由 mySQL 端口,但考虑到发生的事情,我完全撤消了这些更改。在进行这些更改并撤消后不久,由 vsftpd 进程提供的被动 FTP 停止工作。我们使用被动 ftp 客户端将远程望远镜中的图像 FLING(这是在 Windows 下运行的 ftp 客户端的名称!:-))发送到我们的服务器。

我相信这是防火墙代码的问题,因为我可以删除防火墙,FTP 文件传输(并使用 Internet Explorer 连接到 ftp 站点以查看文件列表)仍可正常工作。当我启用 iptables 防火墙时,它停止工作。

再次强调,这是我们多年来一直在使用的代码。但是,我觉得可能我遗漏了一些东西,所以我们有一个 2009 年的 .bak 文件,我使用了它。同样的行为,被动 ftp 不起作用。

于是我逐行重建了防火墙代码,以查看哪一行导致了问题。一切都正常,直到我把这行代码

-A FORWARD -j DROP

在结尾处。当然,如果我没记错的话,这行代码基本上就是“打开”防火墙,表示除了我上面设置的例外情况外,其他都删除。但是,这行代码可能从 2003 年起就出现在 iptables 代码中了。

所以,我已经筋疲力尽了,但我仍然不明白为什么它停止工作了。我想我需要一位 iptables 配置专家。

这是带有注释的 iptables 代码(来自 iptables-save)。

# Generated by iptables-save v1.3.8 on Thu Jan  5 18:36:25 2012
*nat
# One of the things that I remain ignorant about is what these following three lines
# do in both the nat tables (which we're not using on this machine) and the following
# filter table.  I don't know what the numbers are, but I'm ASSUMING they're port
# ranges.
#
:PREROUTING ACCEPT [7435:551429]
:POSTROUTING ACCEPT [6097:354458]
:OUTPUT ACCEPT [5:451]
COMMIT
# Completed on Thu Jan  5 18:36:25 2012
# Generated by iptables-save v1.3.8 on Thu Jan  5 18:36:25 2012
*filter
:INPUT ACCEPT [10423:1046501]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [15184:16948770]

# The following line is for my OpenVPN configuration.
-A INPUT -i tun+ -j ACCEPT 

# In researching this on the Internet I found some iptables code that was supposed to
# open the needed ports up. I never needed this before this week, but since passive FTP
# was no longer working, I decided to put the code in. The next three lines are part of
# that code.
-A INPUT -p tcp -m tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 20 -m state --state ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state RELATED,ESTABLISHED -j ACCEPT 

# Another line for the OpenVPN configuration. I don't know why the iptables-save mixed
# the lines up.
-A FORWARD -i tun+ -j ACCEPT 

# Various forwards for all our services
-A FORWARD -s 65.118.148.197 -p tcp -m tcp --dport 3307 -j ACCEPT 
-A FORWARD -d 65.118.148.197 -p tcp -m tcp --dport 3307 -j ACCEPT 
-A FORWARD -s 65.118.148.197 -p tcp -m tcp --dport 3306 -j ACCEPT 
-A FORWARD -d 65.118.148.197 -p tcp -m tcp --dport 3306 -j ACCEPT 
-A FORWARD -s 65.118.148.196 -p tcp -m tcp --dport 21 -j ACCEPT 
-A FORWARD -d 65.118.148.196 -p tcp -m tcp --dport 21 -j ACCEPT 
-A FORWARD -d 65.118.148.196 -p tcp -m tcp --dport 20 -j ACCEPT 
-A FORWARD -s 65.118.148.196 -p tcp -m tcp --dport 20 -j ACCEPT 
-A FORWARD -s 65.118.148.196 -p tcp -m tcp --dport 7191 -j ACCEPT 
-A FORWARD -d 65.118.148.196 -p tcp -m tcp --dport 7191 -j ACCEPT 
-A FORWARD -s 65.118.148.196 -p tcp -m tcp --dport 46000:46999 -j ACCEPT 
-A FORWARD -d 65.118.148.196 -p tcp -m tcp --dport 46000:46999 -j ACCEPT 
-A FORWARD -s 65.118.148.0/255.255.255.0 -j ACCEPT 
-A FORWARD -d 65.118.148.196 -p udp -m udp --dport 53 -j ACCEPT 
-A FORWARD -s 65.118.148.196 -p udp -m udp --dport 53 -j ACCEPT 
-A FORWARD -d 65.118.148.196 -p tcp -m tcp --dport 53 -j ACCEPT 
-A FORWARD -s 65.118.148.196 -p tcp -m tcp --dport 53 -j ACCEPT 
-A FORWARD -d 65.118.148.196 -p udp -m udp --dport 25 -j ACCEPT 
-A FORWARD -s 65.118.148.196 -p udp -m udp --dport 25 -j ACCEPT 
-A FORWARD -d 65.118.148.196 -p tcp -m tcp --dport 42 -j ACCEPT 
-A FORWARD -s 65.118.148.196 -p tcp -m tcp --dport 42 -j ACCEPT 
-A FORWARD -s 65.118.148.196 -p tcp -m tcp --dport 25 -j ACCEPT 
-A FORWARD -d 65.118.148.196 -p tcp -m tcp --dport 25 -j ACCEPT 
-A FORWARD -d 65.118.148.196 -p tcp -m tcp --dport 80 -j ACCEPT 
-A FORWARD -s 65.118.148.196 -p tcp -m tcp --dport 80 -j ACCEPT 
-A FORWARD -d 65.118.148.204 -p tcp -m tcp --dport 80 -j ACCEPT 
-A FORWARD -s 65.118.148.204 -p tcp -m tcp --dport 80 -j ACCEPT 
-A FORWARD -d 65.118.148.196 -p tcp -m tcp --dport 6667 -j ACCEPT 
-A FORWARD -s 65.118.148.196 -p tcp -m tcp --dport 6667 -j ACCEPT 
-A FORWARD -s 65.96.214.242 -p tcp -m tcp --dport 22 -j ACCEPT 
-A FORWARD -s 192.68.148.66 -p tcp -m tcp --dport 22 -j ACCEPT 
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT 

# "The line" that causes passive ftp to stop working. Insofar as I can tell, everything
# else seems to work - ssh, telnet, mysql, httpd.
-A FORWARD -j DROP 
-A FORWARD -p icmp -j ACCEPT 

# The following code is again part of my attempt to put in code that would cause passive
# ftp to work. I don't know why iptables-save scattered it about like this.
-A OUTPUT -p tcp -m tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT 
-A OUTPUT -p tcp -m tcp --sport 20 --dport 1024:65535 -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT 
COMMIT
# Completed on Thu Jan  5 18:36:25 2012

因此,有了这些前奏,我的基本问题是:如何让被动 ftp 在 iptables 防火墙后面工作?正如您所看到的,我尝试让它(再次)工作,并尝试对这个问题进行一些研究,但结果...不够。

我和世界各地的变星天文学家都将非常感激您的回答!谢谢!

-Richard “Doc” Kinne,美国变星观测者协会,[电子邮件保护]

答案1

最简单的选择是配置 vsftpd 的一系列用于 PASV 连接的端口(使用pasv_max_portpasv_min_port),然后允许该端口范围内的所有传入连接通过防火墙。

答案2

查看您的 iptables 规则,我假设您打算将 FTP 流量转发到主机 65.118.148.196 - 我还假设 65.118.148.196 不是运行您的 iptables 的主机。

为了使 iptables 以这种方式成功转发 PASV FTP 流量,必须加载 iptables conntrack 模块。

为此,请修改/etc/sysconfig/iptables-config文件。前几行应如下所示:

# Load additional iptables modules (nat helpers)
#   Default: -none-
# Space separated list of nat helpers (e.g. 'ip_nat_ftp ip_nat_irc'), which
# are loaded after the firewall rules are applied. Options for the helpers are
# stored in /etc/modprobe.conf.
IPTABLES_MODULES=""

将标记的空间更新IPTABLES_MODULES=""为以下内容:IPTABLES_MODULES="ip_conntrack_ftp"。可以使用 -m conntrack 标志将这些模块作为规则的一部分加载,这样做可能会导致在重新启动规则时刷新模块。这将与您在帖子中描述的行为一致。按照我上面概述的方式配置模块将使用 iptables 加载模块,而不是特定规则。更新后,/etc/sysconfig/iptables-config您需要重新启动 iptables 服务。

为了向您提供完全正确的 iptables 规则,我们需要知道您的 FTP 服务器配置为用于 PASV 的确切端口范围。

答案3

我的 IP 表相当生疏,但如果问题在您告诉防火墙仅允许明确定义的连接后开始出现,则似乎您尝试建立的连接未按照规则正确定义。您确定您的客户端和服务器都尝试使用同一个端口吗?

此外,虽然 IP 表是一种非常强大的防火墙,但它并不是最用户友好的。也许是时候考虑新的软件了。

相关内容