我正在使用 Arch Linux。我按照教程更改 /etc/iptables/iptables.rules 以仅允许我的 Web 服务器的基本端口。我还使用 /etc/modules-load.d/nf_conntrack_ftp.conf 来启用该模块,并更改了我在 /etc/modprobe.d/ip_conntrack_ftp.conf 中使用的默认 FTP 端口。我有两个问题。 FTP 无法工作,因为我收到“500 非法端口命令”和“ERRCONNREFUSED”。如果我改用主动模式并通过普通 FTP,它就可以工作。所以是iptables有问题。另外,即使我允许,iptables 也不允许 IPv6 连接。我需要更改另一个文件吗?感谢您。这是 iptables.rules 的屏幕截图:
当然,在发布此内容之前我更改了 FTP 端口。
答案1
TL;TR:FTP 是一个损坏的协议,FTPS 更是如此。由于协议设计和加密的结合,它与防火墙一起发挥非常糟糕。尝试使用 SFTP(即通过 SSH 协议传输文件)。
FTP 由控制连接(通常是端口 21)和数据连接组成。数据连接使用哪些端口在控制连接内动态交换。在主动模式下,客户端侦听 PORT 或 EPRT 命令内给定的 IP/端口,并且服务器连接到客户端。在被动模式下,服务器侦听响应 PASV 或 EPSV 命令而给出的 IP/端口,并且客户端连接到服务器。
在防火墙配置中处理此类动态端口的一种方法是保持广泛的端口开放。这显然与使用防火墙尽可能限制攻击面的想法相矛盾。因此,大多数防火墙提供一些“助手”来检查控制连接并找出哪些端口用于动态连接,以便它们可以根据需要创建匹配的数据包过滤规则。对于 iptables,这是在 ip_conntrack_ftp 内部完成的。这就是你现在正在尝试的。
不幸的是,使用此类帮助程序意味着防火墙必须能够读取控制连接内的流量。如果您不使用普通的未加密 FTP,这是可能的。但使用 FTP+TLS 时,控制连接是加密的,因此帮助程序无法提取必要的信息来按需打开端口。理论上有一种方法可以解决这个问题,即仅使用 TLS 传输授权部分,然后再次关闭加密(FTPS 命令 CCC),但这需要客户端支持和使用。
因此,如果可能,请避免使用 FTP 和 FTPS,而使用 SFTP。这是通过 SSH 协议进行文件传输,并且仅使用单个端口,这使得限制性防火墙配置更加容易。