FTP服务器无法从外部访问,绝大多数情况下是防火墙没有放行FTP服务所需端口或没有正确配置被动模式规则,核心解决思路是:在防火墙中固定FTP被动模式端口范围并放行21端口即可。
FTP服务器为什么总是被防火墙拦截?
对于搭建FTP服务的人来说,最常见的问题是:服务器本地测试访问一切正常,但局域网外或公网用户始终连不上,这种情况十有八九是防火墙规则与FTP的工作机制之间产生了冲突。
FTP协议天生特殊,它使用两个连接通道,分别是控制通道(默认TCP 21端口)和数据通道,数据通道的端口不固定,尤其在被动模式(PASV)下,服务器需要临时开放一个随机端口给客户端连接,倘若防火墙只放行了21端口,数据连接就会被拦在门外,表现为用户能输入账号密码、能看到目录列表,但一传输文件或列目录就卡死。
配置防火墙的关键不是简单地“放行FTP程序”,而是要同时放行控制端口和指定的被动模式端口范围,行业共识认为,固定被动模式端口是让FTP穿越防火墙最稳妥的办法。
第一步:固定FTP被动模式端口范围
要让防火墙规则清晰可控,先得让FTP服务器使用一个固定的端口段,而不是系统随机分配的任意高端口,同时还需要将服务器的公网IP告知客户端,这一步常被忽略。
Windows环境下的配置示例
以FileZilla Server为例,配置界面直观,多数中小企业都在用:
- 打开FileZilla Server管理界面,进入Edit → Settings → Passive Mode Settings。
- 勾选“Use custom port range”,填入一个自定义端口段,比如50000-50100。
- 在“Use the following IP”栏中输入这台服务器的公网IP地址,如果服务器在NAT网关背后,这里就必须填公网IP,否则客户端拿到的是服务器内网IP,数据连接会失败。
- 点击OK保存配置。
Linux环境下的配置示例
Linux服务器使用vsftpd的场景较为普遍,修改配置文件/etc/vsftpd/vsftpd.conf,加入或修改以下三行:
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50100
pasv_address=服务器公网IP
保存后重启vsftpd服务:
systemctl restart vsftpd
经此配置后,FTP服务器的数据连接只会使用50000-50100这些固定端口,防火墙放行规则随之变得简单明了。
第二步:配置Windows防火墙放行FTP端口
以Windows Server 2016/2019/2026为例,操作路径基本相同。
放行20与21端口
打开控制面板 → Windows Defender 防火墙 → 高级设置,点击左侧的“入站规则”,再点击右侧的“新建规则”:
- 规则类型选择“端口”。
- 协议和端口选择“TCP”,在“特定本地端口”一栏输入
20,21。 - 操作选择“允许连接”。
- 配置文件保持三个复选框全部勾选,确保域、专用、公用三种网络环境都生效。
- 完成命名后点击“完成”。
放行被动模式端口范围
按照同样的流程再新建一条入站规则,这次在“特定本地端口”填写50000-50100,如果先前设置的被动端口范围不同,此处以实际数值为准。
有两点需要特别指出:不要勾选“任何IP地址”作用域的规则来替代端口范围,虽然能简单粗暴地全部放行,但安全性会大打折扣;同时要保证FTP服务器软件(如FileZilla Server或IIS FTP)所在目录路径在防火墙的允许程序列表中不被误拦截。
修改防火墙入站规则的作用域
若要精细管控,可在入站规则的作用域(Scope)选项卡中限制只允许特定客户端IP访问,将“远程IP地址”设置为仅允许公司办公网段,这一做法在服务器暴露公网时尤其重要,能有效过滤扫描流量。
第三步:配置Linux防火墙放行FTP端口
Linux发行版常见的防火墙管理工具是firewalld和iptables,两者的配置方法都需要掌握。
firewalld环境(CentOS/RHEL 7及以上)
查看当前防火墙状态:
systemctl status firewalld
如果防火墙处于运行状态,执行以下命令开启FTP端口:
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --permanent --add-port=50000-50100/tcp
firewall-cmd --reload
如果担心对firewalld不熟悉导致规则混乱,也可以直接在system-config-firewall图形界面中勾选FTP服务,效果等同于命令行,输入iptables -L -n命令可以查看端口放行状态,确认规则是否生效。
iptables环境(CentOS 6及以下)
使用iptables命令直接配置规则:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 50000:50100 -j ACCEPT
service iptables save
需要特别留意的是,iptables规则的顺序会影响匹配结果,如果存在默认拒绝的INPUT链策略,务必确保放行规则位于拒绝规则之前,否则端口放行无效。
顺带处理SELinux
Linux下还有一种容易被忽视的拦截因素SELinux,如果按照上述配置后用户依然无法连接,可用以下命令查看SELinux是否拦截了FTP服务:
getsebool -a | grep ftp
常见的需要开启的布尔值包括ftpd_full_access,执行:
setsebool -P ftpd_full_access 1
-P参数表示永久生效,覆盖重启。
常见问题排查与验证
规则配置完成后,务必进行实际验证,不要以为配置完就万事大吉。
验证端口是否正常侦听
在服务器本机执行:
- Windows:
netstat -an | findstr 21 - Linux:
netstat -an | grep 21或ss -tlnp | grep 21
正常情况下应显示LISTENING或LISTEN状态。
验证防火墙规则是否生效
在客户端机器上使用telnet命令测试21端口连通性:
telnet 服务器IP 21
若显示连接成功且返回220状态码,说明防火墙已正确放行,被动模式端口范围同理可以抽查测试,例如telnet 服务器IP 50000。
用户反馈的集中瓶颈
据统计,相当一部分FTP连接失败案例的根因并非防火墙本身,而是上面提到的FTP服务器被动模式参数未配置公网IP,当服务器处于NAT网关后方时,客户端从PASV响应中解析到的数据连接IP是内网地址,自然无法继续传输,这类问题即便防火墙规则再完美也无法解决,需要将配置中的IP字段改为公网地址,或配置路由器端口映射将被动端口范围一并转发至内网服务器。
FTP服务器防火墙设置相关问题解答
如何判断FTP连接失败是防火墙还是端口映射的锅?
在服务器本机使用ftp 127.0.0.1测试连接,若能正常连接而外部无法连接,排除FTP服务自身故障,问题出在防火墙或路由器,如果本机同样无法连接,则需检查FTP服务是否正常启动、端口是否被其他程序占用。
公司网络内连接正常,外网始终连接超时,怎么排查?
首先确认服务器公网IP是否可ping通以及21端口是否telnet通,若端口不通,重点检查云服务商的安全组策略和防火墙两道关卡。云服务器的安全组属于第一道闸门,有些用户在系统内部防火墙放行后忽略了安全组配置,导致依旧无法访问,同时核对FTP服务器被动模式地址是否为公网IP。
被动模式端口范围设置得越大越好吗?
不是,端口范围大确实能缓解大量并发连接时的端口占用冲突,但同时也意味着防火墙放行的范围更宽,被扫描探测的风险面随之变大,常见做法是选择100-200个端口作为连续端口段,足够应对多数中小型服务器峰值并发,若并发需求极大,建议评估使用SFTP方案替代传统FTP。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/773731.html


