CentOS7 安装 vsftpd 服务

时间:2024-10-07 08:35:56

CentOS7 安装 vsftpd 服务


0.FTP简介

  • FTP服务是一个跨平台的文件共享解决方案

0.1.FTP两种模式的区分:服务端的主被动模式

1)ftp一般分为两种模式,PORTFTP和PASVFTP
2)这两种FTP在建立控制连接时操作是一样的,都是由客户端首先和FTP服务器的控制端口(默认值为21)建立控制链接,并通过此连接进行传输操作指令。它们的区别在于使用数据传输端口(ftp-data)的方式。
3)PORTFTP模式下由FTP服务器指定数据传输所使用的端口,默认值为20。
4)PASVFTP模式下由FTP客户端决定数据传输的端口。PASVFTP这种做法,主要是考虑到存在防火墙的环境下,由客户端与服务器进行沟通(客户端向服务器发出数据传输请求中包含了数据传输端口),决定两者之间的数据传输端口更为方便一些。

0.2.FTP 常用的三中用户授权方式

  • 1.匿名用户访问
默认安装完 vsftpd 服务,启动后就是匿名方式的ftp服务器,使用
ftp 127.0.0.1
即可登录查看指定的目录文件,
注意:这种方式不是很安全,一般在要求临时快速提供跨平台文件共享时会使用
  • 2.系统用户授权访问
允许 linux 系统用户使用 ftp 服务访问该用户的宿主目录或者指定的系统目录
用途:一般用于个人搭建的自用 ftp 服务器,配置简单,便于管理(用户少)
优点:配置简单
缺点:如果需要提供大量用户的授权访问,不推荐使用,用户管理不方便
  • 3.虚拟用户授权访问
原理:独立的维护一个虚拟用户列表,可以创建不同的虚拟用户映射到同一个系统用户上进行授权管理,以这个系统用户的进行文件共享访问以及授权管理
优点:适用于大量用户的授权访问,比如公司内部文件共享,较为安全且常用
缺点:配置较为复杂

1.安装FTP服务端

1.1.环境准备

  • 检查系统环境,如果系统版本较低,建议升级内核等
uname -a
cat /etc/redhat-release
yum update -y

1.2.安装vsftpd,创建数据目录

  • 包括服务端和客户端
yum install vsftpd ftp -y
which vsftpd
  • 创建 ftp 用户及宿主目录
useradd -d /data/ftpdata/ -s /sbin/nologin ftpvuser
chmod 755 /data/ftpdata/
chown -R ftpvuser.ftpvuser /data/ftpdata/
ls -lhd /data/ftpdata/
  • 注意:这个 ftpvuser 是 linux 系统用户,用于映射 ftp 虚拟用户,只需要创建一次

1.3.启动 vsftpd 服务并配置开机自启动

systemctl start vsftpd
systemctl status vsftpd
systemctl enable vsftpd
netstat -anptl|grep vsftpd
  • 实例演示:
[root@srv05-CT75 vsftpd]# tail -1 /etc/passwd
ftpvuser:x:1000:1000::/data/ftpdata/:/sbin/nologin
[root@srv05-CT75 ~]# systemctl start vsftpd
[root@srv05-CT75 ~]# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
Active: active (running) since Tue 2019-06-18 01:00:50 CST; 24h ago
Main PID: 7649 (vsftpd)
CGroup: /system.slice/vsftpd.service
└─7649 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf Jun 18 01:00:50 srv05-CT75.zhaoshuai.com systemd[1]: Stopped Vsftpd ftp daemon.
Jun 18 01:00:50 srv05-CT75.zhaoshuai.com systemd[1]: Starting Vsftpd ftp daemon...
Jun 18 01:00:50 srv05-CT75.zhaoshuai.com systemd[1]: Started Vsftpd ftp daemon.
[root@srv05-CT75 ~]# netstat -anptl|grep vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 7649/vsftpd
[root@srv05-CT75 ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.

1.4.配置 vsftpd 的操作日志

  • 从xferlog可以查看到用户上传下载等的操作记录,删除不会显示
vim /etc/logrotate.d/vsftpd
--------------------------------
/var/log/vsftpd.log {
# ftpd doesn't handle SIGHUP properly
nocompress
missingok
}
/var/log/xferlog {
# ftpd doesn't handle SIGHUP properly
nocompress
missingok
}
--------------------------------
tail -f /var/log/xferlog

2.使用匿名用户访问 FTP 服务器

  • 刚安装好并启动的 vsftpd 服务,默认为匿名访问
1)可以直接输入"IP:PORT",可以打开ftp服务器
2)允许匿名用户登录,宿主目录为/var/ftp,不能离开,下载目录为/var/ftp/pub,且只能下载,不能上传
3)允许本地用户登录,且可离开主目录,本地用户允许上传/下载
4)写在文件/etc/vsftpd/ftpusers中的本地用户禁止登录
5)服务器使用独占方式启动,且无限制连接数
  • 实例演示:
