核心概念:主动模式 vs. 被动模式
在理解如何指定端口之前,必须先了解 FTP 的两种工作模式,因为数据连接的建立方式完全不同。

-
主动模式:
- 控制连接:客户端从随机端口(50000)连接到服务器的 21 端口。
- 数据连接:服务器主动从服务器的 20 端口连接回客户端的随机端口(50000)。
- 特点:服务器主动发起连接,可能会被客户端的防火墙拦截。
-
被动模式:
- 控制连接:客户端从随机端口(50000)连接到服务器的 21 端口。
- 数据连接:客户端向服务器请求一个被动连接,服务器会告知客户端一个随机端口(2121),然后客户端主动连接到这个端口。
- 特点:客户端主动发起所有连接,更容易通过防火墙,是目前更常用的模式。
使用 ftp 命令行客户端
这是最经典的方式,适用于 Linux/macOS 终端或 Windows 的命令提示符。
连接时指定控制端口 (Port 21)
通常情况下,FTP 的控制连接端口是固定的 21,所以不需要特别指定,但如果你的 FTP 服务器修改了默认端口,你可以这样连接:

ftp -p <服务器IP或域名>:<控制端口>
-p是--passive的缩写,强烈建议使用被动模式。<控制端口>是你连接服务器的那个端口,默认是 21。
示例:连接到 IP 为 168.1.100,控制端口为 2121 的 FTP 服务器
ftp -p 192.168.1.100:2121
执行后,系统会提示你输入用户名和密码。
连接后指定数据端口 (在被动模式下)
一旦你通过上述方式建立了控制连接(默认就是被动模式),数据连接的端口是由服务器在 PASV 命令交互中动态分配的。你无法在客户端直接指定数据端口,客户端会自动连接到服务器告诉它的那个随机端口。
在主动模式下指定客户端数据端口
如果你在主动模式下工作,客户端的数据端口通常是随机的,如果你想指定一个固定的端口(50000),你需要使用 port 命令,但这在现代系统中很少使用,因为防火墙会阻止服务器的入站连接。
示例(不推荐,仅作了解):
- 先以主动模式连接(不加
-p)。 - 使用
port命令,这个命令的格式很特殊,需要将你的 IP 地址和端口号转换成一个特定的 6 个数字的序列。
假设你的客户端 IP 是 168.1.101,你想使用数据端口 50000。
port 命令的格式是 h1,h2,h3,h4,p1,p2。
h1,h2,h3,h4是 IP 地址的四个十进制数。192,168,1,101p1,p2是端口号的两个字节。50000除以 256 得到195(商) 和80(余数),所以是195,80。
完整的命令是:
port 192,168,1,101,195,80
之后,当你执行 get 或 put 时,FTP 服务器就会尝试连接到你客户端的 50000 端口。
使用 lftp 命令行客户端 (更强大)
lftp 是一个比传统 ftp 命令更现代、功能更强大的客户端,语法更直观。
连接时指定控制端口
lftp -p <控制端口> <服务器IP或域名>
示例:连接到 IP 为 168.1.100,控制端口为 2121 的 FTP 服务器
lftp -p 2121 192.168.1.100
连接后,输入用户名和密码。
连接后设置被动模式端口范围 (高级用法)
在 lftp 中,你可以设置被动模式下客户端愿意连接的端口范围,这对于通过严格的防火墙策略非常有用。
set ftp:passive-mode on set ftp:port-allowance-range <起始端口>-<结束端口>
示例:设置被动模式的数据端口只能在 50000 到 51000 之间
lftp 192.168.1.100 lftp user@192.168.1.100:~> set ftp:passive-mode on lftp user@192.168.1.100:~> set ftp:port-allowance-range 50000-51000 lftp user@192.168.1.100:~> ls
这样,lftp 在请求被动连接时,只会从 50000 到 51000 这个范围内选择一个端口,并告诉服务器。
使用图形化 FTP 客户端 (如 FileZilla)
对于图形界面,操作非常直观。
- 新建站点:在 FileZilla 的站点管理器中,创建一个新站点。
- 服务器地址:输入服务器 IP 或域名。
- 端口:在 "端口" 字段中输入你的控制端口(
2121)。 - 加密:选择 "使用普通 FTP"(不推荐,不安全)或更安全的 "要求显式 FTP over TLS"。
- 登录类型:选择正常、匿名或询问。
- 用户名和密码:填写你的凭据。
关于数据端口:在图形化客户端中,数据端口通常由客户端在后台自动处理,用户无需关心,FileZilla 默认使用被动模式,并且可以配置被动模式使用的端口范围(在 "编辑" -> "设置" -> "连接" -> "FTP" -> "被动模式" 中)。
总结与最佳实践
| 客户端类型 | 指定控制端口 (连接时) | 指定/影响数据端口 (连接后) | 推荐模式 |
|---|---|---|---|
ftp (传统) |
ftp -p host:port |
port h1,h2,h3,h4,p1,p2 (主动模式,不推荐) |
被动模式 (使用 -p 选项) |
lftp (现代) |
lftp -p host port |
set ftp:port-allowance-range <start>-<end> (被动模式) |
被动模式 (默认开启) |
| FileZilla (图形) | 在站点管理器的 "端口" 字段输入 | 在设置中配置被动模式端口范围 | 被动模式 (默认) |
核心要点:
- 指定控制端口:在连接命令或图形界面中修改,默认是 21。
- 指定数据端口:
- 在被动模式(推荐)下,端口由服务器分配,客户端无法直接指定,但可以像
lftp那样设置一个可接受的端口范围。 - 在主动模式(不推荐)下,客户端可以通过
port命令指定一个端口,但极易被防火墙阻止。
- 在被动模式(推荐)下,端口由服务器分配,客户端无法直接指定,但可以像
- 始终优先使用被动模式 (
-p或passive-mode on),因为它对客户端防火墙更友好。
