Debian 9 ProFTPD iptables 配置

Debian 9 ProFTPD iptables 配置

我正在尝试在 Debian 9 上为 ProFTPD 配置 iptables。访问将从 LAN 内进行。不涉及 NAT。根据我到目前为止所读到的内容,这不能保证被动 FTP?

唯一的其他传入访问是 SSH,这将仅限于单个源 IP。

仅 apt 软件包更新需要出站访问。我还没有抽出时间来制定这方面的规则。

提到的规则这里,让 FTP 正常工作,但阻止所有出站流量。

目前的配置是

-A INPUT -p tcp -m tcp --dport 22 -s xxx.xxx.xxx.xxx -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -s yyy.yyy.yyy.yyy/25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 20 -s yyy.yyy.yyy.yyy/25 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -p tcp -m tcp --dport 21 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 20 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

答案1

实际上,您的规则集应该适合出站数据包:问题是传入数据包回应那些数据包被拒绝。

主要问题是这一行:

-A INPUT -p tcp -m tcp --sport 1024:65535 --dport 20:65535 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

例如,当您尝试运行软件包更新时,该apt工具将发送到 Debian 镜像服务器的连接,通常发送到 HTTP 的目标端口 80。源端口将是一个随机的高端口(当然高于 1024,比方说 12345)。

对此数据包的响应将从 Debian 镜像返回,源端口号和目标端口号会翻转:响应的源端口号将为 80,目标端口号将为 12345。

但是您的传入规则不会匹配源端口低于 1024 的任何传入数据包,无论它们是新连接还是已建立的连接。因此,您将连接请求发送到端口 80,但对从该端口返回的任何答案充耳不闻。

我推荐以下内容作为您的前两个输入规则:

-A INPUT -i lo -j ACCEPT    # accept anything from the loopback interface
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

第一行将接受通过环回接口的任何内容,或者换句话说,您自己的计算机中使用网络协议相互通信的进程。当流量通过环回接口进入时,根据定义,源位于同一台计算机上,因此通常没有理由阻止它们。

第二行接受对任何传出连接的任何有效传入响应以及与它们相关的任何内容(例如,ICMP 错误数据包告诉您特定连接尝试出了什么问题)。如果已激活 FTP 的相应特殊连接跟踪帮助程序,则该行还将处理 FTP 数据连接,无论是主动还是被动。继续阅读...

-m state您使用的匹配已过时并且已被弃用;我的-m conntrack --ctstate ESTABLISHED,RELATED基本上是它的更新版本。)

如果您为 FTP 连接调用适当的连接跟踪帮助程序,处理起来会容易得多。以前这是自动的,但后来有人找到了一种滥用自动助手选择的方法,并且必须将其禁用。

因此,告诉系统我们希望从您的网络到 TCP 端口 21 的任何传入连接都是有效的 FTP 控制连接:

-t raw -A PREROUTING -p tcp -s yyy.yyy.yyy.yyy/25 --dport 21 -j CT --helper ftp

当建立传入 FTP 控制连接时,FTP conntrack 帮助程序将监视其中发出的任何文件传输命令,并自动使 conntrack 子系统了解任何相关的 FTP 数据连接,以便早期的“ESTABLISHED,RELATED”规则将接受他们而且只有他们:不再需要为潜在的 FTP 数据连接保持开放的各种端口!

当使用 FTP conntrack 帮助程序时,您将不再需要任何端口 20 的规则,也不再需要任何带有--sport 1024:65535或 的规则--dport 20:65535

劫持被动 FTP 数据连接的尝试也将被自动挫败:连接跟踪子系统将发现劫持者的连接与调用数据传输的 FTP 控制连接的来源不同,因此劫持尝试将不会被阻止。匹配成功,默认被拒绝。

如果您使用 FTP 镜像进行 Debian 更新,您也需要对任何传出 FTP 连接进行类似的处理。这可以通过以下方式完成:

-t raw -A OUTPUT -p tcp --dport 21 -j CT --helper ftp

相关内容