[root@srv05-CT75 vsftpd]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): anonymous # 输入匿名用户的用户名
331 Please specify the password. # 提示输入密码
Password: # 空密码
230 Login successful. # 提示登录成功
Remote system type is UNIX.
Using binary mode to transfer files. # 提示使用二进制传输数据
ftp> ls # 查看文件列表,宿主目录为 /var/ftp
227 Entering Passive Mode (127,0,0,1,168,57).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Oct 30 2018 pub # 默认有个 pub 目录
226 Directory send OK.
ftp> ls pub # pub目录为空
227 Entering Passive Mode (127,0,0,1,102,108).
150 Here comes the directory listing.
226 Directory send OK.
ftp> cd pub # 切换目录
250 Directory successfully changed. # 提示目录切换成功
ftp> ls # 列表查看,空目录
227 Entering Passive Mode (127,0,0,1,153,121).
150 Here comes the directory listing.
226 Directory send OK.
ftp> cd ..
250 Directory successfully changed.
ftp> ls # 我这里手动创建了 aaa 目录和 bbb 文件
227 Entering Passive Mode (127,0,0,1,212,127).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 4096 Jun 18 17:56 aaa
-rw-r--r-- 1 0 0 0 Jun 18 17:57 bbb
drwxr-xr-x 2 0 0 4096 Oct 30 2018 pub
226 Directory send OK.
ftp>
ftp> help # help 可以查看可以使用的命令
Commands may be abbreviated. Commands are: ! debug mdir sendport site
$ dir mget put size
account disconnect mkdir pwd status
append exit mls quit struct
ascii form mode quote system
bell get modtime recv sunique
binary glob mput reget tenex
bye hash newer rstatus tick
case help nmap rhelp trace
cd idle nlist rename type
cdup image ntrans reset user
chmod lcd open restart umask
close ls prompt rmdir verbose
cr macdef passive runique ?
delete mdelete proxy send
ftp> exit
421 Timeout.
  • 以上是匿名用户登录 vsftpd 服务器的演示

3.使用系统用户访问 FTP 服务器

3.1.修改配置文件并重启服务

vim /etc/vsftpd/vsftpd.conf
-------------------------------
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
chroot_local_user=YES
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
pam_service_name=vsftpd
tcp_wrappers= YES
-------------------------------
systemctl restart vsftpd
systemctl status vsftpd
  • 配置注解:
anonymous_enable=NO	                        # 修改,禁止匿名用户登录
local_enable=YES # 默认启用,允许本地用户登录,虚拟用户需要映射到本地用户才可以使用
write_enable=YES # 默认启用,本地用户开放写权限
#local_umask=022 # 注释掉,本地用户创建的文件的权限反码022,创建的文件为644
chroot_local_user=YES # 默认启用,将本地用户锁定在自己的家目录中
userlist_enable=YES # 是否启用用户控制列表,默认启用
userlist_deny=NO # 指定用户控制列表的作用,默认为 YES,表示该文件内的用户列表禁止登录FTP服务器,这里修改为 NO,作为授权访问的用户列表使用
userlist_file=/etc/vsftpd/user_list # 指定用户控制列表的文件名
anon_umask=022 # 增加,匿名用户新增文件的umask数值。默认值为077,需要修改为022,否则上传后的文件为600
dirmessage_enable=YES # 设置切换到目录时显 示message 隐含文件的内容
xferlog_enable= YES # 激活上传和下载日志
connect_from_port_20= YES # 启用FTP数据端口连接
pam_service_name=vsftpd # 设置PAM认证服务的配置文件名称, 该文件存放在/etc/pam.d目录下
listen= YES # 是否使用独占启动方式
tcp_wrappers= YES # 使用防火墙
#file_open_mode=0755 pasv_min_port=50000 # 被动模式下的最小端口
pasv_max_port=60000 # 被动模式下的最大端口 # 设置连接服务器后的欢迎信息
ftpd_banner=welcome to ftp service.
banner_file=/etc/vsftpd/vsftpd_banner_file
  • 配置建议:
