Centos系统下FTP服务器的搭建、配置与管理
Centos系统配置与管理FTP服务器
- 一、FTP基础解释
- 二、FTP工作原理
- 2.1 客户端-服务器模型
- 2.2 两种通信通道
- 2.3 工作模式
- 2.4 数据传输方式
- 2.5 身份验证
- 2.6 常见命令
- 2.7 使用场景
- 三、项目准备
- 四、项目执行
- 4.1 IP网卡配置
- 4.2 开始配置
- 五、vsftpd的配置文件解释
- 5.1 vsftpd服务程序的主配置文件(/etc/vsftpd/vsftpd.conf)
- 5.2 FTP数据库文件说明
- 5.2 FTP用户列表文件说明
- 5.2 FTP拒绝访问列表说明
- 5.2 FTP默认目录说明
- 六、配置匿名用户FTP服务器
- 6.1 认证方式
- 6.2 匿名用户登录
- 6.3 匿名用户登录FTP服务器配置示例
- 七、企业级配置本地用户FTP服务器
- 7.1 FTP服务器配置要求
- 7.2 要求
- 7.3 解决方案
- 八、配置虚拟用户FTP服务器
一、FTP基础解释
FTP(File Transfer Protocol,文件传输协议)是一种用于通过网络在不同计算机之间传输文件的标准协议。它基于客户端-服务器架构,允许用户通过网络将文件上传到服务器或从服务器下载文件。
二、FTP工作原理
2.1 客户端-服务器模型
FTP采用客户端-服务器架构(c/s)。用户使用FTP客户端软件(如FileZilla、WinSCP等)来与FTP服务器进行交互。客户端可以通过FTP命令访问和操作服务器上的文件。
2.2 两种通信通道
FTP使用两个不同的通道进行通信:
- 控制通道(Command Channel):用于传输控制命令,如用户身份验证、命令请求等。这个通道通常使用21端口。
- 数据通道(Data Channel):用于传输实际的数据(文件传输)。该通道的端口是动态的,通常由FTP服务器在控制连接中与客户端协商确定。
2.3 工作模式
FTP有两种主要的工作模式:
- 主动模式(Active Mode):客户端向服务器的21端口发送命令,服务器再通过客户端指定的端口(通常为20端口)回传数据。该模式下,客户端需要对外网开放端口。
- 被动模式(Passive Mode):客户端向服务器的21端口发送命令,服务器向客户端提供一个数据端口,客户端通过该端口进行数据传输。在防火墙环境下,被动模式更为常用。
2.4 数据传输方式
FTP支持不同的传输模式:
- ASCII模式:用于传输文本文件,文件内容经过转换以适应不同操作系统之间的换行符差异。
- 二进制模式:用于传输二进制文件,如图像、压缩文件等,文件不会被修改。
2.5 身份验证
在使用FTP时,通常需要提供用户名和密码进行身份验证。部分FTP服务器也支持匿名登录,使用户能够无需身份验证即可下载文件,但无法上传文件。
2.6 常见命令
FTP提供了多种命令来进行文件操作。
常用的命令包括:
命令 | 备注 |
---|---|
USER | 发送用户名 |
PASS | 发送密码 |
LIST | 列出目录内容 |
GET或RETR | 下载文件 |
PUT或STOR | 上传文件 |
QUIT | 退出FTP会话 |
![]() |
2.7 使用场景
简单的过程如下:
- 启动FTP客户端,输入服务器的IP地址和端口(默认是21端口)。
- 输入用户名和密码进行身份验证。
- 客户端与服务器建立控制通道,获取服务器上的文件列表。
- 选择你想要下载的文件,客户端通过数据通道与服务器传输文件。
- 下载完成后,客户端发送退出命令(QUIT),关闭会话。
三、项目准备
主机名称 | 操作系统 | IP地址 | 角色 |
---|---|---|---|
FTP服务端 | Centos8 | 10.0.0.8 | FTP服务器端 |
FTP客户端 | Centos8 | 10.0.0.18 | FTP客户端 |
Windows客户端 | Windows | 192.168.10.100 | FTP客户端 |
四、项目执行
4.1 IP网卡配置
见centos8之网卡配置详解
4.2 开始配置
- 检查yum源是否配置成功
[root@ftp-server ~]# yum makecache // 清除缓存
Rocky Linux 8 - AppStream 14 kB/s | 4.8 kB 00:00
Rocky Linux 8 - BaseOS 8.5 kB/s | 4.3 kB 00:00
Rocky Linux 8 - Extras 8.8 kB/s | 3.1 kB 00:00
Extra Packages for Enterprise Linux 8 - x86_64 13 kB/s | 4.4 kB 00:00
Metadata cache created.
[root@ftp-server ~]# yum repolist //查看仓库列表
repo id repo name
appstream Rocky Linux 8 - AppStream
baseos Rocky Linux 8 - BaseOS
epel Extra Packages for Enterprise Linux 8 - x86_64
extras Rocky Linux 8 - Extras
- 安装vsftpd服务
[root@localhost ~]# yum install -y vsftpd* ftp
Last metadata expiration check: 0:01:09 ago on Sun 01 Dec 2024 11:14:05 PM CST.
Dependencies resolved.
=====================================================================================
Package Architecture Version Repository Size
=====================================================================================
Installing:
ftp x86_64 0.17-78.el8 appstream 69 k
vsftpd x86_64 3.0.3-36.el8 appstream 180 k
Transaction Summary
=====================================================================================
Install 2 Packages
Total download size: 249 k
Installed size: 457 k
Downloading Packages:
(1/2): ftp-0.17-78.el8.x86_64.rpm 91 kB/s | 69 kB 00:00
(2/2): vsftpd-3.0.3-36.el8.x86_64.rpm 118 kB/s | 180 kB 00:01
-------------------------------------------------------------------------------------
Total 162 kB/s | 249 kB 00:01
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : vsftpd-3.0.3-36.el8.x86_64 1/2
Running scriptlet: vsftpd-3.0.3-36.el8.x86_64 1/2
Installing : ftp-0.17-78.el8.x86_64 2/2
Running scriptlet: ftp-0.17-78.el8.x86_64 2/2
Verifying : ftp-0.17-78.el8.x86_64 1/2
Verifying : vsftpd-3.0.3-36.el8.x86_64 2/2
Installed:
ftp-0.17-78.el8.x86_64 vsftpd-3.0.3-36.el8.x86_64
Complete!
- 启动vsftpd服务并关闭防火墙
[root@ftp-server ~]# systemctl stop firewalld
[root@ftp-server ~]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor prese>
Active: inactive (dead)
Docs: man:firewalld(1)
[root@ftp-server ~]# systemctl start vsftpd
[root@ftp-server ~]# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: >
Active: active (running) since Sun 2024-12-01 23:17:42 CST; 5s ago
Process: 1779 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, sta>
Main PID: 1780 (vsftpd)
Tasks: 1 (limit: 12166)
Memory: 584.0K
CGroup: /system.slice/vsftpd.service
└─1780 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
Dec 01 23:17:42 localhost.localdomain systemd[1]: Starting Vsftpd ftp daemon...
Dec 01 23:17:42 localhost.localdomain systemd[1]: Started Vsftpd ftp daemon.
五、vsftpd的配置文件解释
5.1 vsftpd服务程序的主配置文件(/etc/vsftpd/vsftpd.conf)
[root@ftp-server ~]# cat /etc/vsftpd/vsftpd.conf | grep -v "#" // grep -v "#" 过滤掉包含注释的行(含有“#”的行)
anonymous_enable=NO // 禁止匿名用户登录FTP服务器
local_enable=YES // 允许本地用户(即系统用户)登录FTP服务器
write_enable=YES // 允许用户在FTP服务器上进行写操作(如上传文件)
local_umask=022 // 设置本地用户上传文件的默认权限掩码,022 表示上传的文件对其他用户可读,但不可写
dirmessage_enable=YES // 启用目录消息功能,登录时显示目录的欢迎信息
xferlog_enable=YES // 启用FTP传输日志记录,记录文件传输的详细信息
connect_from_port_20=YES // 启用使用端口20进行数据传输的模式
xferlog_std_format=YES // 使用标准格式记录传输日志
listen=NO // 禁止vsftpd监听IPv4地址(改为使用IPv6)
listen_ipv6=YES // 启用vsftpd监听IPv6地址
pam_service_name=vsftpd // 配置PAM(Pluggable Authentication Module)服务名称,用于身份验证
userlist_enable=YES // 启用用户列表功能,只允许在用户列表中的用户登录FTP服务器
5.2 FTP数据库文件说明
/etc/pam.d/vsftpd
这是 vsftpd 服务的PAM(可插拔认证模块)配置文件,主要用于加强用户认证。当用户登录时,PAM会检查用户的身份是否有效。这个配置文件可以用来设置额外的安全措施,比如强密码策略、多因素认证等。
5.2 FTP用户列表文件说明
/etc/vsftpd/ftpusers
这个文件包含了不允许登录 vsftpd 服务的用户。默认情况下,这个文件中会列出一些系统用户,如 root、bin、daemon 等,防止这些系统账户通过FTP进行访问。
5.2 FTP拒绝访问列表说明
/etc/vsftpd/user_list
这个文件包含了一个用户列表,根据 vsftpd.conf 配置文件中的 userlist_deny 设置,用户列表中的用户可能被拒绝访问FTP服务,也可能被允许访问。
如果 userlist_deny=NO,则只有文件中的用户可以访问FTP服务。
如果 userlist_deny=YES,则文件中的用户被拒绝访问FTP服务,其他用户可以访问。
5.2 FTP默认目录说明
/var/ftp
这个目录是 vsftpd 服务的默认文件存放位置,里面通常包含一个名为 pub 的子目录,供用户上传或下载文件。默认情况下,所有目录内容都是只读的,用户只能下载文件,不能进行修改或上传。
六、配置匿名用户FTP服务器
6.1 认证方式
vsftpd允许用户通过三种认证方式登录到FTP服务器,分别是匿名用户、本地用户和虚拟用户。每种方式的登录方式不同
-
匿名用户:
匿名用户是指任何人都可以不输入用户名和密码,直接登录FTP服务器。这种方式通常用于公共FTP服务器,允许任何人访问服务器上的公开资源。 -
本地用户:
本地用户是指服务器上已经存在的用户账户,通过输入用户名和密码进行登录。这种方式适用于需要更高安全性和权限控制的情况。 -
虚拟用户:
虚拟用户是指并不直接对应系统中的用户账户,而是通过一个虚拟的认证系统进行登录。即使黑客破解了虚拟用户的登录信息,也无法直接访问系统中的真实账户,提高了安全性。
6.2 匿名用户登录
参数 | 作用 |
---|---|
anonymous_enable=YES | 允许匿名用户访问FTP服务器 |
anon_umask=022 | 设置匿名用户上传文件时的默认权限掩码,022 表示上传的文件对其他用户可读,但不可写 |
anon_upload_enable=YES | 允许匿名用户上传文件到FTP服务器 |
anon_mkdir_write_enable=YES | 允许匿名用户在FTP服务器上创建新目录 |
anon_other_write_enable=YES | 允许匿名用户修改目录名称或删除目录 |
6.3 匿名用户登录FTP服务器配置示例
要求:搭建FTP服务器,允许匿名用户上传和下载文件,设置匿名用户根目录为/var/ftp
- 新建测试文件 编辑主配置文件
[root@ftp-server ~]# touch /var/ftp/pub/sample.tar
[root@ftp-server ~]# ll /var/ftp/pub
total 0
-rw-r--r--. 1 root root 0 Dec 1 23:41 sample.tar
- 在 /etc/vsftpd/vsftpd.conf 修改以下四行(数字表示行号)
12 anonymous_enable=YES
28 anon_upload_enable=YES # 允许上传文件 如果前面有# 删除最前面的 “#”
32 anon_mkdir_write_enable=YES # 允许创建文件
- 重启FTP服务器
[root@ftp-server ~]# chmod 777 /var/ftp/pub // 给目录所属设置为ftp
[root@ftp-server ~]# systemctl restart vsftpd
[root@ftp-server ~]# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: >
Active: active (running) since Sun 2024-12-01 23:49:27 CST; 11s ago
Process: 1872 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, sta>
Main PID: 1873 (vsftpd)
Tasks: 1 (limit: 12166)
Memory: 572.0K
CGroup: /system.slice/vsftpd.service
lines 1-8
- 在windows客户端上输入ftp://10.0.0.8打开pub目录
七、企业级配置本地用户FTP服务器
7.1 FTP服务器配置要求
公司新增了一台FTP服务器和Web服务器,主要用于维护公司网站的内容,例如上传文件、创建目录和更新网页等。公司有两个部门负责这些任务,分别使用 team1 和 team2 账号来管理。这两个部门将只允许 team1 和 team2 账号登录FTP服务器。
7.2 要求
将FTP服务器和Web服务器放在一起是常见的做法,因为这样有助于网站的维护。为了提高安全性,服务器配置需要满足以下要求:
- 仅允许本地用户访问:禁止匿名用户登录FTP服务器。
- 限制 team1 和 team2 的访问目录:这两个账号只能访问并管理 /web/www/html 目录,确保他们无法访问服务器上的其他文件和目录。
7.3 解决方案
- 建立维护网站内容的FTP账号 并 禁止本地登录 为其设置密码
[root@ftp-server ~]# mkdir -p /web/www/html // 创建team1和team2的所属目录
[root@ftp-server ~]# useradd team1 -d /web/www/html // 禁止登录本地并指定家录
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
[root@ftp-server ~]# useradd team2 -d /web/www/html
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
[root@ftp-server ~]# useradd user1 -d /web/www/html
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
[root@ftp-server ~]# eacho "12345" | passwd --stdin user1 // 设置密码
-bash: eacho: command not found
Changing password for user user1.
passwd: Authentication token manipulation error
[root@ftp-server ~]# echo "12345" | passwd --stdin user1
Changing password for user user1.
passwd: all authentication tokens updated successfully.
[root@ftp-server ~]# echo "12345" | passwd --stdin team1
Changing password for user team1.
passwd: all authentication tokens updated successfully.
[root@ftp-server ~]# echo "12345" | passwd --stdin team2
Changing password for user team2.
passwd: all authentication tokens updated successfully.
- 配置vsftpd.conf主配置文件增加或修改相应内容
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf
12 anonymous_enable=NO # 不允许匿名用户访问
13 local_root=/web/www/html # 添加这一行
102 chroot_list_enable=YES # 取消注释 激活chroot功能
104 chroot_list_file=/etc/vsftpd/chroot_list # 取消注释 锁定用户在根目录种的列表文件
105 allow_writeable_chroot=YES # 启用chroot就一定加入这条:允许chroot限制
106 write_enable=yes
- 建立/etc/vsftpd/chroot_list文件、添加team1、team2账号
[root@ftp-server ~]# vim /etc/vsftpd/vsftpd.conf
[root@ftp-server ~]# vim /etc/vsftpd/chroot_list
team1
team2
- 创建测试文件 并赋予目录权限值
[root@ftp-server ~]# touch /web/www/html/test.tar
[root@ftp-server ~]# chmod -R 777 /web/www/html/test.tar
[root@ftp-server ~]# ll /web/www/html/test.tar
-rwxrwxrwx. 1 root root 0 Dec 2 00:15 /web/www/html/test.tar
- 重启ftp服务
[root@ftp-server ~]# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: >
Active: active (running) since Mon 2024-12-02 00:16:35 CST; 15s ago
Process: 1948 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, sta>
Main PID: 1949 (vsftpd)
Tasks: 1 (limit: 12166)
chroot_list=YES 时:
如果设置 chroot_list=YES,表示在 /etc/vsftpd/chroot_list 文件中列出的用户可以访问服务器的所有目录。换句话说,只有这些用户不会被限制在他们的主目录或指定目录内,他们可以自由浏览和访问服务器的其他文件系统目录。
chroot_list=NO 时:
如果设置 chroot_list=NO,则 /etc/vsftpd/chroot_list 文件中列出的用户会被锁定在特定的目录中,无法访问服务器上的其他目录。其他没有列出的用户则不受限制,可以访问整个文件系统。
- 测试
- 限制在本地目录的team1
[root@ftp-server ~]# ftp localhost 21
Trying ::1...
Connected to localhost (::1).
220 (vsFTPd 3.0.3)
Name (localhost:root): team1 // 输入需要登录的用户team1或者team2
331 Please specify the password.
Password: // 输入密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd // 查看当前目录
257 "/" is the current directory
ftp> cd /etc // 进入etc目录,失败 权限不足
550 Failed to change directory.
ftp> exit
- 不限制在本地用户的user1
[root@ftp-server ~]# ftp localhost 21
Trying ::1...
Connected to localhost (::1).
220 (vsFTPd 3.0.3)
Name (localhost:root): user1 // 输入需要登录的用户user1
331 Please specify the password.
Password: // 输入密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd // 查看当前目录
257 "/web/www/html" is the current directory
ftp> cd /etc // 进入etc目录,成功
250 Directory successfully changed.
ftp> exit
八、配置虚拟用户FTP服务器
- 要求
需要配置 FTP 服务器,允许虚拟用户 user2 和 user3 登录,并将他们的主目录设置为 /var/ftp/vuser。同时,这些用户只能查看文件,不能进行上传、修改或删除操作。
具体要求:
- 虚拟用户登录:使用 user2 和 user3 虚拟用户账号登录FTP服务器。
- 设置主目录:他们的主目录都被设置为 /var/ftp/vuser,即他们登录后只能访问该目录。
- 只读权限:这两个用户只能查看目录和文件内容,无法上传、修改或删除文件。
- 创建用户文本文件
[root@ftp-server ~]# cd /etc/vsftpd // 进入目录
[root@ftp-server vsftpd]# vim vuser // 创建文本文件
- 生成数据库
为了让系统能够使用虚拟用户的账号和密码,需要将这些信息存储在一个数据库文件中,而不是简单的文本文件。因为系统不能直接读取文本文件中的虚拟账号和密码。为了转换,首先需要使用 db_load 命令将文本文件转换成数据库格式,这样 vsftpd 才能通过数据库文件来验证虚拟用户的登录信息。
[root@ftp-server vsftpd]# db_load -T -t hash -f vuser vuser.db
- 配置PAM文件
为了让FTP服务器能够使用数据库中的虚拟用户账号进行身份验证,我们需要配置PAM(可插拔认证模块)。PAM 是一种身份验证框架,它允许系统通过不同的方式验证用户身份,包括使用数据库文件来验证虚拟用户。
修改vsftpd的PAM配置
打开 vsftpd 的PAM配置文件 /etc/pam.d/vsftpd,然后注释掉文件中的默认配置行。在这些行前加上 # 来禁用它们,这样系统就不会使用默认的身份验证方式,而是改为使用数据库文件中的虚拟用户信息进行验证。
##%PAM-1.0
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
auth required pam_userdb.so dn=/etc/vsftpd/vuser
account required pam_userdb.so dn=/etc/vsftpd/vuser
- 编辑主配置文件 【/etc/vsftpd/vsftpd.conf】
[root@ftp-server vsftpd]# vim /etc/vsftpd/vsftpd.conf # 在最后添加下面四行
131 guest_enable=YES
132 guest_username=vuser
133 user_config_dir=/etc/vsftpd/vuser_conf
134 allow_writeable_chroot=YES
- 配置虚拟用户权限
[root@ftp-server ~]# cd /etc/vsftpd
[root@ftp-server vsftpd]# mkdir vuser_conf
[root@ftp-server vsftpd]# cd vuser_conf/
[root@ftp-server vuser_conf]# vim user2
[root@ftp-server vuser_conf]# vim user3
[root@ftp-server vuser_conf]# cat user2
local_root=/var/ftp/vuser
[root@ftp-server vuser_conf]# cat user3
local_root=/var/ftp/vsuer
- 创建测试文件
[root@ftp-server ~]# cd /var/ftp/
[root@ftp-server ftp]# ll
total 0
drwxr-xr-x. 2 root root 24 Dec 1 23:41 pub
[root@ftp-server ftp]# mkdir vuser
[root@ftp-server ftp]# cd
[root@ftp-server ~]# touch /var/ftp/vuser/user2.tar
[root@ftp-server ~]# touch /var/ftp/vuser/user2.ta3
- 重启测试
# 重启服务
[root@ftp-server vuser_conf]# systemctl restart vsftpd
# 登录user2
[root@ftp-server vuser_conf]# ftp localhost 21
Trying ::1...
Connected to localhost (::1).
220 (vsFTPd 3.0.2)
Name (localhost:root): user2
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||60168|).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jun 06 18:46 user2.tar
-rw-r--r-- 1 0 0 0 Jun 06 18:46 user3.tar
# user2其他权限测试
ftp> cd /etc/ # 进入其它目录权限
550 Failed to change directory. # 失败
ftp> mkdir user2 # 创建文件权限
550 Permission denied. # 失败
# 登录user3
[root@ftp-server vuser_conf]# ftp localhost 21
Trying ::1...
Connected to localhost (::1).
220 (vsFTPd 3.0.2)
Name (localhost:root): user3
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||28511|).
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Jun 06 19:03 user2.tar
-rw-r--r-- 1 0 0 0 Jun 06 19:03 user3.tar
# user3其他权限测试
ftp> cd /etc/ # 进入其它目录权限
550 Failed to change directory. # 失败
ftp> mkdir user3 # 创建文件权限
550 Permission denied. # 失败