ftp即file transfer protocol文件传输协议,适用于文件传输的一个协议。
ftp有两个channel。
类型 | 作用 | 端口号 |
---|---|---|
command channel | 命令端口,用于接受要执行命令 | 21 |
data channel | 数据端口,用于传输数据 | 20 |
ftp是cs结构,客户端连接服务端时可以选择以主动模式连接或者别动模式连接。
当客户端以主动模式连接客户端时,执行以下步骤,下述提到的随机端口N>1024:
当客户端以被动模式连接客户端时,执行以下步骤,下述提到的随机端口N>1024,R>1024:
可以看出来,主动模式下,server端使用20端口用于数据传输。被动模式下,server端使用随机端口进行数据传输。
模式 | client数据端口 | server数据端口 | 主动性 |
---|---|---|---|
主动模式 | 随机 | 20 | server端建立连接 |
被动模式 | 随机 | 随机 | client端建立连接 |
由于client端一般都防火墙或者NAT下面,所以在主动模式下server连接client给的一个随机端口很可能被block掉,所以在生产中一般使用passive模式。但是passive模式中server端需要提供一个随机端口给client用于数据传输,这有很大的安全隐患。所有最好指定一个port range。
passive模式中需要指定port range,一般来水一两个client使用一个端口。但是有些client会开多个session,例如客户端要上传100个文件,他可能会开5个session去上传文件,这样子就会占用5个server端的端口了,所以要评估用户数和业务场景得出一个port range。
由于ftp在传输文件是没有对传输的内容进行进行加密,内容是plain text,存在安全问题。FTPS和SFTP是安全的文件传输协议。
FTPS(FTP Secure)使用 Secure Sockets Layer (SSL) 或者 Transport Layer Security (TLS) protocols进行加密,除了使用用户密码登录外,还会进行证书校验,总之FTPS是基于FTP的,是FTP的安全版本。
SFTP (SSH File Transfer Protocol) 不同于FTP,是一个基于SSH全新的协议,端口号22。
上docker hub找一个靠谱点的镜像如下,配置一下。需要开启主动和被动模式。
环境变量 | 含义 | |
---|---|---|
FTP_USER | 用户 | |
FTP_PASS | 密码 | |
PASV_ADDRESS | 被动模式中返回客户端的ip | |
PASV_MIN_PORT | 被动模式中随机端口的下限 | |
PASV_MAX_PORT | 被动模式中随机端口的上限 |
docker run -d -v /ftp_data/:/home/vsftpd \
-p 20:20 -p 21:21 -p 21100-21110:21100-21110 \
-e FTP_USER=ftp -e FTP_PASS=metadoc \
-e PASV_ADDRESS=127.0.0.1 -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 \
--name vsftpd --restart=always fauria/vsftpd
由于云部署存在端口映射,所以被动模式中端口范围要与暴露的端口一致。例如测试云分配给你的端口是30010到30050,那么你选择给ftp server的端口是30010到30020,那么配置上下限时也要对应。
另外主动模式,客户端连接服务端的20端口,但是这个端口又存在映射,所以这种模式不可行。