安装vsftpd
yum install vsftpd -y
# -y 参数表示全部默认 yes,不用手动确认。
# vsftpd简介:
vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、BSD、Solaris、 HP-UNIX等系统上面,是一个完全免费的、开放源代码的ftp服务器软件,支持很多其他的 FTP 服务器所不支持的特征。比如:非常高的安全性需求、带宽限制、良好的可伸缩性、可创建虚拟用户、支持IPv6、速率高等。 [2]
vsftpd是一款在Linux发行版中最受推崇的FTP服务器程序。特点是小巧轻快,安全易用。
在开源操作系统中常用的FTPD套件主要还有ProFTPD、PureFTPd和wuftpd等
设置为开机自启
systemctl start vsftpd # 开启vsftpd服务,或者用 service vsftpd start 命令 systemctl enable vsftpd # 设置为开机自启动
检查是否成功设置开机自启
# systemctl list-unit-files 用于列出所有配置文件
systemctl list-unit-files | grep vsftpd
# 输出 enable 表示开机自启
vsftpd.service enabled
ftp的连接方式
主动模式:客户端告诉服务器自己监听的端口(随机端口>1024),从而服务器主动连接客户端。连接成功后(用户登录成功),客户端的随机端口 与 服务器的20端口 传输数据。
被动模式:客户端告诉服务器自己处于被动模式,服务器告诉客户端自己正在监听的端口(随机端口>1024),从而客户端去连接服务端。
全局配置
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
userlist_enable=YES
tcp_wrappers=YES
# ***************虚拟用户***************
guest_enable=YES
guest_username=zhwftplogin
pam_service_name=/etc/pam.d/vsftpd
chroot_local_user=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
userlist_deny=YES
xferlog_file=/var/log/vsftpd.log
# *******************************************
编辑pam认证文件(修改前先备份)做修改的只有两行配置(步骤5提到的pam_service_name=/etc/pam.d/vsftpd)。
# 备份
cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd_bak
vim /etc/pam.d/vsftpd
# 注释其他,这种方式,只有虚拟用户能登录,普通用户不能登录
auth required pam_userdb.so db=/etc/vsftpd/vsftp_user
account required pam_userdb.so db=/etc/vsftpd/vsftp_user
# 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
-------------------------------------------------------------------------
# 如果你想让普通用户也能登录ftp服务器那么就不用注释其他,把required 改为 sufficient。其他不用改。如下:
#%PAM-1.0
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftp_user
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vsftp_user
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
编辑虚拟用户的用户账户的数据库文件(6步骤中提到的/etc/vsftpd/vsftp_user)
vim vsftp_user.txt.txt
# 单数行是账号,双数行是密码,以此类推。可以增加多个虚拟用户
test
Zhw123456
# 使用 db_load 生成数据库文件
db_load -T -t hash -f vsftp_user.txt vsftp_user.db
# 步骤 6 中不用写后缀使用,直接是 /etc/vsftpd/vsftp_user
# 删除 vsftp_user.txt
rm -rf vsftp_user.txt
配置虚拟用户权限(步骤5提到的 user_config_dir=/etc/vsftpd/vsftpd_user_conf)
# 新建文件vsftpd_user_conf
mkdir /etc/vsftpd/vsftpd_user_conf
# 新建与虚拟用户名相同的文件
vim /etc/vsftpd/vsftpd_user_conf/test
----------------------------------------------------
write_enable=YES
# 他为YES时候,文件的其他人必须有读的权限才允许下载
anon_world_readable_only=NO
# 上传权限
anon_upload_enable=YES
# 新建目录权限
anon_mkdir_write_enable=YES
# 修改目录及文件的权限 ---usr设置为NO不允许更改文件,admin设置为YES可以更改文件
anon_other_write_enable=YES
# 该用户的根目录 ---可以随意设置位置
local_root=/srv/ftp
# 再次设置群组,-R 表示将该目录及该目录下的所有文件都设置成 root:root
chown -R root:root /etc/vsftpd/vsftpd_user_conf
-------------------------------------------------------
# 因为我这边创建好尝试登录报了以下错误:
[root@localhost vsftpd_user_conf]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): test
331 Please specify the password.
Password:
500 OOPS: config file not owned by correct user, or not a file
Login failed.
421 Service not available, remote server has closed connection
# 再次修改群组后,测试登录成功
[root@localhost vsftpd_user_conf]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): test
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
创建虚拟用户映射的普通用户(步骤5提到的guest_username=zhwftplogin)
# -d <登入目录> 指定用户登入时的起始目录。
# -s <shell> 指定用户登入后所使用的shell。nologin没有登录权限
# 要拒绝系统用户登录,可以将其 shell 设置为 /usr/sbin/nologin 或者 /bin/false。
useradd -d /home/firstftp/ -s /usr/sbin/nologin zhwftplogin
大功告成,可以试一下登录ftp服务器。
--------------------------------------------------------------
/usr/sbin/nologin、/bin/false区别
# /bin/false 什么也不做只是返回一个错误状态,然后立即退出。将用户的 shell 设置为 /bin/false,用户会无法登录,并且不会有任何提示。
# nologin 会礼貌的向用户显示一条信息,并拒绝用户登录:
This account is currently not available.
配置文件解释:
参数配置 默认值 说明
anonymous_enable=YES YES 是否用于匿名用户(ftp或anonymous)登录FTP,登录后进入/var/ftp
local_enable=YES NO 是否允许本地用户登录FTP服务器,登录后进入用户主目录
write_enable=YES NO 是否允许写入
local_umask=022 077 默认的umask码
anon_upload_enable=YES NO 是否允许匿名用户上传文件。如果此项要生效,则配置 write_enable必须激活。并且匿名用户所在相关目录有写权限。
anon_mkdir_write_enable=YES NO 是否允许匿名用户创建新目录。如果此项要生效,则配置write_enable必须激活。并且匿名用户所在相关目录有写权限。
dirmessage_enable=YES NO 是否激活目录欢迎信息功能。.message文件可以通过更改message_file来调整。
xferlog_enable=YES NO 是否启动记录上传和下载日志。
connect_from_port_20=YES 20 设定PORT模式下的连接端口(只要connect_from_port_20被激活)。
chown_uploads=YES NO 设定是否允许改变上传文件的属主,与下面一个设定项配合使用
chown_username=whoever ROOT 置想要改变的上传文件的属主,如果需要,则输入一个系统用户名,例如可以把上传的文件都改成root属主。whoever:任何人
xferlog_file=/var/log/xferlog /var/log/xferlog 设置日志文件的文件名和存储路径
xferlog_std_format=YES NO 是否使用标准的ftpd xferlog日志文件格式
idle_session_timeout=600 300 设置空闲的用户会话中断时间,默认是10分钟
data_connection_timeout=120 300 设置数据连接超时时间,默认是120秒
nopriv_user=ftpsecure nobody 运行vsftpd需要的非特权系统用户
async_abor_enable=YES NO 是否允许运行特殊的ftp命令async ABOR。
ascii_upload_enable=YES ascii_download_enable=YES NO 是否使用ascii码方式上传和下载文件。
deny_email_enable=YES banned_email_file=/etc/vsftpd/banned_emails NO 禁止匿名用户通过banned_email_file定义的邮件地址做密码
chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list NO 设置为NO时,用户登录FTP后具有访问自己目录以外的其他文件的权限;设置为YES时,chroot_list_file中的用户列表被锁定在自己的home目录下。此时chroot_local_user=NO,如果chroot_local_user=YES则chroot_list_file中的用户将不被锁定在home目录下。
ls_recurse_enable=YES NO 是否允许递归查询
listen=YES NO vsftpd 处于独立启动模式
listen_ipv6=YES NO 是否支持IPV6
pam_service_name=vsftpd ftp 设定vsftpd将要用到的PAM服务的名字。
userlist_enable=YES NO 设置为YES,vsftpd将读取userlist_file参数所指定的文件中的用户列表。当列表中的用户登录FTP服务器时,该用户在提示输入密码之前就被禁止了。即该用户名输入后,vsftpd查到该用户名在列表中,vsftpd就直接禁止掉该用户,不会再进行询问密码等后续步聚
userlist_deny=YES YES 决定禁止还是只允许由userlist_file指定文件中的用户登录FTP服务器。此选项在userlist_enable 选项启动后才生效。YES,默认值,禁止文件中的用户登录,同时也不向这些用户发出输入密码的提示。NO,只允许在文件中的用户登录FTP服务器
userlist_file /etc/vsftpd/user_list 当userlist_enable被激活,系统将去这里调用文件。
t cp_wrappers=YES NO 是否允许tcp_wrappers管理
listen_port 21 如果vsftpd处于独立运行模式,这个端口设置将监听的FTP连接请求。
max_clients 0 FTP的最大连接数,0为无限制。
max_per_ip 0 单个IP的最大连接数。
anon_max_rate 0 匿名用户允许的最大传输速度,单位:字节/秒
local_max_rate 0 本地认证用户允许的最大传输速度,单位:字节/秒。
相关文件说明
# 主配置文件
/etc/vsftpd/vsftpd.conf
# Vsftpd的主程序。
/usr/sbin/vsftpd
# PAM认证文件(此文件中file=/etc/vsftpd/ftpusers字段,指明阻止访问的用户来自/etc/vsftpd/ftpusers
/etc/pam.d/vsftpd
# 禁止使用vsftpd的用户列表文件。记录不允许访问FTP服务器的用户名单,管理员可以把一些对系统安全有威胁的用户账号记录在此文件中,以免用户从FTP登录后获得大于上传下载操作的权利,而对系统造成损坏。
/etc/vsftpd/ftpusers
# 禁止或允许使用vsftpd的用户列表文件。这个文件中指定的用户缺省情况(即在/etc/vsftpd/vsftpd.conf中设置userlist_deny=YES)下也不能访问FTP服务器,在设置了userlist_deny=NO时,仅允许user_list中指定的用户访问FTP服务器。
/etc/vsftpd/user_list
# vsftpd的匿名用户登录根目录。
/var/ftp