本文章介绍通过docker搭建的vsftpd实践,如有任何问题,请联系我,一起交流。
请访问git地址:
https://code.aliyun.com/jy1779/vsftpd.git

执行指令:

root@elk:/docker# git clone https://code.aliyun.com/jy1779/vsftpd.git

目录结构:

root@elk:/docker/vsftpd# ls 
conf  data  docker-compose.yml  Dockerfile  log  pam.d  sources.list
root@elk:/docker/vsftpd# tree -l
.
├── conf #宿主机目录,存放vsftpd所有配置文件,仅用于宿主机。
│   ├── vsftpd  #vsftpd配置文件目录,主要存放自定义脚本,虚拟用户配置文件,等等
│   │   ├── bin #自定义脚本目录
│   │   │   ├── add_vuser.sh #用于添加虚拟用户
│   │   │   ├── del_vuser.sh #用于删除虚拟用户
│   │   │   └── run_vsftpd.sh #用于运行vsftpd服务
│   │   ├── chroot_list #限制用户家目录
│   │   ├── user_config_dir #虚拟用户配置文件目录
│   │   │   └── jonny #虚拟用户配置文件
│   │   ├── user_list #限制虚拟用户访问,虚拟用户需要添加到该文件才可以访问
│   │   ├── v_user_password.db #虚拟用户验证文件
│   │   ├── v_user_password.txt #虚拟用户验证前文本
│   │   └── welcome.txt #登录vsftpd后显示欢迎信息
│   └── vsftpd.conf #vsftpd主配置文件
├── data #vsftpd挂载出来的根目录
│   └── jonny #虚拟用户家目录
│       └── test
├── docker-compose.yml  #docker-compose管理
├── Dockerfile #Dockerfile 构建
├── log #日志目录
│   ├── vsftpd.log 
│   └── xferlog
├── pam.d
│   └── vsftpd  #PAM验证 
└── sources.list

启动vsftpd(因为本地有镜像所以不需要拉取镜像)

root@elk:/docker/vsftpd# docker-compose up -d vsftpd
Creating vsftpd.1 ... 
Creating vsftpd.1 ... done
root@elk:/docker/vsftpd# docker-compose logs vsftpd
Attaching to vsftpd.1
vsftpd.1  | *************************************************
vsftpd.1  | *                                               *
vsftpd.1  | *                VSFTPD SERVER                  *
vsftpd.1  | *                                               *
vsftpd.1  | *************************************************
vsftpd.1  | ADD VIRTUAL USER
vsftpd.1  | ----------------
vsftpd.1  | · Default virtual user:
vsftpd.1  |   - username: jonny
vsftpd.1  |   - password: 123456
vsftpd.1  | · You can use the command "ftp localhost", enter the virtual user and password.
vsftpd.1  | · Add new Virtual user to /etc/vsftpd/bin/add_vuser.sh
vsftpd.1  | · Del Virtual user to /etc/vsftpd/bin/del_vuser.sh

登录ftp:

默认创建了一个虚拟用户:jonny,可以直接登录。

root@elk:/docker/vsftpd# ftp localhost
ftp: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
220-welcome to ftp !
220 
Name (localhost:jonny): jonny
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls  #查看该虚拟用户的家目录
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Jan 20 10:24 test  
226 Directory send OK.

添加用户:(添加用户需要进入容器内部运行指令或者在容器外部调用容器内部脚本)

root@elk:/docker/vsftpd# docker exec -it vsftpd.1 bash  #进入容器内部
root@elk:/srv/ftp# cd /etc/vsftpd/bin/  
root@elk:/etc/vsftpd/bin# ls
add_vuser.sh  del_vuser.sh  run_vsftpd.sh
root@elk:/etc/vsftpd/bin# ./add_vuser.sh jaye 123456   #执行脚本,两个参数,一个是新增的用户名,一个是密码
root@elk:/etc/vsftpd/bin# exit  #退出容器
exit
root@elk:/docker/vsftpd# ftp localhost   #使用新添加的虚拟用户登录
ftp: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
220-welcome to ftp !
220 
Name (localhost:jonny): jaye  
331 Please specify the password.
Password:
230 Login successful.   #登录成功
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls  #因为刚刚创建的虚拟用户,所以虚拟用户的家目录没有任何文件或目录
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
226 Directory send OK.

删除用户:(跟添加用户一样,进入容器内部或者在外部调用指令)

root@elk:/docker/vsftpd# docker exec -it vsftpd.1 bash
root@elk:/srv/ftp# cd /etc/vsftpd/bin
root@elk:/etc/vsftpd/bin# ls
add_vuser.sh  del_vuser.sh  run_vsftpd.sh
root@elk:/etc/vsftpd/bin# ./del_vuser.sh jaye   #删除虚拟用户,只需要一个参数,就是用户名
root@elk:/etc/vsftpd/bin# exit
exit
root@elk:/docker/vsftpd# ftp localhost 
ftp: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
220-welcome to ftp !
220  
Name (localhost:jonny): jaye   #这时已经登录不上了。
530 Permission denied.
Login failed.