userlist_deny=NO ,这里设置为NO,做为允许登陆的用户列表,可以手动指定允许登录 ftp 的用户,比较实用,如果设置为YES,作为禁止登录 ftp 的用户列表,与 ftpusers 功能重复,没有必要
  • vsftpd 的配置文件列表
/etc/vsftpd/vsftpd.conf	    # 主配置文件
/etc/vsftpd/ftpusers # FTP限制访问的用户,里面是一些系统用户,默认不允许访问,防止被入侵,一般不需要修改
/etc/vsftpd/user_list # 授权用户列表,可以控制哪些用户可以访问或者禁止访问,我一般配置为允许访问 ftp 的用户列表
  • 特别注意:
1)vsftpd.conf 文件中每个选项设置为一行,格式为“option=value”,“=”号两边不能留空白符

3.2.创建测试用的本地用户

useradd zhaoshuai
passwd zhaoshuai
  • 创建测试用的文件和目录
[root@srv05-CT75 vsftpd]# touch /home/zhaoshuai/aaa.txt
[root@srv05-CT75 vsftpd]# mkdir -p /home/zhaoshuai/bbb
[root@srv05-CT75 vsftpd]# ll /home/zhaoshuai/
total 4
-rw-r--r-- 1 root root 0 Jun 19 02:18 aaa.txt
drwxr-xr-x 2 root root 4096 Jun 19 02:18 bbb

3.3.修改授权的本地用户列表

  • ftpusers 禁止登录 ftp 服务器的用户列表,一般是系统用户不需要修改,可以增加
vim /etc/vsftpd/ftpusers
-------------------------------
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
-------------------------------
  • user_list 允许登陆 ftp 服务器的用户列表
vim /etc/vsftpd/user_list
-------------------------------
zhaoshuai
-------------------------------
  • 备注:以上两个文件修改完不需要重启 vsftpd 服务

3.4.使用本地用户登陆测试

ftp 127.0.0.1
  • 实例演示:
[root@srv05-CT75 pam.d]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): zhaoshuai
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
ftp>
ftp> ls
227 Entering Passive Mode (127,0,0,1,94,91).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jun 18 18:18 aaa.txt
drwxr-xr-x 2 0 0 4096 Jun 18 18:18 bbb
226 Directory send OK.
ftp> exit
221 Goodbye.
  • 如果要使用 xftp 等图形工具,需要选择主动模式
  • 对于阿里云,青云等云平台的虚拟机,需要考虑安全组:允许20,21端口的接入请求
  • 阿里云配置nat网关的端口转发可以通过公网连接,或者直接绑定EIP,青云需要直接绑定EIP进行公网连接
  • 阿里云和青云都无法通过负载均衡的端口转发提供ftp服务的访问,因为经过了他们内部的路由转发,无法直接找到对应的主机,总之ftp需要直连服务器才行

4.使用虚拟用户访问 FTP 服务器

  • ftp配置为匿名访问显然是不安全也不便于管理的,另外,单纯使用系统用户的 ftp 也较难管理,通常情况下是使用一个系统用户作为ftp用户登陆ftp服务器的代理用户进行管理

4.1.修改vsftpd.conf 文件,重启服务

cd /etc/vsftpd/
vim vsftpd.conf
----------------------------------------
anonymous_enable=NO
local_enable=YES
write_enable=YES
#local_umask=022
chroot_local_user=YES
userlist_enable=YES
userlist_deny=NO
userlist_file=/etc/vsftpd/user_list
chroot_local_user=YES # made for virtual user
guest_enable=YES
guest_username=ftpvuser
pam_service_name=/etc/pam.d/ftpvuser.pam
user_config_dir=/etc/vsftpd/vuser.d
anon_umask=022
-------------------------------------
systemctl restart vsftpd
systemctl status vsftpd
  • 配置注解:
guest_enable=YES			                # 增加,启用虚拟用户模式
guest_username=ftpvuser # 增加,配置虚拟用户映射到的本地用户名
pam_service_name=/etc/pam.d/ftpvuser.pam # 修改,配置虚拟用户的认证方式
user_config_dir=/etc/vsftpd/vuser.d # 增加,虚拟用户的配置文件目录
  • 注意:
1)除了主配置文件外,还可以给特定用户设定个人配置文件
2)虚拟用户默认可以读写,访问时映射为本地用户,所以需要启用对本地用户的控制
3)实际的访问权限可由用户独立的配置文件进行单独控制

4.2.设置 ftp 虚拟用户的验证授权方式

  • 1)创建虚拟用户的秘钥文件
mkdir -p /etc/vsftpd/vuser.d
cd /etc/vsftpd/vuser.d
touch vuser.list
  • 2)加密虚拟用户的秘钥文件
