nat环境下ftp主动模式需依赖nf_conntrack_ftp模块实现协议感知:该模块解析port命令中的内网ip/端口,动态创建conntrack条目,使iptables仅放行21端口即可自动跟踪并允许服务器从20端口发起的数据连接。

启用 nf_conntrack_ftp 模块(核心前提)
该模块必须加载,否则 iptables 无法解析 FTP 控制流中的数据端口协商信息。
- 检查是否已加载:
lsmod | grep nf_conntrack_ftp - 若未加载,手动加载:
modprobe nf_conntrack_ftp - 永久生效(写入配置):
echo "nf_conntrack_ftp" >> /etc/modules(Debian/Ubuntu)
或echo "nf_conntrack_ftp" > /etc/sysconfig/modules/ftp.modules并加执行权限(RHEL/CentOS)
iptables 规则只需放行 21 端口(极简配置)
启用模块后,你不再需要手动开放 20 端口或猜测客户端端口范围。只要允许命令通道建立,模块会自动处理后续数据连接的状态跟踪。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 放行 FTP 控制连接(21 端口):
iptables -A INPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT - 放行已建立连接的返回流量(含模块自动跟踪的数据流):
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -
不需要单独放行 20 端口、也不需要写
--sport 20或--dport 20规则
确保 vsftpd 配置匹配主动模式语义
模块只辅助协议解析,服务端行为仍需正确。vsftpd 必须使用标准主动模式逻辑(即用 20 端口发数据)。
- 编辑
/etc/vsftpd/vsftpd.conf,确认以下设置:port_enable=YESconnect_from_port_20=YESpasv_enable=NO - 重启服务:
systemctl restart vsftpd - 注意:不要设置
ftp_data_port为非 20 的值,否则模块可能无法准确识别
验证与排错要点
模块生效后,应能看到 conntrack 表中出现 FTP 相关的“expect”条目。
- 查看跟踪状态:
conntrack -L | grep ftp—— 正常会有类似ipv4 2 tcp 6 299 ESTABLISHED src=192.168.1.100 dst=203.0.113.5 sport=54321 dport=21 ... [ASSURED]及其对应的src=203.0.113.5 dst=192.168.1.100 sport=20 dport=54321条目 - 若仍失败,检查:
• 客户端是否确实使用主动模式(如 Linuxftp命令登录后输入port或ftp> passive off)
• 是否有其他防火墙(如 firewalld、ufw)覆盖了 iptables 规则
• 内核日志:dmesg | grep -i ftp查看模块加载或拒绝记录










