部署环境
操作系统: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
# 这三种都可以安全关闭连接
配置详解
心若向阳,无谓悲伤!