当前位置: 首页 > 工具软件 > War FTP > 使用案例 >

FTP和使用Docker搭建FTP服务

齐意致
2023-12-01

FTP和使用Docker搭建FTP服务

FTP

ftp即file transfer protocol文件传输协议,适用于文件传输的一个协议。

ftp有两个channel。

类型作用端口号
command channel命令端口,用于接受要执行命令21
data channel数据端口,用于传输数据20

FTP的主动模式和被动模式

ftp是cs结构,客户端连接服务端时可以选择以主动模式连接或者别动模式连接。

主动模式(active mode)

当客户端以主动模式连接客户端时,执行以下步骤,下述提到的随机端口N>1024:

  1. client随机选择一个端口N发送PORT(ip+N)指令给server的21端口。
  2. server发送ack给client端的N端口,连接建立。该连接用于命令传输。
  3. server端的20端口连接client的N+1端口。
  4. client发送ack给sever端的20端口,连接建立。该连接用于数据传输。

被动模式(passive mode)

当客户端以被动模式连接客户端时,执行以下步骤,下述提到的随机端口N>1024,R>1024:

  1. client随机选择一个端口N发送PASV(ip+N)指令给server的21端口。
  2. server选择一个随机端口R发送ack(ip+R)给client端的N端口,连接建立。该连接用于命令传输。
  3. client端的N+1端口连接sever的R端口。
  4. server发送ack给client端的N端口,连接建立。该连接用于数据传输。

区别和选择

可以看出来,主动模式下,server端使用20端口用于数据传输。被动模式下,server端使用随机端口进行数据传输。

模式client数据端口server数据端口主动性
主动模式随机20server端建立连接
被动模式随机随机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。

FTPS 和 SFTP

由于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部署ftp服务

上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端口,但是这个端口又存在映射,所以这种模式不可行。

 类似资料: