我正在尝试设置 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
一些问题:
为什么在 iptables 中的 OUTPUT 链中添加已建立的规则没有任何区别,而在 UFW 中添加规则有帮助?
如何向 iptables 添加规则,以便允许连接到 Ephemeral TCP 上的 FTP/FTPS 服务器,但前提是该连接之前有另一个到同一 IP 的连接。
如何在 iptables 中应用新规则集,使其持久并在启动时加载,就像 UFW 规则一样?
总的来说,将 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)。