FTP 是 File Transfer Protocol(文件传输协议)的英文简称,用于 Internet 上的文件的双向传输。使用 FTP 来传输时,是具有一定程度的危险性, 因为数据在因特网上面是完全没有受到保护的明文传输方式!
VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP, 从名称定义上基本可以看出,这是为了解决 ftp 传输安全性问题的。
VSFTP 特点
vsftp 程序的运行者一般是普通用户,降低了相对应进程的权限,提高了安全性。
任何需要执行较高权限的指令都需要配置许可。
ftp 所需要使用的绝大多数命令都被整合到了 vsftp 中,基本不需要系统额外提供命令。
拥有 chroot 功能,可以改变用户的根目录,限制用户只能在自己的家目录。
VSFTP 连接类型
控制连接(持续连接) → TCP 21(命令信道) → 用户收发FTP命令
数据连接(按需连接) → TCP 20(数据信道) → 用于上传下载数据
VSFTP 工作模式
主动模式
客户端向服务器的 ftp 端口(默认是 21)发送连接请求,服务器接受连接,建立一条命令链路;
当需要传送数据时,客户端在命令链路上用 port 命令告诉服务器:”我打开了 xxxx 端口,你过来连接我”;
于是服务器从 20 端口向客户端的 xxxx 端口发送连接请求,建立一条数据链路来传送数据。
被动模式
客户端向服务器的 ftp 端口(默认是 21)发送连接请求,服务器接受连接,建立一条命令链路;
当需要传送数据时,服务器在命令链路上用 pasv 命令告诉客户端:”我打开了 xxxx 端口,你过来连接我”;
于是客户端向服务器的 xxxx 端口发送连接请求,建立一条数据链路来传送数据。
优缺点
主动模式很容易受到防火墙的限制,因为大多数客户端都是在 NAT 环境中上网的,因此服务器无法向客户端的 xxx 端口发起连接;
被动模式则不会受到防火墙的限制,因为这就是一个普通的 NAT 操作,这是完全允许的,并且被动模式的安全性相对来说更高一些。
VSFTP 传输模式
VSFTP 相关软件名
服务端软件名:vsftpd
客户端软件名:ftp
服务名:vsftpd
端口号:20、21、指定范围内随机端口
# vsftp配置文件
/etc/vsftpd/vsftpd.conf
# PAM认证文件
/etc/pam.d/vsftpd
# 匿名用户默认目录
/var/ftp
# 匿名用户的下载目录
/var/ftp/pub
# 不能访问 ftp server 的用户列表
/etc/vsftpd/ftpusers
# 允许访问 ftp server 的用户列表
/etc/vsftpd/user_list
# ftp 的上传下载日志
/var/log/xferlog
VSFTP 登陆方式:在 vsftpd 服务器中支持匿名用户,本地用户,和虚拟用户3类用户账号,用途及区别如下:
# 安装 vsftpd
yum install -y vsftpd
# 检查|启动|停止|重启
service vsftpd status
service vsftpd start
service vsftpd stop
service vsftpd restart
# 设置开机自启动
systemctl enable vsftpd.service
# 让防火墙开启 FTP 服务和 21 端口的使用
firewall-cmd --add-service=ftp --permanent
firewall-cmd --reload
#备份配置文件
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
用户账号名称:ftp或anonymous
用户账号密码:无密码
工作目录:/var/ftp
默认权限:默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统,配置文件中配置上传权限,对该目录具有写权限。)
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
文件
# 是否允许匿名登录FTP服务器。
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
# 是否允许匿名用户上传文件,须将上面的write_enable设置为YES允许。
anon_upload_enable=YES
# 是否允许匿名用户创建新文件夹。
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
# 是否激活目录欢迎信息功能
dirmessage_enable=YES
# 如果启用此选项,系统将会维护记录服务器上传和下载情况的日志文件。
xferlog_enable=YES
# 从20号端口连接
connect_from_port_20=YES
# 如果启用此选项,传输日志文件将以标准xferlog的格式书写;
xferlog_std_format=YES
# 如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPV4连接请求。
listen=YES
# 设置PAM外挂模块提供的认证服务所使用的配置文件名;
pam_service_name=vsftpd
# 表明服务器使用tcp_wrappers作为主机访问控制方式;
tcp_wrappers=NO
# 启用 pasv 模式
pasv_enable=YES
# pasv 端口起始号
pasv_min_port=12000
# pasv 端口结束号
pasv_max_port=12199
# 修改权限
chown -R ftp /var/ftp/pub/
# 重启服务
service vsftpd restart
# 登陆
ftp://192.168.210.201/
用户账号名称:本地用户(/etc/passwd)
用户账号密码:用户密码(/etc/shadow)
工作目录:登录用户的宿主目录
权限:最大权限(drwx------)
创建虚拟用户用来代替本地用户,减少本地用户曝光率
使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制
能够设置严格的权限
# 是否允许匿名登录FTP服务器。
anonymous_enable=NO
# 是否允许本地用户(即linux系统中的用户帐号)登录FTP服务器,
# 默认设置为YES允许,本地用户登录后会进入用户主目录;
# 而匿名用户登录后进入匿名用户的下载目录/var/ftp;
# 若只允许匿名用户访问,前面加上#,可阻止本地用户访问FTP服务器。
local_enable=YES
# 是否允许本地用户对FTP服务器文件具有写权限,默认设置为YES允许。
write_enable=YES
# 设置本地用户的文件掩码为缺省022,
# 也可根据个人喜好将其设置为其他值。
local_umask=022
# 是否允许匿名用户上传文件,须将上面的write_enable设置为YES允许。
#anon_upload_enable=YES
# 是否允许匿名用户创建新文件夹。
#anon_mkdir_write_enable=YES
# 是否激活目录欢迎信息功能,
# 当用户用CMD模式首次访问服务器上某个目录时,FTP服务器将显示欢迎信息;
# 默认情况下,欢迎信息是通过该目录下的.message文件获得的,
# 此文件保存自定义的欢迎信息,由用户自己建立。
dirmessage_enable=YES
# 如果启用此选项,系统将会维护记录服务器上传和下载情况的日志文件;
# 默认情况该日志文件为/var/log/vsftpd.log,
# 也可以通过下面的xferlog_file选项对其进行设定。
xferlog_enable=YES
# 设定FTP服务器将启用FTP数据端口的连接请求,ftp-data数据传输,21为连接控制端口。
connect_from_port_20=YES
# 设定是否允许改变上传文件的属主,与下面一个设定项配合使用;
# 注意,不推荐使用root用户上传文件。
#chown_uploads=YES
# 设置想要改变的上传文件的属主,如果需要,则输入一个系统用户名;
# 例如可以把上传的文件都改成root属主。whoever:任何人。
#chown_username=whoever
# 设定系统维护记录FTP服务器上传和下载情况的日志文件,
# /var/log/vsftpd.log是默认的,也可以另设其它
#xferlog_file=/var/log/vsftpd.log
# 如果启用此选项,传输日志文件将以标准xferlog的格式书写;
# 该格式的日志文件默认为/var/log/xferlog,
# 也可以通过xferlog_file选项对其进行设定,默认值为NO
xferlog_std_format=YES
# 如果添加并启用此选项,将生成两个相似的日志文件;
# 默认在/var/log/xferlog和/var/log/vsftpd.log目录下;
# 前者是wu_ftpd类型的传输日志,可以利用标准日志工具对其进行分析,后者是vsftpd类型的日志。
#dual_log_enable
# 如果添加并启用此选项,则原本应该输出到/var/log/vsftpd.log中的日志,将输出到系统日志中。
#syslog_enable
# 设置数据传输中断间隔时间,此语句表示空闲的用户会话中断时间为600秒;
# 即当数据传输结束后,用户连接FTP服务器的时间不应超过600秒,可以根据实际情况对该值进行修改。
idle_session_timeout=600
# 设置数据连接超时时间,该语句表示数据连接超时时间为120秒,可根据实际情况对其个修改。
data_connection_timeout=120
# 运行vsftpd需要的非特权系统用户,缺省是nobody。
#nopriv_user=ftpsecure
# 如果FTPclient会下达“async ABOR”这个指令时,这个设定才需要启用;
# 而一般此设定并不安全,所以通常将其取消。
#async_abor_enable=YES
# 大多数FTP服务器都选择用ASCII方式传输数据,
# 将#去掉就能实现用ASCII方式上传文件。
#ascii_upload_enable=YES
# 将#去掉就能实现用ASCII方式下载文件
#ascii_download_enable=YES
# 将#去掉可设置登录FTP服务器时显示的欢迎信息,
# 可以修改=后的欢迎信息内容。
# 另外如在需要设置更改目录欢迎信息的目录下创建名为.message的文件,
# 并写入欢迎信息保存后,在进入到此目录会显示自定义欢迎信息。
#ftpd_banner=Welcome to blah FTP service.
# 可将某些特殊的email address抵挡住。
# 如果以anonymous登录服务器时,会要求输入密码,也就是您的email address;
# 如果很讨厌某些email address,就可以使用此设定来取消他的登录权限,但必须与下面的设置项配合。
#deny_email_enable=YES
# 当上面的deny_email_enable=YES时,可以利用这个设定项来规定那个email address不可登录vsftpd服务器。
# 此文件需用户自己创建,一行一个email address即可。
#banned_email_file=/etc/vsftpd/banned_emails
# 是否将所有用户限制在主目录,YES 为启用,NO 禁用。
# 为 YES 时,用户被锁定在自己的home目录中;
# 为 NO 时,用户登录FTP服务器后具有访问自己目录以外的其他文件的权限。
# vsftpd 将寻找 chroot_list 文件作为用户名单,此文件需用户建立。
chroot_local_user=YES
# 如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限。
# 下面这条命令将允许主目录继续保持写权限。
allow_writeable_chroot=YES
# 是否启动限制用户例外的名单,YES 为启用,NO 禁用。
chroot_list_enable=NO
# 此文件需自己建立,每行一个用户,
# 被列入此文件的用户,在登录后将不能切换到自己目录以外的其他目录,
# 由FTP服务器自动地chrooted到用户自己的home目录下;
# 使得chroot_list文件中的用户不能随意转到其他用户的FTPhome目录下,
# 从而有利于FTP服务器的安全管理和隐私保护。
# chroot_list_file=/etc/vsftpd/chroot_list
# 举例:
# 所有用户限制在主目录下,chroot_list 中的用户不受限制:
# [chroot_local_user=YES] & [chroot_list_enable=YES]
# 所有用户限制在主目录下,不启用 chroot_list:
# [chroot_local_user=YES] & [chroot_list_enable=NO]
# 所有用户不限制在主目录下,chroot_list 中的用户受限制:
# [chroot_local_user=NO] & [chroot_list_enable=YES]
# 指定用户登录后的ftp主目录。
local_root=/usr/share/nginx/www/
# 是否允许递归查询,大型站点的FTP服务器启用此项可以方便远程用户查询。
ls_recurse_enable=YES
# 如果设置为YES,则vsftpd将以独立模式运行,由vsftpd自己监听和处理IPV4连接请求。
listen=YES
# 设定是否支持IPV6
#listen_ipv6=YES
# 设置PAM外挂模块提供的认证服务所使用的配置文件名;
# 即/etc/pam.d/vsftpd文件;
# 此文件中file=/etc/vsftpd/ftpusers字段,
# 说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中。
pam_service_name=vsftpd
# 若此项设为YES,ftpusers 和 user_list 文件中的用户都允许登录FTP服务器;
# 若此项设为NO,ftpusers 中的用户禁止登录,user_list 中的用户允许登录;
userlist_enable=YES
# 仅当 userlist_enable=YES 时,userlist_deny 设置才有效。
# 若此项为YES,则 user_list 文件中的用户将不允许登录FTP服务器,
# 甚至连输入密码提示信息都没有,直接被FTP服务器拒绝。
#userlist_deny=YES
# 举例:
# ftpusers 中的用户禁止登录,user_list 中的用户无法登录(甚至连输入密码提示信息都没有,直接被FTP服务器拒绝)
# [userlist_enable=YES] & [userlist_deny=YES]
# ftpusers 中的用户禁止登录,user_list 中的用户可以登录
# [userlist_enable=YES] & [userlist_deny=NO]
# 表明服务器使用tcp_wrappers作为主机访问控制方式;
# tcp_wrappers可以实现linux系统中网络服务的基于主机地址的访问控制;
# 在/etc目录中的hosts.allow和hosts.deny两个文件用于设置tcp_wrappers的访问控制;
# 前者设置允许访问记录,后者设置拒绝访问记录。
# 例如想限制某些主机对FTP服务器192.168.57.2的匿名访问,
# 编缉/etc/hosts.allow文件,
# 如在下面增加两行命令:vsftpd:192.168.57.1:DENY 和vsftpd:192.168.57.9:DENY,
# 表明限制IP为192.168.57.1/192.168.57.9主机访问IP为192.168.57.2的FTP服务器,
# 此时FTP服务器虽可以PING通,但无法连接。
tcp_wrappers=YES
# 启用 pasv 模式
pasv_enable=YES
pasv_min_port=12000
pasv_max_port=12199
# 新建一个名为 ftper 的本地帐号,禁止登陆 shell
useradd -s /sbin/nologin ftper
# 为建好的 ftper 帐号设置密码
passwd ftper
# 因为账号禁止登录shell,所以还要修改pam文件
vim /etc/pam.d/vsftpd
auth required pam_nologin.so
# 重启vsftpd
systemctl restart vsftpd.service
vsftpd默认以匿名用户访问
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anonymous_enable=NO
# 重启服务
service vsftpd restart
匿名用户只有查看权限,无法创建、删除、修改,默认访问的FTP服务器端路径为:
/var/ftp/pub
如果允许匿名用户能够上传、下载、删除文件,需要修改配置文件
vim /etc/vsftpd/vsftpd.conf
#允许匿名用户上传文件;
anon_upload_enable=YES
#允许匿名用户创建目录
anon_mkdir_write_enable=YES
#允许匿名用户其他写入权限
anon_other_write_enable=YES
匿名用户完整配置文件代码如下:
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=NO
# 启用 pasv 模式
pasv_enable=YES
pasv_min_port=60000
pasv_max_port=60100
由于默认vsftpd匿名用户有两种:anonymous、ftp,如果需要上传文件、删除及修改等权限,需要ftp用户对/var/ftp/pub目录有写入权限,使用如下chown和chmod任意一种即可,设置命令如下:
# 修改权限
chown -R ftp /var/ftp/pub/
# 重启服务
service vsftpd restart
使用系统用户去登录ftp服务器。实现vsftpd系统用户登陆,只需在Linux系统中创建多个用户即可,创建用户使用useradd,同时给用户设置密码,即可通过用户和密码登录FTP,进行文件上传、下载、删除等操作。
# 添加用户
useradd ggftp
# 设置密码
passwd ggftp
# 修改配置文件
vim /etc/vsftpd/vsftpd.conf
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
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=NO