FTP全称File Transfer Protocol,中文叫文件传输协议,诞生在上世纪七十年代,属于互联网早期的协议之一。它的功能很简单,就是在两台设备之间传输文件。现在很多人传文件习惯网盘、微信,但服务器运维、网站部署、设备固件升级这类场景,FTP依旧在大量使用。弄懂基础原理,尤其是端口相关知识,配置防火墙、排查连接故障会省事很多。
FTP工作模式和HTTP不一样。浏览网页时浏览器和服务器维持单条连接,请求和响应来回交互。FTP会建立两条独立连接,控制连接用来发送命令、接收状态码,登录、切换目录、列出文件清单都走这条链路;数据连接负责传输文件本身。控制连接默认TCP 21端口,几乎所有FTP服务端安装完成之后默认监听21端口,客户端不手动修改端口,默认也是连接这个端口。

数据连接端口并不固定,取决于选用主动模式还是被动模式。主动模式英文为PORT,服务器通过自身TCP 20端口主动发起连接,访问客户端设备。所以20是主动模式的数据端口,是服务器向外发起连接的源端口,不是持续监听端口。被动模式PASV,服务器在预先划定的区间随机启用高位端口,把端口号告知客户端,由客户端发起连接。不同软件默认端口区间不一样,vsftpd常用50000到51000,FileZilla Server多为50000到50100,IIS FTP有自己的默认范围。被动模式现在使用更广,绝大多数客户端处在路由器、防火墙后方,主动模式需要服务器反向连客户端,大多会被拦截。
如果有人问FTP服务器默认端口,答案就是21。问到数据端口,主动模式为20,被动模式是一段动态端口范围,不存在单一固定端口。配置防火墙只放行21端口远远不够,被动端口段也要一并开放,不然会出现账号密码登录成功,但是无法列出目录、不能传输文件的现象。云服务器还要关注安全组,安全组没有放行端口,本机防火墙配置再完整也没用。
FTP登录一般需要账号密码,同时支持匿名访问。匿名用户用户名填写anonymous,密码随便填写邮箱格式字符即可。匿名账号权限通常限制严格,仅支持读取,不能写入,或是只能访问指定目录。传输模式分为ASCII和二进制,早年手动传输文本、程序文件需要切换模式,现在客户端基本自动识别,无需手动调整。但FTP原生没有加密,账号密码和文件内容在网络明文传输,公网直接使用风险很高。后续衍生出FTPS,在FTP外层增加SSL/TLS加密,显式FTPS依旧使用21端口,隐式FTPS使用990端口。还有经常被混淆的SFTP,它和FTP没有关联,属于SSH协议的组成部分,默认端口22,底层实现完全不同。
常见FTP服务端软件,Linux平台有vsftpd、ProFTPD、Pure-FTPd;Windows平台有FileZilla Server、Serv-U,IIS也自带FTP服务。这些软件默认监听21端口,但是端口都可以自定义。修改为2121或者其他端口,能规避一部分自动化端口扫描,修改端口之后客户端连接地址也要同步改动,否则无法连通。测试时优先在服务器本机执行ftp 127.0.0.1,本机能够登录,说明服务本身正常,再从其他机器远程连接。远程连不上,优先排查网络与防火墙;被动模式访问失败,优先怀疑端口区间没有放行,不要优先判定账号密码出错。