共计 7856 个字符,预计需要花费 20 分钟才能阅读完成。
常用命令:
# 安装 vsftpd
yum install -y vsftpd
# 检查 | 启动 | 停止 | 重启 vsftpd 服务
service vsftpd status|start|stop|restart
# 设置开机自启动
systemctl enable vsftpd.service
# 让防火墙开启 FTP 服务和 21 端口的使用
firewall-cmd --add-service=ftp --permanent
firewall-cmd --add-port=21/tcp --permanent
firewall-cmd --reload
在 vsftpd 服务器中支持匿名用户,本地用户,和虚拟用户 3 类用户账号,用途及区别如下:
匿名用户:是名为 anonymous 或 ftp 的用户,匿名 FTP 用户登录后将 FTP 服务器中的 /var/ftp 作为 FTP 根目录。
本地用户:是 Linux 系统用户账号,使用本地用户账号登录 FTP 服务器后,登录目录为本地用户的宿主目录。
虚拟用户:为了保证 FTP 服务器的安全性,由 vsftpd 服务器提供的非系统用户账号。虚拟用户 FTP 登录后将把指定的目录作为 FTP 根目录。虚拟用户与本地用户具有类似的功能,由于虚拟用户相对安全,因此正逐步替代本地用户账号的使用。
基本会用到的相关文件及所在目录:
# 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
为了正常使用,需要修改 vsftpd.conf 的部分内容如下:
# 是否允许匿名登录 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
为了安全起见,我们不考虑使用 root 作为 ftp 帐号,新建一个专门用来 ftp 操作的帐号,操作步骤如下:
# 新建一个名为 ftper 的本地帐号,禁止登陆 shell,且不为其创建登录目录
useradd -M -s /sbin/nologin ftper
# 为建好的 ftper 帐号设置密码
passwd ftper
# 指定 ftper 的 ftp 登录主目录,要和配置文件里的 local_root= 结果保持一致
usermod -d /usr/share/nginx/www ftper
# 将 ftp 登录主目录的基本组和附加组为 ftper
chown -R ftper:ftper /usr/share/nginx/html
# 将 ftper 用户追加到 root 组
usermod -a -G root ftper
以上操作完成后,重启 ftp 即可生效。
然而,实际使用中也会遇到以下问题:
如果提示500 OOPS: vsftpd: refusing to run with writable root inside chroot ():
就意味着指定的登录主目录权限有问题,解决办法是,在配置文件里加入allow_writeable_chroot=YES。
或者通过执行终端命令 chmod a-w /home/youersite 来取消写权限。
如果提示425 Security: Bad IP connecting:
说明 FTP 客户端软件连接 VSftpd 服务报此错误,可能是在连接中变换了 IP 地址。
# 使用 vi 编辑配置文件
vi /etc/vsftpd/vsftpd.conf
# 在配置文件中添加:pasv_promiscuous=YES
# 保存退出后重启 vsftpd 服务
service vsftpd restart
FTP 分为两类,PORT FTP 和 PASV FTP,PORT FTP 是一般形式的 FTP。这两种 FTP 在建立控制连接时操作是一样的,都是由客户端首先和 FTP 服务器的控制端口 (默认值为 21) 建立控制链接,并通过此链接进行传输操作指令。它们的区别在于使用数据传输端口 (ftp- data) 的方式。PORT FTP 由 FTP 服务器指定数据传输所使用的端口,默认值为 20。PASV FTP 由 FTP 客户端决定数据传输的端口。PASV FTP 这种做法,主要是考虑到存在防火墙的环境下,由客户端与服务器进行沟通(客户端向服务器发出数据传输请求中包含了数据传输端口),决定两者之间的数据传输端口更为方便一些。
如果提示553 Could not create file,表现为可以通过服务器本地用户器登录到 ftp,可以查看到 ftp 上的各种路径及文件,但就是不能上传:
出现这种情况,如果不是目录权限的问题的话,可能就是 SELinux 的问题。
在终端执行以下命令来解决问题:
# 查看 SELinux 设置
getsebool -a | grep ftp
# 得到以下结果输出
allow_ftpd_anon_write --> off
allow_ftpd_full_access --> off
allow_ftpd_use_cifs --> off
allow_ftpd_use_nfs --> off
ftp_home_dir --> off
ftpd_connect_db --> off
ftpd_use_fusefs --> off
ftpd_use_passive_mode --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_use_cifs --> off
tftp_use_nfs --> off
# 需要把 allow_ftpd_full_access 的结果设置为 on
setsebool allow_ftpd_full_access on
改好后重新查看 SELinux 的设置,确认 allow_ftpd_full_access 的结果为 on 后,就可以通过 ftp 在指定目录上传文件了。
其实也可以直接关闭 SELinux。它为 Linux 提供安全强化同时,也让 Linux 服务安装变得更复杂。如果无法正确的为某项服务配置好 SELinux,那么它将很可能导致某项服务无法正常的运行。所以对于 Linux 初学者来说,也可以考虑完全关闭 SELinux:
临时关闭或开启 SELinux,可以使用下面的命令:
# 设置 SELinux 成为 permissive 模式(关闭 SELinux)setenforce 0
# 设置 SELinux 成为 enforcing 模式(开启 SELinux)setenforce 1
也可以通过 vi /etc/selinux/config 的指令来修改 SELinux 的配置文件,来永久关闭 SELinux:
# 在原配置里用井号注释掉下面两项
#SELINUX=enforcing
#SELINUXTYPE=targeted
# 然后增加下面这条即可
SELINUX=disabled
保存退出后,重启系统,然后 SELinux 就彻底关闭了。
附录
在终端执行 ftp 连接的命令说明:
ftp> ascii # 设定以 ASCII 方式传送文件(缺省值)
ftp> bell # 每完成一次文件传送, 报警提示.
ftp> binary # 设定以二进制方式传送文件.
ftp> case # 当为 ON 时, 用 MGET 命令拷贝的文件名到本地机器中, 全部转换为小写字母.
ftp> cd # 同 UNIX 的 CD 命令.
ftp> cdup # 返回上一级目录.
ftp> mkdir directory-name # 在远端主机中建立目录.
ftp> chmod # 改变远端主机的文件权限.
ftp> pwd # 列出当前远端主机目录.
ftp> close # 终止远端的 FTP 进程, 返回到 FTP 命令状态, 所有的宏定义都被删除.
ftp> delete # 删除远端主机中的文件.
ftp> mdelete [remote-files] # 删除一批文件.
ftp> dir [remote-directory] [local-file] # 列出当前远端主机目录中的文件. 如果有本地文件, 就将结果写至本地文件.
ftp> help [command] # 输出命令的解释.
ftp> lcd # 改变当前本地主机的工作目录, 如果缺省, 就转到当前用户的 HOME 目录.
ftp> ls [remote-directory] [local-file] # 同 DIR.
ftp> macdef # 定义宏命令.
ftp> open host [port] # 重新建立一个新的连接.
ftp> prompt # 交互提示模式.
ftp> rename [from] [to] # 改变远端主机中的文件名.
ftp> rmdir directory-name # 删除远端主机中的目录.
ftp> status # 显示当前 FTP 的状态.
ftp> system # 显示远端主机系统类型.
ftp> user user-name 此处含有隐藏内容,需要正确输入密码后可见!
[account] # 重新以别的用户名登录远端主机.
ftp> ? [command] # 同 HELP. [command]指定需要帮助的命令名称。如果没有指定 command,ftp 将显示全部命令的列表。ftp> ! # 从 ftp 子系统退出到外壳。
关闭 ftp 连接的命令如下任一:
ftp> bye
ftp> exit
ftp> quit
下载文件:
ftp> get readme.txt # 下载 readme.txt 文件
ftp> mget *.txt # 下载
ftp> recv remote-file [local-file] # 同 get
上传文件:
ftp> put /path/readme.txt # 上传 readme.txt 文件
ftp> mput *.txt # 可以上传多个文件
ftp> send local-file [remote-file] # 同 put
状态码
230 - 登录成功
200 - 命令执行成功
150 - 文件状态正常,开启数据连接端口
250 - 目录切换操作完成
226 - 关闭数据连接端口,请求的文件操作成功