部署环境
操作系统:Centos 7.4
软件版本:vsftpd 3.0
服务地址:192.168.1.112
工作原理
vsftpd工作原理分为主动模式与被动模式
- 主动模式:用来做数据连接,用来上传或者下载数据,不支持ftp命令;
- 被动模式:用来做命令连接,用来进行客户端与服务端之间进行命令传递;(包括数据的上传及下载)
主动模式(PORT)原理如下:
- 客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路;
- 当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了'N'端口,你过来连接我”;
- 于是服务器从20数据端口向客户端的'N'端口发送连接请求,建立一条数据链路来传送数据。
被动模式(PASV)原理如下:
- 客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
- 当需要传送数据时,服务器在命令链路上用PASV命令告诉客户端:“我打开了'N'端口,你过来连接我”。
- 于是客户端向服务器的'N'端口发送连接请求,建立一条数据链路来传送数据。
主动模式与本地用户
1、关闭selinux
sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config sh-4.2# reboot # 一定要重启,已经不知道第几次在这个玩意上吃亏了
2、卸载防火墙
sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps
3、配置本地源
sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/ sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ; sh-4.2# cat /etc/yum.repos.d/GuGe.repo [GuGe] name=GuGe baseurl=file:///media gpgcheck=0 enable=1 sh-4.2# yum clean all sh-4.2# yum makecache all
4、安装程序
sh-4.2# yum -y install vsftpd
5、配置程序
sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak sh-4.2# vi /etc/vsftpd/vsftpd.conf # 将主配置文件中内容替换成如下内容 anonymous_enable=NO local_enable=YES write_enable=YES chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list allow_writeable_chroot=YES local_umask=022 reverse_lookup_enable=NO dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES pasv_enable=NO xferlog_std_format=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES sh-4.2# touch /etc/vsftpd/chroot_list sh-4.2# useradd -s /sbin/nologin -d /test test sh-4.2# echo 'password' | passwd --stdin test
6、启动测试
sh-4.2# systemctl start vsftpd sh-4.2# systemctl enable vsftpd
注解:因为这里是用主动模式,只能进行上传下载,并且不支持被动命令;我这里采用windows 下面的filezlia客户端进行测试;filezlia下载地址:https://filezilla-project.org/download.php?type=client
主动模式与匿名用户
1、关闭selinux
sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config sh-4.2# reboot # 一定要重启,已经不知道第几次在这个玩意上吃亏了
2、卸载防火墙
sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps
3、配置本地源
sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/ sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ; sh-4.2# cat /etc/yum.repos.d/GuGe.repo [GuGe] name=GuGe baseurl=file:///media gpgcheck=0 enable=1 sh-4.2# yum clean all sh-4.2# yum makecache all
4、安装程序
sh-4.2# yum -y install vsftpd
5、配置程序
sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak sh-4.2# vi /etc/vsftpd/vsftpd.conf anonymous_enable=YES local_enable=YES write_enable=YES chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list allow_writeable_chroot=YES reverse_lookup_enable=NO local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES # 匿名登录不能关闭被动模式,即时是主动模式的情况下面; #pasv_enable=NO xferlog_std_format=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES sh-4.2# touch /etc/vsftpd/chroot_list sh-4.2# usermod -d /appl/ftp/pub/ ftp # 匿名用户通过ftp用户来设置 sh-4.2# mkdir -p /appl/ftp/pub/ # 匿名用户的家目录需要手动创建 sh-4.2# chown -R ftp.ftp /appl/ftp/pub/ # 手动授权 sh-4.2# chmod -R a-w /appl/ftp/pub/ # 匿名用户登录,不能设置写入权限 sh-4.2# useradd -s /sbin/nologin -d /test test # 匿名用户与本地用户可以同时使用 sh-4.2# echo 'password' | passwd --stdin test
6、启动测试
sh-4.2# systemctl start vsftpd.service sh-4.2# touch /appl/ftp/pub/test sh-4.2# chown -R ftp.ftp /appl/
被动模式与本地用户
1、关闭selinux
sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config sh-4.2# reboot # 一定要重启,已经不知道第几次在这个玩意上吃亏了
2、卸载防火墙
sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps
3、配置本地源
sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/ sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ; sh-4.2# cat /etc/yum.repos.d/GuGe.repo [GuGe] name=GuGe baseurl=file:///media gpgcheck=0 enable=1 sh-4.2# yum clean all sh-4.2# yum makecache all
4、安装程序
sh-4.2# yum -y install vsftpd
5、配置程序
sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak sh-4.2# vi /etc/vsftpd/vsftpd.conf reverse_lookup_enable=NO anonymous_enable=NO local_enable=YES write_enable=YES chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list allow_writeable_chroot=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=NO pasv_enable=YES pasv_min_port=1024 pasv_max_port=65536 xferlog_std_format=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES sh-4.2# touch /etc/vsftpd/chroot_list sh-4.2# useradd -s /sbin/nologin -d /test test sh-4.2# echo 'password' | passwd --stdin test
6、启动测试
sh-4.2# systemctl start vsftpd.service
被动模式与匿名用户
1、关闭selinux
sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config sh-4.2# reboot # 一定要重启,已经不知道第几次在这个玩意上吃亏了
2、卸载防火墙
sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps
3、配置本地源
sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/ sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ; sh-4.2# cat /etc/yum.repos.d/GuGe.repo [GuGe] name=GuGe baseurl=file:///media gpgcheck=0 enable=1 sh-4.2# yum clean all sh-4.2# yum makecache all
4、安装程序
sh-4.2# yum -y install vsftpd
5、配置程序
sh-4.2# cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak sh-4.2# vi /etc/vsftpd/vsftpd.conf reverse_lookup_enable=NO anonymous_enable=YES local_enable=YES write_enable=YES chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list allow_writeable_chroot=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=NO pasv_enable=YES pasv_min_port=1024 pasv_max_port=65536 xferlog_std_format=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES sh-4.2# touch /etc/vsftpd/chroot_list sh-4.2# usermod -d /appl/ftp/pub/ ftp sh-4.2# mkdir -p /appl/ftp/pub/ sh-4.2# chown -R ftp.ftp /appl/ftp/pub/ sh-4.2# chmod -R a-w /appl/ftp/pub/ sh-4.2# useradd -s /sbin/nologin -d /test test sh-4.2# echo 'password' | passwd --stdin test
6、启动测试
sh-4.2# systemctl restart vsftpd.service
主动模式与虚拟用户
1、关闭selinux
sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config sh-4.2# reboot # 一定要重启,已经不知道第几次在这个玩意上吃亏了
2、卸载防火墙
sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps
3、配置本地源
sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/ sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ; sh-4.2# cat /etc/yum.repos.d/GuGe.repo [GuGe] name=GuGe baseurl=file:///media gpgcheck=0 enable=1 sh-4.2# yum clean all sh-4.2# yum makecache all
4、安装程序
sh-4.2# yum -y install vsftpd pam* libdb-utils libdb* vsftpd: FTP服务程序 libdb: 虚拟用户生成程序 pam: 虚拟用户验证模块
5、配置程序
sh-4.2# vi /etc/vsftpd/vsftpd sh-4.2# cat /etc/vsftpd/vsftpd admin admin # /etc/vsftpd/vsftpd是虚拟用户配置文件,奇行是用户,偶行是密码 sh-4.2# db_load -T -t hash -f /etc/vsftpd/vsftpd /etc/vsftpd/vsftpd_login.db # /etc/vsftpd/vsftpd_login.db虚拟用户验证文件,不要和配置文件名字重叠 sh-4.2# vi /etc/pam.d/vsftpd sh-4.2# cat /etc/pam.d/vsftpd #%PAM-1.0 auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login # 被加行 account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login # 被加行 session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed auth required pam_shells.so auth include password-auth account include password-auth session required pam_loginuid.so session include password-auth # /lib64/security/pam_userdb.so是64位操作系统的位置,32位操作系统请自行查找位置 sh-4.2# useradd -s /sbin/nologin -M xiao sh-4.2# vi /etc/vsftpd/vsftpd.conf sh-4.2# cat /etc/vsftpd/vsftpd.conf reverse_lookup_enable=NO anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES pasv_enable=NO xferlog_std_format=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES chroot_local_user=YES allow_writeable_chroot=YES guest_enable=YES guest_username=xiao virtual_use_local_privs=YES user_config_dir=/etc/vsftpd/vsftpd_user_conf sh-4.2# touch /etc/vsftpd/chroot_list sh-4.2# mkdir -p /etc/vsftpd/vsftpd_user_conf # 目录用来控制虚拟用户的权限及家目录 sh-4.2# vi /etc/vsftpd/vsftpd_user_conf/admin sh-4.2# cat /etc/vsftpd/vsftpd_user_conf/admin local_root=/ftp/admin write_enable=YES anon_world_readable_only=YES anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES sh-4.2# mkdir -p /ftp/admin sh-4.2# chown -R xiao.xiao /ftp/ sh-4.2# usermod -d /ftp/ xiao # 所有虚拟用户都需要一个本地用户进行映射
6、启动测试
sh-4.2# systemctl restart vsftpd.service
被动模式与虚拟用户
1、关闭selinux
sh-4.2# sed -i 's/enforcing/disabled/' /etc/selinux/config sh-4.2# reboot # 一定要重启,已经不知道第几次在这个玩意上吃亏了
2、卸载防火墙
sh-4.2# rpm -qa | grep "firewall" | xargs rpm -e --nodeps sh-4.2# rpm -qa | grep "iptables" | xargs rpm -e --nodeps
3、配置本地源
sh-4.2# mount -t iso9660 -o loop /opt/CentOS-7-x86_64-Everything-1708.iso /media/ sh-4.2# find /etc/yum.repos.d/ -ignore_readdir_race -type f -exec mv {} /etc/yum.repos.d/back/ ; sh-4.2# cat /etc/yum.repos.d/GuGe.repo [GuGe] name=GuGe baseurl=file:///media gpgcheck=0 enable=1 sh-4.2# yum clean all sh-4.2# yum makecache all
4、安装程序
sh-4.2# yum -y install vsftpd pam* libdb-utils libdb* vsftpd: FTP服务程序 libdb: 虚拟用户生成程序 pam: 虚拟用户验证模块
5、配置程序
sh-4.2# vi /etc/vsftpd/vsftpd sh-4.2# cat /etc/vsftpd/vsftpd admin admin # /etc/vsftpd/vsftpd是虚拟用户配置文件,奇行是用户,偶行是密码 sh-4.2# db_load -T -t hash -f /etc/vsftpd/vsftpd /etc/vsftpd/vsftpd_login.db # /etc/vsftpd/vsftpd_login.db虚拟用户验证文件,不要和配置文件名字重叠 sh-4.2# vi /etc/pam.d/vsftpd sh-4.2# cat /etc/pam.d/vsftpd #%PAM-1.0 auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login # 被加行 account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login # 被加行 session optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed auth required pam_shells.so auth include password-auth account include password-auth session required pam_loginuid.so session include password-auth # /lib64/security/pam_userdb.so是64位操作系统的位置,32位操作系统请自行查找位置 sh-4.2# useradd -s /sbin/nologin -M xiao sh-4.2# vi /etc/vsftpd/vsftpd.conf sh-4.2# cat /etc/vsftpd/vsftpd.conf reverse_lookup_enable=NO anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=NO pasv_enable=YES pasv_min_port=1024 pasv_max_port=1028 xferlog_std_format=YES listen=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES chroot_local_user=YES allow_writeable_chroot=YES guest_enable=YES guest_username=xiao virtual_use_local_privs=YES user_config_dir=/etc/vsftpd/vsftpd_user_conf sh-4.2# touch /etc/vsftpd/chroot_list sh-4.2# mkdir -p /etc/vsftpd/vsftpd_user_conf # 目录用来控制虚拟用户的权限及家目录 sh-4.2# vi /etc/vsftpd/vsftpd_user_conf/admin sh-4.2# cat /etc/vsftpd/vsftpd_user_conf/admin local_root=/ftp/admin write_enable=YES anon_world_readable_only=YES anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES sh-4.2# mkdir -p /ftp/admin sh-4.2# chown -R xiao.xiao /ftp/ sh-4.2# usermod -d /ftp/ xiao # 所有虚拟用户都需要一个本地用户进行映射
6、启动测试
sh-4.2# systemctl restart vsftpd.service
经典错误
错误一:530 Login incorrect
通过查看/var/logs/secure发现有如下面的错误:
pam_userdb(vsftpd:auth): user_lookup: could not open database `/etc/vsftpd/vsftpd_login.db': No such file or directory
到/etc/vsftpd查看下加密过的认证文件,发现为vsftpd.login.db ,错把 "_" 写成了点 ,重命名该文件,问题解决。不过该问题还有可能是因为/etc/vsftpd.conf中没有加入pam_service_name=vsftpd 或 /etc/pam.d/vsftpd文件认证配置不正确引起的,需要在该文件后加入下面的两行。
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftpd_login
注:如果是32位系统,上面的lib64需要换成lib ,最后的认证文件vsftpd_login后面没有".db" ,系统会自动增加的 。如果加上 ".db" 将会出错 。还可以参考这篇文档:https://www.jianshu.com/p/91c7d4a115e0
错误二:500 OOPS: cannot change directory错误 。
selinux未关闭
参考文档:http://www.361way.com/ftp-error/1832.html
错误三:530 pam_unix(vsftpd:auth): check pass; user unknown
pam_unix(vsftpd:auth): check pass; user unknown pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=anonymous rhost=192.168.10.138
上述内容中明显可以看到是pam验证密码失败了,530基本基本就是密码验证失败的意思,解决办法如下:
vi /etc/pam.d/vsftpd ession optional pam_keyinit.so force revoke auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed #auth required pam_shells.so # 上面这一行原本是没有注释的,解决的办法就是注释掉这一行 auth include password-auth account include password-auth session required pam_loginuid.so session include password-auth
这个问题是Centos 7.4以上版本才会出现的,应该是因为vsftpd版本与Centos 7.4以上版本的模块不兼容的原因导致的
参考文档来自于谷歌搜索:https://www.4spaces.org/ftp-login-error-530-solved/
错误四:完事具备,就是不行
试试用明文
相关日志
/var/log/xferlog:上传下载日志
/var/log/secure:验证日志
/var/log/message:启动运行日志
相关命令
登录ftp
sh-4.2# ftp 192.168.21.49 Connected to 192.168.21.49 (192.168.21.49). 220 (vsFTPd 3.0.2) Name (192.168.21.49:root): Technical 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files.
列出目录
ftp> ls 227 Entering Passive Mode (192,168,21,49,187,163). 150 Here comes the directory listing.-rw-r--r-- 1 1001 1001 21 Jul 16 10:29 readme
drwxr-xr-x 19 1001 1001 4096 Nov 26 07:22 tm ... 226 Directory send OK.
切换ftp目录
ftp> cd tm 250 Directory successfully changed.
切换ftp本地接收目录
ftp> lcd /tmp Local directory now /tmp
下载文件
ftp> get 账户口令台账.xlsx local: 账户口令台账.xlsx remote: 账户口令台账.xlsx 227 Entering Passive Mode (192,168,21,49,78,254). 150 Opening BINARY mode data connection for 账户口令台账.xlsx (16577 bytes). 226 Transfer complete. 16577 bytes received in 0.000662 secs (25040.79 Kbytes/sec)
多个下载文件
mget *.xls
# 我打算下载所有以 .xls 结尾的文件,mget支持通配符
上传文件
ftp> put aaa local: aaa remote: aaa 227 Entering Passive Mode (192,168,21,49,135,102). 150 Ok to send data. 226 Transfer complete. 8 bytes sent in 2.9e-05 secs (275.86 Kbytes/sec)
上传多个文件
mput *.xls
关闭连接
bye
exit
quit
# 这三种都可以安全关闭连接