在使用FTP时,如果客户端机器和FTP服务器双方之间的所有端口都是开放的,那连接不存在问题。如果客户端与服务器之间有防火墙,如果没配置好防火策略和采用合适的连接模式,会导致登录成功,但无法List列表的问题。要避免出现这样的问题,首先要了解FTP的工作模式。

1.FTP的PORT(主动模式)和PASV(被动模式)

(1) PORT(主动模式)

PORT中文称为主动模式,工作的原理: FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,客户端随机开放一个端口(1024以上),发送 PORT命令到FTP服务器,告诉服务器客户端采用主动模式并开放端口;FTP服务器收到PORT主动模式命令和端口号后,通过服务器的20端口和客户端开放的端口连接,发送数据,原理如下图:
(2) PASV(被动模式)

PASV是Passive的缩写,中文成为被动模式,工作原理:FTP客户端连接到FTP服务器的21端口,发送用户名和密码登录,登录成功后要list列表或者读取数据时,发送PASV命令到FTP服务器, 服务器在本地随机开放一个端口(1024以上),然后把开放的端口告诉客户端, 客户端再连接到服务器开放的端口进行数据传输,原理如下图:

1.docker拉取ftp镜像

docker pull fauria/vsftpd

2.启动ftp镜像

docker run -d -p 2121:21 -p 2020:20 -p 21100-21110:21100-21110 \
-v /var/ftp:/home/vsftpd \
-e FTP_USER=ftp \
-e FTP_PASS=123456 \
-e PASV_ADDRESS=xxx.xxx.xxx.xxx\
-e PASV_MIN_PORT=21100 \
-e PASV_MAX_PORT=21110 \
--name vsftpd \
--restart=always fauria/vsftpd

如果是主机模式则不用映射端口,完全依赖主机端口

docker run -d --net=host \
-v /var/ftp:/home/vsftpd \
-e FTP_USER=ftp \
-e FTP_PASS=123456 \
-e PASV_ADDRESS=xxx.xxx.xxx.xxx\
-e PASV_MIN_PORT=21100 \
-e PASV_MAX_PORT=21110 \
--name vsftpd \
--restart=always fauria/vsftpd

参数解释:

-p 2121:21 -p 2020:20  映射daocker和宿主机的端口号,通过ftp客户端,连接宿主机的2121端口,可以连接ftp服务器。2020端口,为docker映射到宿主机的数据传输端口。

PASV_ADDRESS填写服务器的IP地址,被动模式会把该地址告知给客户端(其他机器能访问到,云服务器则用公网IP,局域网地址则用局域网IP,不能用127.0.0.1,否则只能主动模式能用,被动模式无法链接)