FTP服务默认使用的端口是21(控制端口)和20(主动模式数据端口),被动模式下,数据端口从高位随机范围动态分配,这是绝大多数FTP服务端的一致默认行为,也是排查FTP连接问题时第一步要确认的基础。
FTP服务默认端口详解:主动模式与被动模式端口区别
很多新手第一次接触FTP时会有个疑惑:FTP到底用哪个端口?答案不是一个,而是两个,并且取决于工作模式,搞清楚这一点,就搞清楚了FTP端口的一半问题。
主动模式:服务器用20端口主动敲门
主动模式是FTP最早的工作方式,客户端先与服务器的21端口建立控制连接,然后客户端发送PORT指令,告诉服务器“我这个端口已经开好了,你直接来连”,此时服务器会从自己的20端口发起一条新的TCP连接,主动连接到客户端指定的那个端口。
整个过程可以拆成三步:
- 客户端连接服务器21端口,发送用户名和密码。
- 客户端开放一个本地随机端口(比如60000),通过控制连接告诉服务器。
- 服务器从自己的20端口主动连接客户端的60000端口,数据开始传输。
主动模式的麻烦在于:服务器的20端口需要主动向客户端方向发起连接,当客户端处在NAT网关或防火墙背后时,服务器根本连不回去,企业内网、家用宽带的用户,主动模式几乎必然失败,这也是为什么现在多数FTP客户端把被动模式设为默认,但用户可以在客户端软件的“站点设置”里自由切换,需要根据网络环境选择。
被动模式:随机高位端口等你来连
被动模式(PASV)就是为了解决主动模式连不回去的问题而出现的,流程变成:
- 客户端连接服务器21端口,发送PASV命令。
- 服务器在本地开放一个高位端口(通常在1024以上),把这个端口号回传给客户端。
- 客户端主动连接服务器的这个高位数据端口,开始传输数据。
被动模式下,数据端口不是20,而是一个临时随机端口,这个端口号由服务器软件配置决定,每次连接都可能不同,多数主流FTP服务端(如vsftpd、FileZilla Server、ProFTPD)默认从高位端口范围取数,具体范围因版本和设置而异,常见的配置区间比如50000-60000这种集中段,便于防火墙集中放行。
两种模式端口对比
| 对比项 |
主动模式(PORT) | 被动模式(PASV) |
|---|---|---|
| 控制端口 | 21 | 21 |
| 数据端口 | 20 | 随机高位端口(如1025-65535) |
| 连接发起方 | 服务器主动连客户端 | 客户端主动连服务器 |
| 常见故障 | 客户端防火墙拦截入站连接 | 服务器防火墙未放行被动端口范围 |
| 适用场景 | 服务器和客户端都在公网或同网段 | 客户端处于NAT、家用宽带等环境 |
对于部署在云服务器上的FTP,被动模式更常用,因为云主机安全组通常只放行特定入站端口,固定放行一个被动端口区间,比放行20端口让服务器主动外连容易控制得多。
FTP端口被占用怎么解决?
FTP默认占用21端口,但21端口被其他程序抢占的情况在工作中时有发生,比如装了某些管理软件、系统服务冲突、或者另一个FTP实例没关干净。
排查分三步走:
- 第一步:确认端口状态。 在服务器上执行
netstat -ano | findstr :21(Windows)或ss -lntup | grep 21(Linux),看21端口是否被LISTEN状态占用,如果显示已被某个进程占用,记下PID,再通过任务管理器或ps -ef | grep PID定位是哪个程序。 - 第二步:解决占用冲突。 如果是残留的FTP进程,直接结束进程,如果是其他无关软件占用了21端口,可以把那个软件的监听端口改掉,或者给FTP换端口。
- 第三步:修改FTP服务端口。 比如把FTP改到2121端口,需要在服务端配置中修改监听端口,然后同步修改防火墙放行规则,否则外部连接会被防火墙拦掉,表现为“连接超时”而非“拒绝连接”。
行业内有一个容易踩的坑:很多刚入行的运维会把FTP和SSH的端口搞混,22是SSH的默认端口,不是FTP的,FTP的控制连接端口固定为21,数据端口随模式变化,安装FTP服务后记得检查防火墙,不要只放行20和21就算结束,被动模式下也要放行配置的那个端口区间,否则能登录但列表加载不出来,花大量时间排查客户端配置却查不到原因,这种情况在实际运维中占相当大比例。
FTP为什么需要两个通道?控制端口与数据端口的分工
FTP和HTTP、HTTPS最大的区别在于它使用双通道通信:控制通道和数据通道相互独立,21端口负责命令传输,比如用户登录认证、列目录、切换路径,数据端口负责实际的文件内容或目录列表传输。
这种设计的直接好处是:传输大文件时,如果控制连接出现短暂的网络波动,文件数据流的TCP会话仍然可以继续,不会因为一次指令超时就把整个传输掐断,一个控制连接上可以连续发起多个数据连接,客户端登录一次,多次下载文件,不必反复验证身份。
代价也是明显的:每建立一段数据连接就多占用一个端口,NAT设备需要额外跟踪这些动态端口,防火墙规则跟着变复杂,被动端口范围传输完成前不会自动释放端口资源,导致高并发场景下文件只传一小部分但端口连接处于CLOSE_WAIT状态,占用着FTP服务端的TCP连接上限。
FTP服务器端口如何修改与客户端连接配置
无论使用哪种FTP服务端,修改端口的思路是一致的:修改监听端口 → 修改防火墙规则 → 客户端用新端口连接。
Windows环境:IIS或FileZilla Server
IIS的FTP站点设置中,可以直接在“绑定”项里把端口从21改成其他数字,FileZilla Server则在“设置 → 被动模式设置”中开放一个范围,比如50000-50100,并可以自定义监听端口,旧版本默认被动端口范围较小,新版本默认行为有调整,配置后记得重启服务。
Linux环境:vsftpd 实操示例
vsftpd是Linux上最常见的FTP服务端,没有之一,修改被动端口范围的配置文件是/etc/vsftpd/vsftpd.conf,在文件末尾追加:
pasv_enable=YES
pasv_min_port=50000
pasv_max_port=50010
这段配置的含义是:开启被动模式,并且让服务器在50000-50010之间分配数据端口,配好后执行systemctl restart vsftpd,防火墙需要使用iptables或firewalld做一次放行:
firewall-cmd --add-port=21/tcp --permanent
firewall-cmd --add-port=50000-50010/tcp --permanent
firewall-cmd --reload
如果只放行21端口,登录时会提示连接成功,但一执行ls或上传文件就会卡死超时,这是FTP被动模式下最常见的工作场景,多数情况下按上述步骤处理即可解决。
客户端连接修改端口后的FTP
命令行FTP连接方式为ftp 服务器IP 端口,Windows资源管理器则输入ftp://IP:端口,FileZilla客户端在“主机”栏填写IP:端口或使用快速连接栏的端口输入框,端口修改后,数据库中原本存储的FTP站点地址也要同步更新,否则定时抓取文件的任务会一直报错。
FTP端口安全风险与防护思路
把21端口暴露在公网上,等于向所有扫描器公开了服务器上的FTP服务,端口扫描工具可以轻松识别出21端口运行的是FTP,然后尝试暴力破解弱口令,近年来针对FTP弱口令爆破的攻击流量仍然大量存在,云服务器后台安全组日志中经常能看到针对21端口的连续探测。
FTP本身是明文协议,用户名、密码和数据传输时都不加密,用抓包工具可以直接看到登录口令和文件内容,所以公网环境下的FTP服务,至少要遵循以下几点:
- 修改默认21端口,降低被自动化扫描器直接锁定的概率。
- 使用强密码并限制登录IP,服务器安全组或防火墙只放行业务需要的源IP。
- 优先升级为FTPS(FTP over TLS)或SFTP(基于SSH),SFTP默认端口是22,不依赖FTP双通道模型。
行业共识认为:现有业务场景中,FTP更适合在内网或专线环境使用,公网环境除非有明确合规要求,否则直接用SFTP或对象存储会更稳,如果实在要用FTP,至少保证端口不裸奔、密码不简单。
常见问题
FTP默认端口21和20有什么区别?
21端口是FTP的控制端口,用于传递命令和登录信息,无论主动还是被动模式都用它,20端口是主动模式下专用的数据端口,用来传实际文件内容,被动模式下数据端口改从高位随机分配,20端口不参与工作,两者缺一不可,但各自承担的任务完全不同。
FTP主动模式和被动模式哪个好用?
多数情况下被动模式更好用,因为数据连接由客户端发起,避开了客户端NAT和防火墙对入站连接的限制,主动模式只有在服务器和客户端网络路径可以直接互通时才更省事,不需要额外配置被动端口范围,如果是租用的云服务器做FTP,建议直接设置被动端口范围并全部放行,否则客户端会频繁出现目录列表超时。
FTP端口被防火墙拦截时该怎么处理?
优先登录云厂商控制台,在安全组规则中放行21端口和配置的被动端口范围,再检查服务器本地防火墙,Linux服务器执行firewall-cmd --list-all查看放行列表,Windows服务器检查“高级安全Windows Defender防火墙”的入站规则是否允许TCP端口,若客户端在NAT后面,还需检查客户端所在路由器的端口映射配置,多数家用路由器默认禁止外网主动连接到内网高位端口。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/740394.html