# 使用 db_load 工具生成加密文件
yum install db4-utils -y
db_load -T -t hash -f vuser.list vuser.db
file vuser.list
file vuser.db # 为了安全,修改虚拟用户文件的访问权限
chmod 600 /etc/vsftpd/vuser.*
ll /etc/vsftpd/vuser.*
  • 3)创建虚拟用户的授权认证文件
cd /etc/pam.d/
mv vsftpd vsftpd.ori # 备份原有的ftp的pam认证文件
vim ftpvuser.pam # 创建新的ftp虚拟用户认证文件
-----------------------------------
#%PAM-1.0
auth required pam_userdb.so db=/etc/vsftpd/vuser.d/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser.d/vuser
-----------------------------------
  • 注意:db=/etc/vsftpd/vuser.d/vuser 不可以加.db的扩展名,否则认证不成功

4.3.实例演示:配置一个虚拟用户

  • 1)创建 ftp 虚拟用户 test1 的数据目录和秘钥文件
mkdir -p /data/ftpdata/zhaoshuai
touch /data/ftpdata/zhaoshuai/ccc.txt # 创建测试文件
mkdir -p /data/ftpdata/zhaoshuai/ddd
chown -R ftpvuser.ftpvuser /data/ftpdata
chmod 755 /data/ftpdata/
ls -lhd /data/ftpdata/
ls -lh /data/ftpdata/
  • 2)把该虚拟用户 test1 添加到 user_list 文件中
vim /etc/vsftpd/user_list
---------------------
zhaoshuai
----------------------
  • 备注:
1)注释掉其他本地用户认证的内容,因为启用了 guest_enable 后,本地用户将失效,所有非匿名用户变成虚拟用户
2)因为需要授权访问的用户比较少,所以user_list设置为可以访问ftp服务的用户
  • 3)创建或修改虚拟用户秘钥信息
cd /etc/vsftpd/vuser.d
vim vuser.list
--------------------
zhaoshuai
zhaoshuai # 这里的密码和系统用户 zhaoshuai 的密码不同用以区分
--------------------
db_load -T -t hash -f vuser.list vuser.db
  • 该文件的格式为:一行用户名一行密码

  • 4)为用户创建授权配置文件(文件名必须为虚拟用户名)

cd /etc/vsftpd/vuser.d
vim zhaoshuai
---------------------------
# 指定宿主目录,配置访问权限
local_root=/data/ftpdata/zhaoshuai # 虚拟用户的宿主目录
write_enable=YES
anon_upload_enable=YES # 上传
anon_mkdir_write_enable=YES # 创建目录写权限
anon_other_write_enable=YES # 其他写入权限
---------------------------
  • 5)配置完成刷新配置信息
systemctl restart vsftpd
systemctl status vsftpd
  • 6)登陆测试
[root@srv05-CT75 vuser.d]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): zhaoshuai
331 Please specify the password.
Password: # 在这里使用系统用户zhaoshuai的密码无法登陆
530 Login incorrect.
Login failed.
ftp> exit
221 Goodbye.
[root@srv05-CT75 vuser.d]# ftp 127.0.0.1
Connected to 127.0.0.1 (127.0.0.1).
220 (vsFTPd 3.0.2)
Name (127.0.0.1:root): zhaoshuai
331 Please specify the password.
Password: # 使用虚拟用户zhaoshuai的密码可以正常登录
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
ftp> ls # 可以查看到上面创建的测试文件
227 Entering Passive Mode (127,0,0,1,226,175).
150 Here comes the directory listing.
drwxr-xr-x 3 1000 1000 4096 Jun 12 07:59 ccc.txt
drwxr-xr-x 6 1000 1000 4096 Jun 12 07:45 ddd
226 Directory send OK.
ftp> exit
221 Goodbye.

拓展1:ftp 的防火墙配置

iptables -I INPUT -p tcp --dport 21 -j ACCEPT  		    # FTP连接端口
iptables -I INPUT -p tcp --dport 33000:34000 -j ACCEPT   # pasv模式下的随机端口
iptables-save >/etc/sysconfig/iptables   # 保存防火墙配置 systemctl restart iptables.service
systemctl restart vsftpd.service

拓展2:CentOS6安装vsftpd

  • 方法相同,区别在于服务的启动命令是
service vsftpd restart
service vsftpd status

同类文章推荐

  • ftp相关技术文档,写的较早,看文笔很不错,应该又可以借鉴的地方

http://os.51cto.com/art/201008/222036.htm

END