如何为使用动态端口的被动FTP制定防火墙规则?

如何为使用动态端口的被动FTP制定防火墙规则?

以下两条规则允许被动传输,我将其添加为 FTP 服务器的防火墙规则。

//The following two rules allow the inbound FTP connection
iptables -A INPUT -s $hostIP -p tcp --dport 21 -i eth0 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d $hostIP -p tcp --sport 21 -o eth0 -m state --state ESTABLISHED -j ACCEPT

// The following two rules allow for passive transfers
iptables -A INPUT -s $hostIP -p tcp --dport 1024:65535 -i eth0 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d $hostIP  -p tcp --sport 1024:65535 -o eth0 -m state --state ESTABLISHED -j ACCEPT

我的 FTP 是通过将被动端口分配到范围“1024:65535”来配置的服务器,并且上述规则有效。但现在 FTP 服务器配置为绑定任何空闲端口,而不是固定端口范围。那么上述两条规则需要进行哪些修改呢?

编辑 在应用答案中提到的被动 FTP 连接的三个规则后,我按以下顺序设置了规则,现在它停止工作意味着客户端已连接但无法检索远程目录。

//The following two rules allow the inbound FTP connection
iptables -A INPUT -s $hostIP -p tcp --dport 21 -i eth0 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d $hostIP -p tcp --sport 21 -o eth0 -m state --state ESTABLISHED -j ACCEPT

iptables  -A PREROUTING -t raw -p tcp -s $hostIP --dport 21 -j CT --helper ftp
iptables  -A INPUT -m conntrack --ctstate RELATED -m helper --helper ftp -s $hostIP -p tcp -j ACCEPT
iptables  -A OUTPUT -m conntrack --ctstate ESTABLISHED -m helper --helper ftp -d $hostIP -p tcp -j ACCEPT

工作规则

iptables -A PREROUTING -t raw -p tcp -s $hostIP --dport 21 -j CT --helper ftp
iptables -A INPUT  -i eth0 -p tcp -s $hostIP -m conntrack --ctstate RELATED,ESTABLISHED -m helper --helper ftp -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -d $hostIP -m conntrack --ctstate ESTABLISHED -m helper --helper ftp -j ACCEPT

答案1

我假设$hostIP您的规则中的意思是您希望允许 FTP 访问的主机,否则您现有的规则对我来说没有意义。

如果您使用未加密的 FTP,则应使用连接跟踪替换完全开放的 FTP 数据连接规则。

首先,添加一条规则,将 FTP 连接跟踪助手附加到任何传入的 FTP命令连接:

iptables -A PREROUTING -t raw -p tcp -s $hostIP --dport $ftpCMDport -d $ftpServerIP -j CT --helper ftp

这里$ftpCMDport是您本地FTP服务器接受登录的端口;通常是21端口。

(历史记录:这曾经在 TCP 端口 21 上自动发生,但事实证明自动分配可能会被滥用,因此连接跟踪助手的自动分配在 Linux 内核 3.5 中成为可选的,后来自动分配功能被完全删除.)

一旦 CT 帮助程序监视 FTP 命令连接,防火墙就会“知道”应允许哪些端口用于合法 FTP 数据连接。您还需要另外两个规则才能实际使用此信息来允许传入数据连接:

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -m helper \
   --helper ftp -s $hostIP -d $ftpServerIP -p tcp -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -m helper \
   --helper ftp -s $ftpServerIP -d $hostIP -p tcp -j ACCEPT

这三个规则一起应该完全取代现有的两个 FTP 数据连接规则。如果您的 FTP 服务器允许这两种类型,这些应该对主动和被动连接都有好处。如果您只想接受被动 FTP 数据连接,您可能需要删除RELATEDOUTPUT 规则中的 。

这是基于:https://home.regit.org/netfilter-en/secure-use-of-helpers/


如果您使用 SSL/TLS 加密 FTP,则连接跟踪助手将无法理解加密的 FTP 命令流量,因此,如果 FTP 服务器接受任何空闲端口中的数据连接,您将无法有效地防火墙流量完全通过 TCP 端口,因为任何 TCP 端口都可以成为某些连接的 FTP 数据端口。那么您唯一的可能性就是通过 IP 地址限制流量:

iptables -A INPUT -s $hostIP -p tcp -i eth0 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d $hostIP  -p tcp -o eth0 -m state --state ESTABLISHED -j ACCEPT

请注意,这些本质上是您现有的规则,删除了--dport--sport选项。

相关内容