使用 VSFTP 搭建 FTP 服务器教程


一、关于 FTP 和 VSFTP

  1. FTP(File Transfer Protocol: 文件传输协议)
    是用来在 Internet 上传送文件的协议。FTP 服务器(File Transfer Protocol Server)是文件传输协议服务器,是在互联网上提供文件存储和访问服务的计算机,它们依照 FTP 协议提供服务。

  2. VSFTP
    是一个基于 GPL 发布的类 Unix 系统上使用的 FTP 服务器软件,它的全称是 Very Secure FTP。从名称可以看出,编制者的初衷是代码的安全性。VSFTP 具有安全、高速、稳定的特点。VSFTP 的软件架构为 C/S 模式(即一个客户端一个服务器端)。

  3. FTP 的端口
    FTP 的端口有两个:20 和 21。20 端口用来进行数据传输,21 端口是控制端口,用于传输指令。查看 FTP 端口的方法如下:

    cat /etc/services | grep "^ftp"
    
  4. FTP 的会话
    包含了两个通道:控制通道和数据传输通道。FTP 有两种工作模式,一种是主动模式,一种是被动模式。以 FTP Server 为参考点,主动模式是服务器端主动连接客户端传输,被动模式是服务器端等待客户端连接。

  5. VSFTP 配置文件

    • /etc/vsftpd/vsftpd.conf:VSFTP 的核心配置文件。
    • /etc/vsftpd/ftpusers:指定哪些用户不能访问 FTP 服务器,即黑名单。
    • /etc/vsftpd/user_list:指定允许使用 VSFTP 的用户列表文件,即白名单。
    • /etc/vsftpd/vsftpd_conf_migrate.sh:VSFTP 操作的一些变量和设置脚本。
    • /var/ftp/:默认情况下匿名用户的根目录。
  6. ftpusersuser_list 文件说明

    • ftpusers 文件总是生效,它是一个黑名单,通常存放管理员不希望登录 FTP 的用户(如 root)。
    • user_list 文件是否生效取决于 vsftpd.conf 中的 userlist_enableuserlist_deny 配置。user_list 可以是一个黑名单或白名单。
  7. 问题

    • 问题一:ftpusers和user_list两个文件各自的用途是什么?有何关系?
      首先请明确一点:ftpusers不受任何配制项的影响,它总是有效,它是一个黑名单!该文件存放的是一个禁止访问FTP的用户列表,通常为了安全考虑,管理员不希望一些拥有过大权限的帐号(比如root)登入FTP,以免通过该帐号从FTP上传或下载一些危险位置上的文件从而对系统造成损坏。而user_list则是和vsftpd.conf中的userlist_enable和userlist_deny两个配置项紧密相关的,它可以有效,也可以无效,有效时它可以是一个黑名单,也可以是一个白名单!那么是什么的设置决定了它的作用呢?这就是问题二要解释的。所以简单总结就是:ftpusers和user_list没有任何关系,ftpusers文件总是生效,user_list则取决于userlist_enable和userlist_deny两项配置。

    • 问题二:vsftpd.conf中的userlist_enable和userlist_deny两个配置项各自起什么作用,两者如何搭配使用?
      为了说明这个问题,我们来建立两个测试用户:
      tom: 在user_list中
      jim:不在user_list中
      然后我们分别给两个配置项取不同的值,分4种Case进行测试:
      Case 1: userlist_enable=YES, userlist_deny=YES
      tom: 拒绝登入
      jim: 允许登录
      Case 2: userlist_enable=YES, userlist_deny=NO
      tom: 允许登录
      jim:拒绝登录(如user_list文件开头的注释所述,甚至不会提示输入密码,即无登入提示框,直接拒绝连接)
      Case 3: userlist_enable=NO,userlist_deny=NO
      tom: 允许登录
      jim: 允许登录
      Case 4: userlist_enable=NO,userlist_deny=YES
      tom: 允许登录
      jim: 允许登录

    • 综上实验得出以下结论:
      userlist_enable和userlist_deny两个选项联合起来针对的是:本地全体用户(除去ftpusers中的用户)和出现在user_list文件中的用户以及不在在user_list文件中的用户这三类用户集合进行的设置。
      当且仅当userlist_enable=YES时:userlist_deny项的配置才有效,user_list文件才会被使用;当其为NO时,无论userlist_deny项为何值都是无效的,本地全体用户(除去ftpusers中的用户)都可以登入FTP
      当userlist_enable=YES时,userlist_deny=YES时:user_list是一个黑名单,即:所有出现在名单中的用户都会被拒绝登入;
      当userlist_enable=YES时,userlist_deny=NO时:user_list是一个白名单,即:只有出现在名单中的用户才会被准许登入(user_list之外的用户都被拒绝登入);另外需要特别提醒的是:使用白名单后,匿名用户将无法登入!除非显式在user_list中加入一行:anonymous

