服务器上防火墙配置不当,是导致FTP服务部署后公网无法访问的头号原因;解决思路是:明确FTP协议使用的端口(21控制端口+被动模式数据端口范围),在服务器防火墙中放行这些端口,并确保防火墙状态检测模块正确处理FTP连接。
服务器防火墙怎么配置:核心规则与思路
防火墙的本质是“白名单”
无论是Linux还是Windows,服务器防火墙默认只放行少数必要流量,你搭建FTP服务后,公网客户端无法连接,多半是因为防火墙压根没给FTP开口子,配置前要搞清楚两件事:你的服务器运行什么防火墙(iptables/firewalld/ufw/Windows防火墙),以及云平台有没有额外的安全组或网络ACL。
FTP协议为何在防火墙面前“特殊”
FTP与其他协议不同,它使用两个端口:控制端口21,数据端口则根据模式变化,主动模式下,服务器主动连接客户端高位端口,客户端需在自身防火墙放行,被动模式下,服务器开放一个端口范围让客户端连接该端口传数据,服务器防火墙必须放行这个范围,多数情况下,被动模式更适合公网场景,因为客户端无需额外配置,但如果你只开放端口21,数据连接会被防火墙拦截,造成“能登录,但列目录或下载文件卡死”的现象。
以下表格展示两种模式对防火墙的需求差异:
| 模式 | 数据连接方向 | 服务器防火墙需求 | 客户端防火墙需求 |
|---|---|---|---|
| 主动模式 | 服务器主动连客户端 | 放开出站(端口20) | 放开入站高位端口 |
| 被动模式 | 客户端主动连服务器 | 放开入站端口范围 | 无特殊要求 |
FTP公网无法访问怎么办:优先排查防火墙
检查端口21是否放行
首先确认服务器防火墙允许TCP端口21入站,不同系统操作不同:
- Linux(firewalld):运行
firewall-cmd --list-ports查看已放行端口,若没有21,用firewall-cmd --permanent --add-port=21/tcp添加并重载配置。 - Linux(iptables):运行
iptables -L -n查看INPUT链,确保有
ACCEPT tcp dpt:21规则。 - Windows Server:打开“高级安全Windows防火墙”,新建入站规则,选择端口,协议TCP,端口21,允许连接。
- 云平台安全组:在控制台添加入站规则,TCP 21端口,来源0.0.0.0/0(或指定IP)。
被动模式端口范围必须放开
只放开21端口只是第一步,FTP被动模式端口设置是配置关键,服务器会使用一个端口范围(如30000-31000)用于数据连接,你需要在防火墙和云平台安全组同样放行这个范围,在FTP服务器软件中配置被动模式端口范围,然后确保防火墙放行这些端口,例如vsftpd配置:
pasv_min_port=30000
pasv_max_port=31000
pasv_address=你的公网IP
配置完成后需重启vsftpd服务:systemctl restart vsftpd,防火墙规则需包含这个范围,并确保端口范围未被其他服务占用。
别忘了云平台的安全组规则
如果你使用简米云、酷番云、华为云等云服务器,实例的防火墙之外还有一层安全组,很多用户只改了服务器内部防火墙,却忽略了安全组规则,导致公网访问仍然被拦截,安全组需要单独添加入站规则,放行FTP相关端口,以简米云为例,在安全组规则页面,添加自定义TCP规则,端口21,授权对象0.0.0.0/0;再添加一条规则,端口30000-31000,授权对象0.0.0.0/0,这是排查过程中的常见盲区,建议优先检查安全组。
不同操作系统下的防火墙配置实操
Linux以CentOS为例:firewalld与iptables选择
CentOS 7及以后默认使用firewalld,但很多老用户习惯iptables,无论哪种,本质都是控制Netfilter,配置FTP时,建议使用firewalld,因为它能自动加载FTP模块 nf_conntrack_ftp,减少状态问题,具体步骤:
- 安装firewalld并启动(如果未安装)。
- 开放21端口:
firewall-cmd --permanent --add-service=ftp或--add-port=21/tcp,推荐使用service方式,因为firewalld预置了ftp服务定义,还会自动加载相关模块。 - 开放被动模式端口范围:
firewall-cmd --permanent --add-port=30000-31000/tcp。 - 重载:
firewall-cmd --reload。
- 确认规则:
firewall-cmd --list-all。
如果使用iptables,需要手动加载FTP连接跟踪模块:modprobe nf_conntrack_ftp,并确保iptables规则允许21和被动范围端口,规则顺序很重要,需要确保在默认拒绝之前放行,示例规则:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 30000:31000 -j ACCEPT
注意将规则加到默认策略为DROP之前,iptables规则在重启后丢失,需要持久化保存,如使用 iptables-save 或 iptables-persistent。
Windows Server防火墙配置场景
Windows Server 2012/2016/2019/2026使用高级安全Windows防火墙,配置FTP时,需要新建两条入站规则:
- 规则1:协议TCP,端口21,允许连接。
- 规则2:协议TCP,端口范围(如30000-31000),允许连接。
在FTP服务器软件(如IIS FTP)中设置被动模式端口范围,并指定防火墙的外部IP地址(如果服务器有公网IP),IIS FTP还需要在防火墙设置中启用“FTP防火墙支持”,否则被动模式可能无法正常工作,操作路径:IIS管理器 -> FTP防火墙支持 -> 配置数据通道端口范围及外部IP地址,确保填写的IP地址是服务器公网IP,否则客户端无法正确连接数据端口,配置完成后,建议重启FTP服务。
常见配置误区与验证方法
只开21端口就想跑通FTP
这是最普遍的错误,FTP数据连接使用独立端口,主动模式依赖客户端,被动模式需要服务器开放端口范围,只放行21端口,用户能登录但无法获取目录列表或传输文件,行业共识认为,除非你明确控制客户端环境并强制使用主动模式,否则对公网开放的FTP服务必须配置被动模式并开放对应端口范围。
忽略防火墙FTP状态检测模块
对于有状态防火墙(如iptables的conntrack),如果未加载FTP模块,防火墙无法识别FTP控制连接中的端口协商信息,可能会切断数据连接,Linux下需确保 nf_conntrack_ftp 模块加载,firewalld默认会处理,但iptables需手动操作,Windows防火墙默认支持FTP协议,但某些第三方防火墙可能拦截,验证方法:检查防火墙日志,看是否有端口被拒绝的记录。
验证配置是否生效
配置完成后,必须验证,你可以:
- 使用telnet命令测试21端口是否可达:
telnet 服务器公网IP 21,如果出现FTP欢迎信息,说明控制端口通。 - 使用FTP客户端(如FileZilla)连接,开启详细日志,查看被动模式是否成功协商端口范围,并检查数据连接是否建立,FileZilla日志中会显示“正连接到服务器IP:端口”,如果超时或被拒绝,说明防火墙拦截。
- 在服务器端使用
tcpdump或wireshark抓包,确认防火墙是否允许数据包通过。tcpdump -i eth0 port 21 or portrange 30000-31000。 - 尝试从公网另一个网络(如手机热点)连接,排除本地网络限制。
FTP公网无法访问,90%的根源在防火墙,先理清FTP协议的特殊性,再按上文步骤检查服务器防火墙和云平台安全组,确保21端口和被动模式端口范围正确放行,同时关注状态检测模块的加载,只要按流程走,问题基本能解决。
服务器防火墙配置与FTP访问常见问题解答
问题1:FTP公网无法访问,彻底关闭防火墙能通吗?
关闭防火墙确实能绕过所有限制,但极不安全,不推荐,真正解决方法是正确配置防火墙,而不是关闭,关闭防火墙相当于对互联网敞开门户,服务器极易被攻击,你应该通过配置规则来允许FTP流量,而不是禁用安全防护。
问题2:被动模式端口范围设置为多少合适?
范围大小取决于并发连接数,一般建议1000个端口,如30000-31000,足以满足多数中小型站点,端口范围越小,防火墙规则越简单,但并发较多时可能端口耗尽,你可以根据实际在线用户数调整,同时确保防火墙和安全组放行这个范围。
问题3:FTP主动模式在防火墙配置上有什么不同?
主动模式要求服务器防火墙允许出站连接,因为服务器会主动连接客户端的高位端口,你需要在服务器防火墙开放出站规则,允许源端口20(或任意端口)连接目标高位端口,但客户端本身也需允许入站,实际部署中麻烦且不安全,所以公网场景极少使用主动模式。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/586143.html




