访问外部FTP服务器却连不上,十有八九是防火墙拦住了数据连接端口,核心解决办法是:放行21号命令端口,同时根据FTP的工作模式放行对应的数据端口范围。
很多朋友以为防火墙只要放行21端口就万事大吉,结果还是连不上,卡在登录后的列表读取阶段,问题通常出在FTP的主动模式和被动模式上,这两种模式使用的数据端口完全不同,防火墙规则也跟着变。
先搞懂FTP防火墙设置为什么会卡壳
FTP协议天生有个特点:它需要两个连接,一个管命令,一个管数据,命令连接走21端口,数据连接则要看模式。
主动模式和被动模式的区别
主动模式下,服务器主动去连接客户端的某个端口,通常是20端口,这意味着客户端防火墙得允许外部主动连入大范围的高位端口,这对大多数家用宽带和办公网络来说并不现实。
被动模式下,服务器开放一个随机高位端口,客户端主动去连接,这时候要放行的是服务器端的端口范围,客户端防火墙只需要允许出站连接和对应的应答流量即可。
行业共识认为,绝大多数现代FTP客户端默认使用被动模式,这也是为什么很多人在家用网络环境下能轻松连接,但在公司防火墙后面却举步维艰,你需要在服务器防火墙中开放一个被动端口范围,比如10000到10200,然后在FTP服务端把被动端口范围锁定到这个区间。
给你的FTP服务单独划一个端口池是降低风险的关键动作。
一次完整连接要经过哪些关卡
完整的FTP会话包括DNS解析、TCP三次握手、用户认证、目录列表传输、文件上传或下载等步骤,每一步都可能被防火墙拦截,但最隐蔽的坑在数据传输阶段。
命令连接建立后,客户端发送PASV命令,服务器回复一个IP和端口,客户端去连接这个端口,如果防火墙只放行了21端口,自然没法完成后续的数据传输,这就解释了为什么很多用户卡在”读取目录列表失败”这一步。
Windows防火墙下ftp端口怎么开
Windows自带的防火墙是很多人的第一道坎,打开控制面板,进入Windows Defender防火墙,点击高级设置,这一步需要管理员权限。
入站规则和出站规则分别怎么配
在入站规则中新建规则,选择端口,协议选TCP,特定本地端口填21,如果服务器启用了被动模式,还要一并填上被动端口范围,比如21, 10000-10200,下一步勾选允许连接,确认规则应用范围包含域、专用和公用三个配置文件,命名保存即可。
出站规则通常不需要额外配置,因为Windows默认允许所有出站连接,如果你的环境改过默认出站策略为拒绝,则需要在出站规则中允许TCP 21端口和被动端口范围的出站流量。
Windows自带FTP服务的防火墙端口设置
如果你是拿Windows的IIS搭建FTP服务,还多一步操作,在IIS管理器中打开FTP防火墙支持功能,填入服务器的静态IP地址和被动端口范围,这一步很多人漏掉,结果客户端永远收到内网IP地址,导致连接失败。
然后回到防火墙高级设置,把FTP服务器程序本身加入允许列表,操作路径是:控制面板 → 系统和安全 → Windows Defender防火墙 → 允许应用或功能通过Windows Defender防火墙 → 更改设置 → 允许其他应用 → 浏览到C:WindowsSystem32inetsrvinetinfo.exe。
Linux服务器防火墙放行FTP端口
Linux上的防火墙工具五花八门,最常见的两种是iptables和firewalld,云服务器上还有安全组这一层。
iptables放行FTP端口的具体命令
如果你用的是iptables,核心命令是:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 10000:10200 -j ACCEPT
别忘了还要加载FTP相关的内核模块,否则即使放行了端口,连接还是会被拒:
modprobe nf_conntrack_ftp
modprobe nf_nat_ftp
这两个模块负责跟踪FTP数据连接的状态,没有它们,防火墙就分不清哪些数据包属于已有会话,会直接丢弃。
firewalld配置FTP服务
用firewalld就简单多了,它内置了ftp服务定义:
firewall-cmd --permanent --add-service=ftp firewall-cmd --permanent --add-port=10000-10200/tcp firewall-cmd --reload
如果你在/etc/vsftpd/vsftpd.conf中配置了被动端口范围,记得和防火墙放行的范围保持一致,否则会有一半概率连不上。
云服务器安全组和路由器防火墙设置
现在用云服务器的用户越来越多,云平台的安全组和公司的路由器端口映射也是一道常见关卡。
云服务器安全组ftp端口设置
简米云、酷番云、华为云的控制台都类似,以简米云为例,在ECS实例的安全组规则中添加入方向规则:端口范围填21/21,授权对象填0.0.0.0/0,如果使用被动模式,再添加一条10000/10200的规则。
所有云平台都建议限制授权对象为特定IP段,比如你公司的出口IP,而不是对所有公网开放,这也是最基本的云安全常识。
这里有个容易栽跟头的细节:如果安全组默认拒绝所有入站流量,那你不仅要放行21端口,还要放行被动端口范围,少一条就失败,酷番云的安全组还区分IPv4和IPv6规则,配置时留意一下协议栈。
路由器端口映射的FTP防火墙设置
家用宽带或公司固定IP环境,往往需要在路由器上做端口映射,登录路由器管理界面,找到端口映射或虚拟服务器选项,添加规则:外部端口21映射到内网FTP服务器的21端口。
如果使用被动模式,还需要把被动端口范围一并映射,比如10000-10200,这就意味着你的路由器需要支持端口范围映射,部分老款路由器只支持单端口映射,需要升级固件或更换设备。
很多路由器还内置了SPI防火墙,会检查FTP数据包的合法性,如果开启后连不上,尝试临时关闭SPI防火墙测试是否为其导致,另一个典型坑是路由器收到的FTP数据包包含内网地址,除非路由器有FTP ALG功能,否则数据连接就会指向内网地址,导致客户端无法连接。
FTP防火墙设置常见问题排查
能登录但列表加载不出来
这是被动模式未正确配置的最典型特征,客户端能输入用户名密码,但卡在读取列表阶段,处理方法:在FTP服务端配置固定的被动端口范围,防火墙放行该范围,路由器同步映射该范围。
连接被重置或超时
通常是对端防火墙主动丢弃了数据包,登录服务器,用netstat -an命令查看FTP服务是否监听在0.0.0.0:21,再检查防火墙规则是否真的生效。
内外网表现不一致
内网能连,外网连不上,问题基本出在路由器端口映射或云安全组,内网访问走的是局域网路径,根本不经过公网映射,所以内外网表现差异反而帮你缩小了排查范围。
主动模式下的防火墙配置建议
虽然主动模式用得少,但某些老旧的FTP服务器或特定网络环境强制要求使用主动模式,这时客户端防火墙需要允许入站TCP 20端口连接,或者允许对端主动连接到高位端口。
Windows防火墙默认会拦截主动模式的数据连接,因为这是入站连接,在高级安全Windows Defender防火墙中添加入站规则,放行TCP 20端口,可以解决部分主动模式连接问题。
比较成熟的做法是,在FTP服务端配置文件里启用被动模式:”pasv_enable=YES”,同时指定被动端口范围,这样防火墙规则只需要针对这些端口做精确放行,不需要开放大段不可控的高位端口,同时建议把FTP服务所在服务器与其他业务隔离,避免端口开放导致的安全面扩大。
配置完成后,可以用一个简单的FTP客户端在局域网内测试,再切到外网测试,验证思路是逐层排查:先确认服务端监听正常,再确认防火墙和端口映射配置正确,由近及远定位问题。
常见问题解答
FTP防火墙到底要放行多少端口才够用?
端口21用于命令连接,端口20用于主动模式的数据传输(可选),被动模式下需要额外放行一段端口范围,你可以设置几百个端口,比如10000-10500,保证并发连接够用即可,不要贪多。
路由器的FTP ALG要不要开启?
如果你的FTP服务器在路由器内网,且使用主动模式,开启ALG有助于路由器正确转发数据包,但如果是被动模式且已经配置了端口映射,ALG反而可能干扰连接,此时建议关闭它。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/727480.html