二、FTP、SFTP、VSFTP、VSFTPD 的区别

  • FTP
    是 File Transfer Protocol 的缩写,是一种用于在网络上进行文件传输的协议,属于网络传输协议的应用层。

  • SFTP
    是 SSH File Transfer Protocol 的缩写,是基于 SSH 协议的加密 FTP 传输协议。SFTP 为 SSH 的一部分,使用 SFTP 是非常安全的。SFTP 使用的是 SSH 协议。

  • VSFTP
    是 Very Secure FTP 的缩写,是一个类 Unix 系统上使用的 FTP 服务器软件,支持 FTP 协议,不支持 SFTP 协议。

  • VSFTPD
    是 Very Secure FTP Daemon 的缩写,是 VSFTP 的守护进程。

三、安装&&准备

[root@localhost ~]# yum install vsftpd
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
================================================================================
Installing:
vsftpd x86_64 3.0.2-9.el7 rhel 166 k
Transaction Summary
================================================================================
Install 1 Package
vsftpd.x86_64 0:3.0.2-9.el7
Complete!
[root@linuxprobe ~]# yum install ftp
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
Install 1 Package
ftp.x86_64 0:0.17-66.el7
Complete!

关闭本机防火墙
[root@localhost vsftpd]# systemctl stop firewalld
[root@localhost vsftpd]# systemctl disable firewalld
[root@localhost vsftpd]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

四、匿名访问模式

vsftpd 服务程序默认开启了匿名开放模式,我们需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。

