一、FTP简介
1、ftp 概述
FTP:(file transfer protocol文件传输协议)是典型的C/S 结构的应用层协议,需要由服务端软件,客户端软件两个部分共同实现文件传输共能。
2、FTP连接及传输模式
FTP服务器默认使用TCP协议的20,21端口与客户端进行通信,20端口用于建立数据连接,并传输文件数据,21端口用于建立控制连接,并传输FTP控制命令。根据FTP服务器在建立数据连接过程中的主,被动关系,FTP数据连接分为主动模式和被动模式,两者的含义及主要区别如下:
主动模式 | 服务器主动发起数据连接,首先由客户端向服务端的21端口建立FTP控制连接,当需要传输数据时,客户端以PORT命令告知服务器“我打开了某端口,你过来连接我”于是服务器从20端口向客户端德该端口发送请求建立数据连接 |
被动模式 | 服务器被动等待数据连接。如果客户机所在网络的防火墙禁止主动模式连接,通常会使用被动模式,首先由客户端向服务端的21端口建立FTP控制连接,当需要传属数据时,服务器以PASV命令告知客户端“我打开了某端口。你过来连接我”于是客户端向服务器的该端口(随机端口)发送请求建立数据连接 |
客户端与服务器建立好数据连接以后,就可以根据从控制连接中发送的FTP命令上传或下载文件了。在传输文件时,根据是否进行字符转换,分为文本模式和二进制模式:
文本模式 | 又称为ASCII(american standard code for information interchange美国信息交换标准码)模式,这种模式在传输文件时使用ASCII标准字符序列,一般只用于纯文本文件的传输。 |
二进制模式 | 又称为Binary模式,这种模式不会转换文件中的字符序列更适合传输程序,图片等非文本字符的文件 |
使用二进制模式比文本模式更有效,大多数FTP客户段工具可以分局文件类型自动选择文件传输模式,而无需用户手工指定。
3、FTP用户类型:
匿名用户 | 使用FTP客户端软件访问服务器时,通常要用到一类特殊的用户帐号,其用户名为ftp或anonymous,提供任意密码都可以通过服务器的验证,这样的用户称为匿名用户。匿名用户一般用于提供公共文件的下载,如提供一些免费软件,学习资料的下载的站点。 |
本地用户 | FTP服务器还可以直接使用本机的系统用户账号进行验证,这些用户被称为本地用户。在RHEL5中匿名用户对应的系统用户帐号“ftp”但对于vsftp服务来说,本地用户指的是除了匿名用户以外的其他系统用户。 |
虚拟用户 | 有些FTP服务器软件还可以维护一份独立的用户数据库文件,而不是直接使用系统用户帐号,这些位于独立数据库文件中的FTP用户帐号,通常被称为“虚拟用户”通过使用虚拟用户,将FTP账户与Linux系统用户关联性降至最低。可以为系统提供安全性。 |
FTP服务器软件的种类
Windows | 常见的FTP服务器软件包括IIS,Serv-U等 |
Linux | Proftpd, pureftpd, vsftpd 等 |
FTP客户端工具的种类
Windows | cuteFTP, flashFXP, filezilla |
Linux | Gftp, kuftp |
二、安装vsftp
可以到https://pkgs.org/download/vsftpd下载适合自己的软件版本,通过RPM方式安装的vsftpd软件包,将会自动添加名为vsftpd的系统服务,因此启动,停止vsftpd服务变得非常方便。这里使用yum进行安装。
1、检查本机是否安装了vsftpd
[root@app ~]# rpm -qa | grep vsftpd
如果没有安装,使用yum进行安装。
[root@app ~]# yum install vsftpd -y
安装完成后验证是否安装成功
[root@app ~]# systemctl start vsftpd [root@app ~]# vsftpd -v # 查看vsftpd的版本 vsftpd: version 3.0.2
2、常用配置选项:
选项 |
解释 |
background=YES | 启用后,vsftpd以“监听”模式启动,vsftpd将后台监听程序。 |
chmod_enable=YES | 启用后,允许使用SITE CHMOD命令。仅适用于本地用户。 不适用于匿名用户 |
delete_failed_uploads=NO | 启用后,所有上传失败的文件都被删除。 |
download_enable=YES | 如果为NO 将拒绝所有下载请求 |
allow_anon_ssl=NO | 仅当本机启用了ssl协议时生效,如果启用允许匿名用户使用ssl的方式进行连接 |
ide_ids=NO | 启用后,所有文件夹,文件的用户和组信息都是ftp |
syslog_enable=NO | 启用后,所有的输出将被写入/var/log/vsftpd.log |
deny_file = none | 限制文件类型,如:deny_file={*.mp3,*.mov,.private} |
accept_timeout=60 | 客户端与服务端建立连接的时间(单位:秒) |
connect_from_port_20=YES | FTP数据传输端口,默认20 |
idle_session_timeout=60 | 60秒后无操作断开会话 |
data_connection_timeout=120 | 数据传输超时120秒 |
anon_max_rate=0 | 匿名用户的最大数据传输速率(单位:字节/秒) |
local_max_rate=0 | 本地用户的最大数据传输速率(单位:字节/秒) |
connect_timeout=60 | 建立数据连接超时时间(单位:秒) |
file_open_mode=0666 | 上传文件的权限 |
max_clients=2000 | 客户端的连接数量 |
max_login_fails=3 | 登录3次失败后,会话将被终止 |
max_per_ip=3 | 一个IP地址可以启用3个客户端连接FTP服务器,如果超过3个会报错,0表示没有限制 |
pasv_enable=YES | 启用被动模式 |
pasv_max_port=24600 | PASV被动模式最大端口号 |
pasv_min_port=24500 | PASV被动模式最小端口号 |
pasv_addr_resolve=NO | 启用后,使用主机名的方式访问服务器 |
port_enable=YES | 如果不想使用PORT的方式进行数据连接,请设置为NO |
hide_file=none | 隐藏文件hide_file={*.mp3,.hid‐den,hide*,h?} |
user_config_dir=none | 为每个用户设置独立配置文件的目录,如user_config_dir=/etc/vsftpd/user_conf,当使用test用户登录后系统会尝试到/etc/vsftpd/user_conf/test中读取配置。所以我们可以在test中为用户单独设置。 |
ftp_username=ftp | 匿名登录的用户 |
guest_enable=NO | 启用后,所有匿名用户登录都被视为guest用户(启用虚拟用户) |
guest_username=ftp | 这个用户名会被应用到guest_enable选项,(启用虚拟用户后,用于指定映射的本地用户) |
anonymous_enable=YES | 允许匿名用户使用ftp和anonymous访问FTP服务器 |
anon_upload_enable=NO | 匿名用户上传文件的权限(启用后,write_enable必须是YES,并且匿名用户对该文件夹有写的权限) |
anon_mkdir_write_enable=NO | 匿名用户创建目录的权限(启用后,write_enable必须为YES并且匿名用户对当前目录有写入的权限) |
anon_other_write_enable=NO | 匿名用户除了创建文件,文件夹以外的其它权限,如删除,重命名的权限。不建议开启。 |
no_anon_password=NO | 启用后,匿名用户将不需要密码直接登录 |
anon_umask=077 | 匿名用户上传文件的权限 |
chown_uploads=YES | 启用后,所有匿名用户上传文件的所有者将是chown_username选项指定的用户 |
chown_username=whoever | 文件所有者的用户名,会被应用到chown_uploads选项中,不推荐root用户 |
local_enable=YES | 启用本地用户 |
write_enable=YES | 本地用户写入权限 |
local_umask=022 | 上传权限默认是077,推荐是022 |
dirmessage_enable=YES | 切换目录时,显示提示信息 |
xferlog_enable=YES | 上传或下载时写入日志 |
xferlog_std_format=YES | 启用标准的ftpd xferlog日志文件格式 |
xferlog_file=/var/log/xferlog | 日志文件的位置 |
nopriv_user=ftpsecure | 运行vsftpd需要的非特权系统用户,缺省是nobody |
async_abor_enable=YES | 启用识别异步ABOR请求,旧的FTP客户端会使用,但出于安全考虑,不建议开启 |
ascii_upload_enable=YES | 上传文件时使用ASCII的模式进行传输 |
ascii_download_enable=YES | 在下载文件时使用ASCII的模式进行传输 |
ftpd_banner=Welcome to blah FTP service. | 登陆FTP后的提示语 |
deny_email_enable=YES | 启用黑名单,用于禁止黑名单中的邮件地址登陆FTP服务器,用于抵抗DOS攻击 |
banned_email_file=/etc/vsftpd/banned_emails | 黑名单,用于禁止该名单中的邮件地址登陆服务器 |
chroot_local_user=YES |
启用后,本地用户被锁定在家目录中。最新版本需要家目录没有写入的权限,否则会报OOPS:vsftpd: refusing to run with writable root inside chroot()错误。 解决方案:1、去除家目录的写权限。2、allow_writeable_chroot=YES |
chroot_list_enable=YES | 启用后,所有用户将被锁定在家目录中,/etc/vsftpd/chroot_list文件中的用户将会被排除在外。可以使用chroot_list_file选项指定的文件来覆盖/etc/vsftpd/chroot_list中的设置。 |
chroot_list_file=/etc/vsftpd/chroot_list | 用户列表文件(需要自己创建这个文件) |
allow_writeable_chroot=NO | 用户切入到其他目录后的写入权限,不建议开启 |
local_root=none | 仅限本地用户,登录成功后切换到local_root指定的目录中 |
ls_recurse_enable=YES | 激活内置ls“-R”选项。默认情况下是禁用的,以避免远程用户在大型站点上导致过多的I/O。 |
listen=NO | 启用“listen”指令时,vsftpd以独立模式运行并侦听IPv4套接字。此指令不能与listen-ipv6指令一起使用 |
listen_ipv6=YES | 启用“listen”指令时,vsftpd以独立模式运行并侦听IPv6套接字,此指令不能与listen-ipv4指令一起使用 |
pam_service_name=vsftpd | 设置PAM外挂模块提供的认证服务所使用的配置文件名,即/etc/pam.d/vsftpd文件 此文件中file=/etc/vsftpd/ftpusers字段,说明了PAM模块能抵挡的帐号内容来自文件/etc/vsftpd/ftpusers中 |
userlist_enable=YES | 启用后,禁止userlist_file文件中的用户登陆 |
userlist_deny=YES | userlist_enable启用后,才会检查此项。如果为NO,只允许userlist_file文件中的用户登陆,如果为YES,禁止userlist_file文件中的用户登录 |
userlist_file=/etc/vsftpd/user_list | 指定userlist文件,
决定user_list文件中的用户是否能够访问FTP服务器。若userlist_deny设置为YES,则user_list文件中的用户不允许访问FTP,若设置为NO,则只有user_list文件中的用户才能访问FTP。 |
virtual_use_local_privs=NO | 如果为YES则虚拟用户类似于本地用户,如果为NO虚拟用户类似于匿名用户 |
tcp_wrappers=YES |
设置vsftpd是否与tcp_wrapper相结合来进行主机的访问控制。默认值为YES。如果启用,则vsftpd服务器会检查/etc/hosts.allow 和/etc/hosts.deny中的设置,来决定请求连接的主机,是否允许访问该FTP服务器。这两个文件可以起到简易的防火墙功能。比如:若要仅允许192.168.0.1—192.168.0.254的用户可以连接FTP服务器,则在/etc/hosts.allow文件中添加以下内容: |
三、简单实验
实验环境:
FTP服务器:centos 7 vsftpd-3.0.2 192.168.10.100
FTP客户端:centos 7 192.168.10.130
windows 7 192.168.10.101
1、匿名访问
安装VSFTPD后,默认访问匿名FTP服务器,不需要密码验证,任何人都可以使用,非常方便,当需要提供公开访问的文件下载资源时,或者用户上传一些不需要保密的数据资料时,可以选择匿名模式。默认匿名用户的家目录是/var/ftp/。
1.1 关闭本机selinux和防火墙
[root@localhost ~]# systemctl stop firewalld.service # 临时关闭本机防火墙 [root@localhost ~]# setenforce 0 # 临时关闭selinux # 永久关闭selinux 修改配置文件/etc/selinux/config: 将SELINUX=enforcing改为SELINUX=disabled 重启机器即可
1.2 创建一个用于测试的文件夹public
[root@localhost ~]# mkdir /var/ftp/public [root@localhost ~]# chmod 777 /var/ftp/public # 允许匿名用户有写入的权限
1.3 我的配置文件(/etc/vsftpd/vsftpd.conf)
ftpd_banner=Welcome to My Test FTP # 欢迎信息 write_enable=YES # 本地用户写入权限(匿名用户写入权限也必须启用本项) anonymous_enable=YES # 启用匿名访问 anon_upload_enable=YES # 允许匿名用户上传文件 anon_mkdir_write_enable=YES # 允许匿名用户创建目录 anon_umask=022 # 匿名用户上传文件的权限 local_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=YES
关于权限022,是上传的文件或目录减去022后,才是上传后的权限,实际结构是所上传文件的默认权限为644 目录的实际权限是755,然后减去022就是最终的文件/文件夹的权限。
保存配置文件后重启ftp服务
[root@localhost ~]# systemctl restart vsftpd
1.4 验证配置信息
1.4.1验证欢迎信息
1.4.2 验证上传文件/文件夹
到目前为止上传文件,创建目录都没有问题,但此时还不能修改文件名,删除文件,限制上传文件类型等,如下:
其实只要在配置文件中添加限制文件上传类型就可以了,不需要让用户有修改文件名,删除文件的操作。但如果想让匿名用户有操作权限,我修改后的配置文件如下:
ftpd_banner=Welcome to My Test FTP # 欢迎信息 write_enable=YES # 本地用户写入权限(匿名用户写入权限也必须启用本项) anonymous_enable=YES # 启用匿名访问 anon_upload_enable=YES # 允许匿名用户上传文件 anon_mkdir_write_enable=YES # 允许匿名用户创建目录 anon_umask=022 # 匿名用户上传文件的权限 anon_other_write_enable=YES # 允许匿名用户修改文件名,删除文件 deny_file={*.exe,*.bat} # 限制上传文件的类型 local_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=YES
保存配置文件后,重启ftp服务。
[root@localhost ~]# systemctl restart vsftpd
1.4.3 验证限制上传文件类型和文件名的修改和删除权限
到此匿名访问就告一段落,关于更多的功能请参考配置选项结合实际情况自行研究吧。
2、本地用户访问
2.1 创建ftp用户
[root@localhost ~]# useradd ftp_user -s /sbin/nologin [root@localhost ~]# passwd ftp_user
创建好用户后,我的配置文件(/etc/vsftpd/vsftpd.conf)如下:
ftpd_banner=Welcome to My Test FTP # 欢迎信息 write_enable=YES # 本地用户写入权限(匿名用户写入权限也必须启用本项) max_clients=50 # 允许客户端连接的数量 max_login_fails=5 # 登录5次失败后,会话将被终止 max_per_ip=2 # 每个IP启只能开启2个客户端 anonymous_enable=YES # 启用匿名访问 anon_upload_enable=YES # 允许匿名用户上传文件 anon_mkdir_write_enable=YES # 允许匿名用户创建目录 anon_umask=022 # 匿名用户上传文件的权限 anon_other_write_enable=YES # 允许匿名用户修改文件名,删除文件 deny_file={*.exe,*.bat} # 限制上传文件的类型 local_enable=YES # 启用本地用户 local_umask=022 # 本地用户上传文件权限 userlist_enable=YES # 禁止/etc/vsftpd/userlist_user中的用户登录 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd tcp_wrappers=YES
保存配置文件后,重启ftp服务。
[root@localhost ~]# systemctl restart vsftpd
2.2 验证服务器配置
从上面的小视频我们可以看到本地用户不单单可以访问自己的家目录,还可以访问系统目录,从安全的角度来说,这很不友好,我们最好将用户限制到某个目录内,或者限制在家目录中。
2.3 限制用户在家目录
我的配置文件(/etc/vsftpd/vsftpd.conf)如下:
ftpd_banner=Welcome to My Test FTP # 欢迎信息 write_enable=YES # 本地用户写入权限(匿名用户写入权限也必须启用本项) max_clients=50 # 允许客户端连接的数量 max_login_fails=5 # 登录5次失败后,会话将被终止 max_per_ip=2 # 每个IP启只能开启2个客户端 anonymous_enable=YES # 启用匿名访问 anon_upload_enable=YES # 允许匿名用户上传文件 anon_mkdir_write_enable=YES # 允许匿名用户创建目录 anon_umask=022 # 匿名用户上传文件的权限 anon_other_write_enable=YES # 允许匿名用户修改文件名,删除文件 deny_file={*.exe,*.bat} # 限制上传文件的类型 local_enable=YES # 启用本地用户 local_umask=022 # 本地用户上传文件权限 userlist_enable=YES # 禁止/etc/vsftpd/userlist_user中的用户登录 allow_writeable_chroot=YES # 切换目录后写入权限 chroot_local_user=YES # 将用户锁定在家目录中,需要allow_writeable_chroot=YES # local_root=/var/ftp # 将用户锁定在/var/ftp目录下,如果和chroot_local_user同时存在,以local_root选项为准 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd tcp_wrappers=YES
这个版本chroot_local_user将用户锁定在家目录,需要用户对家目录没有写入的权限,否则会报OOPS:vsftpd: refusing to run with writable root inside chroot()错误
解决办法:1、去掉该用户家目录的写权限。
2、allow_writeable_chroot=YES
保存配置后,重启ftp服务:
[root@localhost ~]# systemctl restart vsftpd
如果一切顺利,用户登录后会被锁定在家目录中。这里就不上图片了。
2.4 为每个用户设置独立的配置文件
两个用户ftp_user,ftp_test。实现的功能:ftp_user被锁定在/var/ftp/public,ftp_test被锁定在/var/ftp目录中
ftp_user用户我们已经创建了,下面在创建一个ftp_test用户
[root@localhost ~]# useradd ftp_test -s /sbin/nologin [root@localhost ~]# passwd ftp_test
我的主配置文件(/etc/vsftpd/vsftpd.conf)如下:
ftpd_banner=Welcome to My Test FTP # 欢迎信息 write_enable=YES # 本地用户写入权限(匿名用户写入权限也必须启用本项) max_clients=50 # 允许客户端连接的数量 max_login_fails=5 # 登录5次失败后,会话将被终止 max_per_ip=2 # 每个IP启只能开启2个客户端 anonymous_enable=YES # 启用匿名访问 anon_upload_enable=YES # 允许匿名用户上传文件 anon_mkdir_write_enable=YES # 允许匿名用户创建目录 anon_umask=022 # 匿名用户上传文件的权限 anon_other_write_enable=YES # 允许匿名用户修改文件名,删除文件 deny_file={*.exe,*.bat} # 限制上传文件的类型 local_enable=YES # 启用本地用户 local_umask=022 # 本地用户上传文件权限 userlist_enable=YES # 禁止/etc/vsftpd/userlist_user中的用户登录 user_config_dir=/etc/vsftpd/user_conf # 用户配置文件目录,系统会到该目录下去查找对应用户名的配置文件 allow_writeable_chroot=YES # 切换目录后写入权限 chroot_local_user=YES # 将用户锁定在家目录中,需要allow_writeable_chroot=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 tcp_wrappers=YES
ftp_user用户的配置文件(/etc/vsftpd/user_conf/ftp_user)如下:
local_root=/var/ftp/public
ftp_test用户的配置文件(/etc/vsftpd/user_conf/ftp_test)如下:
local_root=/var/ftp
保存配置文件后,重启ftp服务:
[root@localhost ~]# systemctl restart vsftpd
2.5 验证配置(ftp_user被锁定在/var/ftp/public,ftp_test被锁定在/var/ftp目录中)
到此用户配置就告一段落,更多参数请参考配置文档。
3、虚拟用户访问
虚拟账户的数据保存在Berkeley DB格式的数据文件中,所以需要安装db4-utils工具来创建数据文件的,这里使用yum安装vsftpd后就已经安装了这个工具,没有安装的请自行安装。虚拟用户的好处就是只需要创建一个本地用户,然后就可以映射多个虚拟账户。
3.1 创建虚拟用户文件(/etc/vsftpd/virtual_user_list)
[root@localhost ~]# vim /etc/vsftpd/virtual_user_list aaa # 用户名 123456 # 密码 bbb 123456
3.2 创建Berkeley DB格式的数据库文件
[root@localhost ~]# cd /etc/vsftpd/ [root@localhost vsftpd]# db_load -T -t hash -f virtual_user_list vusers.db db_load命令中“-f”选项用于指定数据源文件,“-T”选项允许非Berkeley DB的应用程序使用从文本格式转换的DB数据文件,“-t hash”选项指定读取数据文件的基本方法
3.3 为虚拟用户创建PAM认证
[root@localhost ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak [root@localhost ~]# vim /etc/pam.d/vsftpd #%PAM-1.0 # 将这两条记录添加到顶部 auth sufficient pam_userdb.so db=/etc/vsftpd/vusers account sufficient pam_userdb.so db=/etc/vsftpd/vusers 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
上述PAM配置内容中,通过“db=/etc/vsftpd/vusers”参数指定了要使用的虚拟用户数据库文件位置(省略.db扩展名)即对应为/etc/vsftpd/vusers文件。
3.4 创建本地用户用于映射虚拟用户
[root@localhost ~]# useradd ftp_virtual_user -d /var/ftp/virtual_user_home -s /sbin/nologin [root@localhost ~]# chmod 755 /var/ftp/virtual_user_home/
这样所有虚拟用户的家目录就是/var/ftp/virtual_user_home
3.5 调整配置文件支持虚拟用户
我的配置文件如下:
ftpd_banner=Welcome to My Test FTP # 欢迎信息 write_enable=YES # 本地用户写入权限(匿名用户写入权限也必须启用本项) max_clients=50 # 允许客户端连接的数量 max_login_fails=5 # 登录5次失败后,会话将被终止 max_per_ip=2 # 每个IP启只能开启2个客户端 anonymous_enable=YES # 启用匿名访问 anon_upload_enable=YES # 允许匿名用户上传文件 anon_mkdir_write_enable=YES # 允许匿名用户创建目录 anon_umask=022 # 匿名用户上传文件的权限 anon_other_write_enable=YES # 允许匿名用户修改文件名,删除文件 deny_file={*.exe,*.bat} # 限制上传文件的类型 local_enable=YES # 启用本地用户 local_umask=022 # 本地用户上传文件权限 userlist_enable=YES # 禁止/etc/vsftpd/userlist_user中的用户登录 user_config_dir=/etc/vsftpd/user_conf # 用户配置文件目录,系统会到该目录下去查找对应用户名的配置文件 allow_writeable_chroot=YES # 切换目录后写入权限 chroot_local_user=YES # 将用户锁定在家目录中,需要allow_writeable_chroot=YES # 启用虚拟用户 guest_enable=YES # 启用guest guest_username=ftp_virtual_user # 将虚拟用户映射本地用户 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd tcp_wrappers=YES
保存配置文件,重启vsftpd服务:
[root@localhost ~]# systemctl restart vsftpd
3.6 验证虚拟用户登录(虚拟用户aaa,bbb)
到此虚拟用户配置就到这里吧,关于更多的功能请结合实际查看配置文档。