Ubuntu 18.04 LTS 应用 iptables 更改 FTP/FTPS PASV 模式

Ubuntu 18.04 LTS 应用 iptables 更改 FTP/FTPS PASV 模式

我正在尝试设置 iptables,以便客户端计算机可以以被动模式使用 FTP/FTPS。

我已经通过 ufw 设置了多数规则 - 简短摘录(为了清楚起见,跳过了 IPv6 和其他规则的列表):

Status: active
Logging: on (low)
Default: deny (incoming), deny (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
20/tcp                     ALLOW OUT   Anywhere                   # FTP Data
21/tcp                     ALLOW OUT   Anywhere                   # FTP Command
22                         ALLOW OUT   Anywhere                   # FTPS
989                        ALLOW OUT   Anywhere                   # FTPS
21                         ALLOW OUT   Anywhere                   # FTP

当我通过 ufw 添加规则时:

sudo ufw allow out from any to any port 1025:65535 proto tcp comment "Ephemeral TCP"

一切运行良好 - 客户端可以连接到 FTPS 并列出目录树 + 下载文件。UFW
规则如下:

Status: active
Logging: on (low)
Default: deny (incoming), deny (outgoing), deny (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
20/tcp                     ALLOW OUT   Anywhere                   # FTP Data
21/tcp                     ALLOW OUT   Anywhere                   # FTP Command
22                         ALLOW OUT   Anywhere                   # FTPS
989                        ALLOW OUT   Anywhere                   # FTPS
21                         ALLOW OUT   Anywhere                   # FTP
1025:65535/tcp             ALLOW OUT   Anywhere                    # Ephemeral TCP

但是这条规则:

1025:65535/tcp             ALLOW OUT   Anywhere                    # Ephemeral TCP

会产生不良影响,即允许从客户端计算机到任何 IP 进行任何通信

这就是为什么我不想将其用作 UFW 规则,而是使用此命令设置 iptables:

sudo iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT

因此只允许与之前建立的 IP 进行传出通信。

因此我们有第一个列表中的 UFW 规则 - 没有

1025:65535/tcp             ALLOW OUT   Anywhere                    # Ephemeral TCP

和 iptables 列表

sudo iptables -L -n --line-numbers

输出结果如下:

Chain OUTPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state ESTABLISHED
2    ufw-before-logging-output  all  --  0.0.0.0/0            0.0.0.0/0           
3    ufw-before-output  all  --  0.0.0.0/0            0.0.0.0/0           
4    ufw-after-output  all  --  0.0.0.0/0            0.0.0.0/0           
5    ufw-after-logging-output  all  --  0.0.0.0/0            0.0.0.0/0           
6    ufw-reject-output  all  --  0.0.0.0/0            0.0.0.0/0           
7    ufw-track-output  all  --  0.0.0.0/0            0.0.0.0/0

但这不起作用,FTPS 客户端可以访问服务器,但无法列出目录树,下载任何文件。传出通信被 UFW 阻止

cat /var/log/syslog

给出输出:

[UFW BLOCK] IN= OUT=wl0 SRC=192.xxx.xxx.xxx DST=215.xxx.xxx.xx LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=8271 DF PROTO=TCP SPT=43379 DPT=27918 WINDOW=29200 RES=0x00 SYN URGP=0

我尝试在更新 iptables 中的 OUTPUT 链规则后发出命令:

sudo iptables-save #echoes all rules, seems not having a problem
sudo iptables-restore #hang ups, needs termination CTRL+C

但这并没有什么区别。

和:

sudo iptables-apply

给出此错误:

Error: rulesfile not readable: /etc/network/iptables.up.rules

一些问题:

  1. 为什么在 iptables 中的 OUTPUT 链中添加已建立的规则没有任何区别,而在 UFW 中添加规则有帮助?

  2. 如何向 iptables 添加规则,以便允许连接到 Ephemeral TCP 上的 FTP/FTPS 服务器,但前提是该连接之前有另一个到同一 IP 的连接。

  3. 如何在 iptables 中应用新规则集,使其持久并在启动时加载,就像 UFW 规则一样?

  4. 总的来说,将 UFW 与 iptables 一起使用是个好主意,还是我应该简单地卸载 UFW,而只使用 iptables?如果它能让生活更简单、实践更好,我宁愿将所有 UFW 规则重写为 iptables,而不是尝试结合使用这些工具。

答案1

FTP 被动模式需要连接到 FTP 服务器上的临时端口,因为实际的数据传输是通过不同的 TCP 连接完成的。

您可以尝试使用一些 FTP 助手 ( ip_conntrack_ftp),它会检查 FTP 控制通道并提取端口以仅打开这些连接。但这通常不适用于隐式 FTPS(端口 990),因为控制通道是加密的。虽然显式 FTPS(端口 21)支持仅加密控制通道以进行身份​​验证,但并非所有 FTP 客户端都支持此行为 - 这再次使得使用 FTP 助手变得不可能。

简而言之:不要使用 FTP。如果涉及 NAT 或防火墙,这是一个糟糕的协议。改用 SFTP(即通过 SSH 传输文件),这是一种完全不同的协议,并且也只需要一个端口(22)。

相关内容