# 匿名访问模式主配置文件
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
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=YES
anon_root=/var/ftp  #指定匿名访问目录
查看该目录的权限得知,只有root管理员才有写入权限,开放ftp用户权限
[root@localhost ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 root root 16 Jul 13 14:38 /var/ftp/pub
[root@localhost ~]# chown -Rf ftp /var/ftp/pub
[root@localhost ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 ftp root 16 Jul 13 14:38 /var/ftp/pub
临时关闭 SELinux
setenforce 0
sestatus   #查看状态
SELinux status: disabled 或 Current mode: permissive为成功关闭
# 重启服务
[root@localhost ~]# systemctl restart vsftpd
# 服务程序加入到开机启动项中,以保证服务器在重启后依然能够正常提供传输服务
[root@localhost ~]# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service

测试访问(匿名用户)

[root@localhost vsftpd]# ftp 192.168.165.200
Connected to 192.168.165.200 (192.168.165.200).
220 (vsFTPd 3.0.2)
Name (192.168.165.200:root): anonymous
331 Please specify the password.
Password:  此处敲击回车即可
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir files
257 "/pub/files" created
ftp>

五、本地用户模式

关闭之前的匿名模式,开启本地用户模式。

# 本地用户模式主配置文件
[root@localhost ~]# 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=YES
xferlog_enable=YES
xferlog_std_format=YES
重启服务&&设置自启
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# systemctl enable vsftpd
新建用户escape
[root@localhost vsftpd]# useradd escape
[root@localhost vsftpd]# passwd escape
更改用户 escape 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

测试访问(本地用户)

[root@localhost vsftpd]# ftp 192.168.165.200
Connected to 192.168.165.200 (192.168.165.200).
220 (vsFTPd 3.0.2)
Name (192.168.165.200:root): escape
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,165,200,68,207).
150 Here comes the directory listing.
226 Directory send OK.
ftp> pwd
257 "/home/escape"
ftp> exit
221 Goodbye.

六、虚拟用户模式

认证模式:vsftpd + pam + file

第一步:创建用于进行 FTP 认证的用户数据库文件

  • 数据库文件中奇数行为账户名,偶数行为密码
# 编辑虚拟用户文件
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# vim vuser.list
zhangsan
123456
redhat
123456
lisi
123456
redhat
123456
# 明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式
# 因此需要使用db_load命令用哈希算法将原始的明文信息文件转换成数据库文件
# 降低数据库文件的权限,然后再把原始的明文信息文件删除
[root@localhost vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@localhost vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@localhost vsftpd]# chmod 600 vuser.db
[root@localhost vsftpd]# rm -f vuser.list

第二步:创建 vsftpd 服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户

  • FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置
  • 可以把这个系统本地用户的家目录设置为/var目录并设置不允许登录FTP服务器
[root@localhost ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@localhost ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
[root@localhost ~]# chmod -Rf 755 /var/ftproot/

第三步:建立支持虚拟用户的 PAM 认证文件

  • PAM是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开
  • PAM是可插拔认证模块,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式
# 新建一个用于虚拟用户认证的PAM文件vsftpd.vu
# PAM文件内的db=参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀
[root@localhost ~]# vim /etc/pam.d/vsftpd.vu
auth       required     pam_userdb.so    db=/etc/vsftpd/vuser
account    required     pam_userdb.so    db=/etc/vsftpd/vuser

第四步:在 vsftpd.conf 文件中添加支持配置

  • 在vsftpd服务程序的主配置文件中默认就带有参数–pam_service_name=vsftpd
  • 表示登录FTP服务器时是根据/etc/pam.d/vsftpd文件进行安全认证的
# 我们要做的就是把vsftpd主配置文件中原有的PAM认证文件vsftpd修改为新建的vsftpd.vu文件即可
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
pam_service_name=vsftpd.vu
user_config_dir=/etc/vsftpd/vusers_dir
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=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

第五步:为虚拟用户设置不同的权限

  • 只需新建一个目录,在里面分别创建两个以zhangsan和lisi命名的文件
  • 在每个文件中,对用户分别进行配置,达到管理不用用户权限的效果
[root@localhost ~]# mkdir /etc/vsftpd/vusers_dir/
[root@localhost ~]# cd /etc/vsftpd/vusers_dir/
[root@localhost vusers_dir]# touch lisi
[root@localhost vusers_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

第六步:设置 SELinux 域允许策略

临时关闭 SELinux
setenforce 0
sestatus   #查看状态
SELinux status: disabled 或 Current mode: permissive为成功关闭

第七步:使用虚拟 FTP 用户访问测试

Name (192.168.165.200:root): lisi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
550 Permission denied.
[root@localhost vsftpd]# ftp 192.168.165.200
Connected to 192.168.165.200 (192.168.165.200).
220 (vsFTPd 3.0.2)
Name (192.168.165.200:root): zhangsan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir files
257 "/files" created
ftp> ls
227 Entering Passive Mode (192,168,165,200,131,144).
150 Here comes the directory listing.
drwx------    2 1013     1013            6 Aug 26 07:24 file
drwx------    2 1013     1013            6 Aug 26 08:00 files
226 Directory send OK.

项目:搭建通用 FTP 服务器

3.1 项目要求

搭建一台通用 FTP 服务器,局域网内的所有员工都可以访问,员工可以进行上传/下载文件的操作,并创建属于自己的目录。

3.2 项目思路分析

由于需要所有员工都可以访问,因此需要设置成可以匿名用户登录,并且开启上传文件和创建文件的权限。

3.3 使用 VSFTP 搭建可以匿名访问的 FTP 服务器

  1. 部署环境
操作系统版本CPU架构进程功能描述
CentOS 7.6x86_64vsftpdFTP 服务器端
  1. 安装 VSFTP 服务器端

    yum -y install vsftpd
    
    • 启动 VSFTP:
      systemctl start vsftpd
      
    • 设置开机启动:
      systemctl enable vsftpd
      
  2. 修改 VSFTP 的配置文件 /etc/vsftpd/vsftpd.conf

    • 备份配置文件:
      cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
      
    • 编辑配置文件,添加以下内容:
      anonymous_enable=YES
      anon_upload_enable=YES
      anon_mkdir_write_enable=YES
      anon_other_write_enable=YES
      
    • 新增用户ftp,设置密码123:
      useradd ftp
      passwd 123
      
    • 确认 FTP 目录权限**
      chmod 755 /var/ftp/pub/
      
    • 修改匿名用户登录的目录权限:
      chown ftp:ftp /var/ftp/pub/
      
    • 重启 VSFTP 服务:
      systemctl restart vsftpd
      
  3. 使用 Windows 资源管理器访问 FTP 服务器
    输入 ftp://192.168.1**.*/,可以看到 pub 目录并进行上传、下载等操作。

  4. 使用lftp工具访问 FTP 服务器

    [root@localhost vsftpd]# lftp 192.168.165.200
    lftp 192.168.165.200:~> pwd
    ftp://192.168.165.200
    lftp 192.168.165.200:~> ls
    drwxr-xr-x    2 1009     1009            6 Aug 20 07:51 pub
    lftp 192.168.165.200:/> pwd
    ftp://192.168.165.200/
    lftp 192.168.165.200:/> cd pub/
    lftp 192.168.165.200:/pub> ls
    lftp 192.168.165.200:/pub> mkdir t
    mkdir 成功, 建立 `t'
    lftp 192.168.165.200:/pub> ls
    drwx------    2 1009     1009            6 Aug 20 08:21 t
    lftp 192.168.165.200:/pub> exit
    [root@localhost vsftpd]#
    

参考连接:https://www.cnblogs.com/renshengdezheli/p/14169899.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值