配置 vsftpd 搭建 FTP 服务器

3,581次阅读

共计 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 - 关闭数据连接端口,请求的文件操作成功
全文完
 
西西
📝创作说明:本文由 西西 于2017-05-23发表,共计7856字。
🉑转载说明:本作品采用 “知识共享署名-非商业性使用 4.0 国际许可协议” 进行许可。除特殊说明外,您可以自由的转载和修改,但请务必注明来源且不可用于商业目的。