十二、FTP服务器配置与应用

FTP(File Transfer Protocol)是文件传输协议的简称,用于控制文件的双向传输,同时,它也
是一个应用程序(Application)。用户可以通过该软件把使用的计算机与世界各地所有运行基
于FTP协议的服务器相连,以访问服务器上的大量程序和信息。

1、FTP概述

FTP是在TCP/IP网络和因特网上最早使用的、进行文件传输的协议之一,可以在主机间共享文
件。它属于ISO网络结构中的应用层。
文件传输是Internet提供的一项基本服务,通过Internet,可以把文件从一台计算机传送到另一
台计算机。文件传输服务必须遵循文件传输协议——FTP。
当启动FTP从远程计算机复制文件时,事实上启动了两个程序:一个是本地机上的FTP客户程
序,它向FTP服务器提出复制文件的请求;另一个是启动在远程计算机上的FTP服务器程序,它
响应客户机的请求把指定的文件传送到本地机中。FTP采用“客户机/服务器”方式,客户端要
在自己的本地计算机上安装FTP客户程序。

1.1、FTP连接与传输模式

1.1.1、FTP连接与连接模式

控制连接:TCP 21,用来接收客户端发送的命令,并给予响应的。
数据连接:TCP 20,用于数据通道,负责实际的数据传输,包括上传、下载数据。
数据连接的建立类型:
主动模式:服务端从 20 端口主动向客户端发起连接
被动模式:服务端在指定范围内某个端口被动等待客户端连接
解释:
**FTP(文件传输协议)**主要使用两个TCP端口:21和20。这两个端口分别用于不同的目的,以支
持FTP的操作。
TCP 21端口(控制端口)
用途:TCP 21端口主要用于控制通道。这个通道负责传输FTP会话期间的所有控制信息,包
括用户认证(登录名和密码)、命令传输(如列出文件、更改目录、删除文件等)和响应消
息。
特点:在整个FTP会话期间,控制通道始终保持开启状态。这意味着客户端和服务器之间的
控制信息交换(如命令和响应)都通过这个端口进行。
TCP 20端口(数据端口)
用途:TCP 20端口主要用于数据通道,负责实际的数据传输,包括文件上传和下载以及目
录列表的传输。
特点:数据通道可以根据需要开启和关闭。在传输文件或目录列表时建立开启,传输完成后
关闭。与控制通道相比,它不是持久开启的。
工作模式
FTP有两种工作模式:主动模式(Active Mode)和被动模式(Passive Mode),这两种模式
影响数据通道(TCP 20端口)的工作方式:
主动模式:服务器主动连接到客户端指定的数据端口来传输数据。在这种模式下,客户端通
过控制通道发送PORT命令,告知服务器一个客户端上的端口号,服务器随后从自己的TCP
20端口连接到这个指定的客户端端口来传送数据。
被动模式:为了解决主动模式中防火墙和NAT导致的连接问题,被动模式允许客户端主动连
接到服务器上的一个随机打开的高端口。在这种模式下,客户端通过控制通道发送PASV命
令给服务器,服务器响应一个开放的高级端口号供数据连接使用,然后客户端从本地任意端
口连接到这个服务器上的高级端口。
总结来说,TCP 21端口用于控制信息的交换,而TCP 20端口在主动模式下用于数据传输。在被
动模式下,数据传输使用的是服务器上的随机高级端口而不是20端口。

1.1.2、FTP传输模式

文本模式:ASCII 模式,以文本序列传输数据
二进制模式:Binary 模式,以二进制序列传输数据
文字类一般采用ASC模式,图片视频等使用二进制方式。
FTP客户端和服务器在开始文件传输之前需要协商使用哪种传输模式。大多数现代FTP客户端会
根据文件类型自动选择合适的传输模式,但用户通常也可以手动指定所需的模式。

1.2、FTP用户的类型

FTP(文件传输协议)支持不同类型的用户身份,允许通过多种方式进行认证和访问控制。

1.2.1、匿名用户(Anonymous or FTP)

定义:允许用户无需提供个人认证信息就能登录FTP服务器。通常,当提示输入用户名时,
用户输入 anonymous 或 ftp ,并使用电子邮件地址作为密码(尽管大多数服务器并不验
证这个密码)。
用途:主要用于公共文件共享,允许公众下载或查看特定的文件和目录,而不允许上传或
修改。
配置:服务器管理员需要特别配置FTP服务器以启用匿名访问,并设置适当的权限来保护系统安全。

1.2.2本地用户

定义:这些是在服务器操作系统中具有账户的用户。他们的账户名称、密码等身份验证信息保存在操作系统的用户数据库中,如Linux/Unix系统的 /etc/passwd 和 /etc/shadow文件。
用途:本地用户通常用于内部或受信任的用户群体,允许他们上传、下载、删除和修改文件,具体权限取决于服务器的配置和用户的权限设置。
配置:管理员需要确保每个本地用户都有适当的目录权限,并且FTP服务正确地与操作系统的身份验证系统集成。

1.2.3、虚拟用户

定义:虚拟用户不是操作系统中的实际账户,而是仅存在于FTP服务的配置中。他们使用独
立的账户/密码数据文件进行身份验证,这使得管理更加灵活,并提高了安全性。
用途:适用于需要为用户提供FTP访问权限但不希望赋予他们操作系统级别访问权限的场
景。这种方式便于管理大量用户,并可以更细致地控制每个用户的权限。
配置:管理员需要在FTP服务器上配置虚拟用户支持,并维护一个包含用户名和密码的独立
数据文件。此外,还需要为每个虚拟用户设置适当的访问权限和目录限制。

1.2.4、常见的 FTP 服务器程序

IIS、Serv-U
wu-ftpd、Proftpd
vsftpd(Very Secure FTP Daemon)
1.2.5、常见的 FTP 客户端程序
ftp 命令
CuteFTP、FlashFXP、LeapFTP、Filezilla
gftp、kuftp

2、Vsftpd 服务基础

2.1、安装vsftpd

官方站点:http://vsftpd.beasts.org/

[root@ftp ~]# rpm -q vsftpd
未安装软件包 vsftpd
[root@ftp ~]# yum -y install vsftpd

主程序:/usr/sbin/vsftpd
服务名:vsftpd
用户控制列表文件
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
主配置文件
/etc/vsftpd/vsftpd.conf

2.2、主配置文件——vsftpd.conf

vsftpd.conf 是vsftpd(Very Secure FTP Daemon)的主配置文件,通过它可以调整和控制
FTP服务器的行为和属性。

2.1、常见的全局配置项及其解释

2.1.1、界面和消息

dirmessage_enable=YES: 控制是否显示目录欢迎消息。

2.1.2、服务器行为和性能

listen=YES: 控制vsftpd是否以独立服务的方式运行,监听FTP请求。
listen_address=192.168.4.1: 指定vsftpd监听的IP地址。
listen_port=21: 设置vsftpd监听的端口号。
max_clients=0: 限制并发客户端连接数,0表示无限制。
max_per_ip=0: 限制同一IP地址的并发连接数,0表示无限制。

2.1.3、文件传输和日志

write_enable=YES: 控制是否允许FTP命令更改文件系统(如上传、删除文件)。
download_enable=YES: 控制是否允许下载文件。
connect_from_port_20=YES: 控制服务器是否从端口20(FTP数据端口)发起数据连
接。
xferlog_enable=YES: 启用传输日志记录。

2.1.4、安全和访问控制

userlist_enable=YES: 启用用户列表文件,用于控制访问权限。
userlist_deny=YES: 设置为YES时,列表中的用户将被拒绝访问。
tcp_wrappers=YES: 启用tcp_wrappers支持,进行基于主机名、IP地址的访问控制。
pam_service_name=vsftpd: 指定PAM服务进行用户认证。

2.1.5、匿名用户配置

anonymous_enable=YES: 启用匿名用户访问。
anon_root=/var/ftp: 指定匿名用户的根目录。
anon_umask=022: 设置匿名用户上传文件的权限掩码。
anon_upload_enable=YES: 允许匿名用户上传文件。
anon_mkdir_write_enable=YES: 允许匿名用户创建目录。
anon_other_write_enable=YES: 允许匿名用户执行其他写操作。
anon_max_rate=0: 设置匿名用户的最大传输速率,0表示无限制。

2.1.6、本地用户配置

local_enable=YES: 启用本地用户登录。
local_root=/var/ftp: 设置本地用户的根目录。
local_umask=022: 设置本地用户上传文件的权限掩码。
local_max_rate=0: 设置本地用户的最大传输速率,0表示无限制。
chroot_local_user=YES: 将本地用户限制在其主目录中

3、FTP服务构建

3.1、匿名访问

构建流程
准备匿名FTP访问的目录
默认情况下,匿名用户被限制在/var/ftp目录。确保此目录存在,并设置了正确的权限:

[root@vsftpd ~]# ls /var/ftp/
pub
[root@vsftpd ~]# touch /var/ftp/pub/pub.test
[root@vsftpd ~]# chown -R ftp:ftp /var/ftp/pub/
[root@vsftpd ~]# ll /var/ftp/
总用量 0
drwxr-xr-x 2 ftp ftp 22 5月 13 21:04 pub

开放匿名用户配置并启动vsftpd服务

[root@vsftpd vsftpd]# vim vsftpd.conf
anonymous_enable=YES
local_enable=NO
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
[root@vsftpd vsftpd]# systemctl start vsftpd
[root@vsftpd vsftpd]# systemctl status vsftpd
[root@vsftpd vsftpd]# systemctl enable vsftpd
[root@vsftpd vsftpd]# netstat -anupt | grep ftp
tcp6 0 0 :::21 :::* LISTEN
21750/vsftpd

测试匿名FTP服务器

[root@vsftpd ~]# ftp 172.22.1.10
Connected to 172.22.1.10 (172.22.1.10).
220 (vsFTPd 3.0.2)
Name (172.22.1.10:root): ftp //输入用户名ftp
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 (172,22,1,10,120,16).
150 Here comes the directory listing.
drwxr-xr-x 2 14 50 22 May 13 13:04 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (172,22,1,10,29,62).
150 Here comes the directory listing.
-rw-r- r- 1 14 50 0 May 13 13:04 pub.test
226 Directory send OK.
ftp> lcd /opt/ //将本地目录切换到/opt
Local directory now /opt
ftp> get pub.test //下载测试文件
local: pub.test remote: pub.test
227 Entering Passive Mode (172,22,1,10,174,75).
150 Opening BINARY mode data connection for pub.test (0 bytes).
226 Transfer complete.
ftp> lcd /root //切换本地目录到/root
Local directory now /root
ftp> put install.sh //上传文件到ftp服务器
local: install.sh remote: install.sh
227 Entering Passive Mode (172,22,1,10,29,10).
150 Ok to send data.
226 Transfer complete.
2413 bytes sent in 0.000383 secs (6300.26 Kbytes/sec)
ftp> quit
221 Goodbye.
查看验证
[root@vsftpd ~]# ls /opt/
pub.test
[root@vsftpd ~]# ls /var/ftp/pub/
install.sh pub.test
[root@vsftpd ~]# wget ftp://172.22.1.10/pub/pub.test
--2024-05-13 21:25:36-- ftp://172.22.1.10/pub/pub.test
=> “pub.test”
正在连接 172.22.1.10:21... 已连接。
正在以 anonymous 登录 ... 登录成功!
==> SYST ... 完成。 ==> PWD ... 完成。
==> TYPE I ... 完成。 ==> CWD (1) /pub ... 完成。
==> SIZE pub.test ... 完成。
==> PASV ... 完成。 ==> RETR pub.test ... 完成。
[ <=> ] 0 --.-K/s 用时 0s
2024-05-13 21:25:36 (0.00 B/s) - “pub.test” 已保存 [0]
[root@vsftpd ~]# ls
anaconda-ks.cfg install.sh pub.test

3.2、用户验证

构建流程
修改vsftpd.conf配置文件
启用本地用户访问
结合user_list文件灵活控制用户访问

启用本地用户访问
添加本地用户并设置密码
[root@vsftpd ~]# useradd tom
[root@vsftpd ~]# useradd jerry
[root@vsftpd ~]# passwd tom
[root@vsftpd ~]# passwd jerry
修改配置文件并添加相应配置项
[root@vsftpd ~]# vim /etc/vsftpd/vsftpd.conf
local_enable=YES
write_enable=YES
local_umask=077
chroot_local_user=YES
allow_writeable_chroot=YES
[root@vsftpd ~]# systemctl restart vsftpd
登录验证:此时ftp的共享目录为该用户的家目录
[root@vsftpd ~]# ftp 172.22.1.10
Connected to 172.22.1.10 (172.22.1.10).
220 (vsFTPd 3.0.2)
Name (172.22.1.10:root): tom
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 (172,22,1,10,63,118).
150 Here comes the directory listing.
226 Directory send OK.
ftp> lcd /root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Local directory now /root
ftp> put install.sh
local: install.sh remote: install.sh
227 Entering Passive Mode (172,22,1,10,155,154).
150 Ok to send data.
226 Transfer complete.
2413 bytes sent in 3.2e-05 secs (75406.25 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (172,22,1,10,253,180).
150 Here comes the directory listing.
-rw- 1 1000 1000 2413 May 13 13:45 install.sh
226 Directory send OK.
ftp> quit
221 Goodbye.
[root@vsftpd ~]# ls /home/tom/
install.sh

**local_umask=022 和 local_umask=077 的区别
local_umask=022
当设置为 022 时,新上传的文件默认去除同组用户和其他用户的写权限。这意味着如
果一个文件被上传并且没有明确指定权限,它将默认赋予 755(对于目录)或 644(对
于文件)的权限:
文件所有者将拥有读、写和执行权限(如果适用)。
同组用户和其他用户将拥有读和执行权限,但没有写权限。
这是一个较为宽松的设置,适用于希望共享读取权限而限制写权限的场景。
local_umask=077
当设置为 077 时,新上传的文件默认去除同组用户和其他用户的所有权限。这意味着新
上传的文件或目录将仅对所有者开放所有权限(700 对于目录,600 对于文件):
文件所有者将拥有读、写和执行权限。
同组用户和其他用户将没有任何权限。
这是一个较为严格的设置,适用于需要严格隐私保护的场景,确保只有文件所有者可以
访问这些文件或目录。
选择哪种 umask 设置取决于你希望如何平衡便利性和安全性。在多用户环境中,更严
格的 umask 设置(如 077)可以提供更高级别的安全保护,防止未经授权的访问。
**

用户列表访问控制
user_list 文件是用于控制用户的访问权限。这个文件通常位于 /etc/vsftpd/ 目录下
添加tom到user_list
[root@vsftpd ~]# echo tom >> /etc/vsftpd/user_list
[root@vsftpd ~]# cat /etc/vsftpd/user_list
tom
修改配置文件,添加相应配置项
[root@vsftpd ~]# vim /etc/vsftpd/vsftpd.conf
userlist_enable=YES
userlist_deny=NO
[root@vsftpd ~]# systemctl restart vsftpd
验证:tom可以登录,jerry不能登录
[root@vsftpd ~]# ftp 172.22.1.10
Connected to 172.22.1.10 (172.22.1.10).
220 (vsFTPd 3.0.2)
Name (172.22.1.10:root): jerry
530 Permission denied.
Login failed.
ftp> quit
221 Goodbye.
[root@vsftpd ~]# ftp 172.22.1.10
Connected to 172.22.1.10 (172.22.1.10).
220 (vsFTPd 3.0.2)
Name (172.22.1.10:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221 Goodbye.

3.3其他配置项

3.3.1、修改监听地址和端口

修改配置文件并添加配置项
[root@vsftpd ~]# vim /etc/vsftpd/vsftpd.conf
listen=YES
listen_address=192.168.48.153
listen_port=2121
listen_ipv6=NO
验证:此时原172地址已经不能访问
[root@vsftpd ~]# ftp 172.22.1.10
ftp: connect: 拒绝连接
ftp> quit
[root@vsftpd ~]# ftp 192.168.48.153 2121
Connected to 192.168.48.153 (192.168.48.153).
220 (vsFTPd 3.0.2)
Name (192.168.48.153:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quit
221 Goodbye.

3.3.2、开启被动模式

在vsftpd中,默认情况下,被动模式是允许的。pasv_enable这个配置选项默认是开启的,即使
你没有在vsftpd.conf配置文件中明确添加pasv_enable=YES,系统也会默认将其视为启用状
态。这意味着,即使不在配置文件中明确设置,vsftpd也会允许客户端使用被动模式进行连接。

[root@vsftpd ~]# vim /etc/vsftpd/vsftpd.conf
pasv_enable=YES
pasv_min_port=24500
pasv_max_port=24600
[root@vsftpd ~]# ftp 172.22.1.10
Connected to 172.22.1.10 (172.22.1.10).
220 (vsFTPd 3.0.2)
Name (172.22.1.10:root): tom
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode off.
ftp> passive
Passive mode on.
ftp> ls
227 Entering Passive Mode (172,22,1,10,46,57).
150 Here comes the directory listing.
-rw- 1 1000 1000 2413 May 13 13:45 install.sh
226 Directory send OK.
ftp> lcd /opt/
Local directory now /opt
ftp> get install.sh
local: install.sh remote: install.sh
227 Entering Passive Mode (172,22,1,10,108,137).
150 Opening BINARY mode data connection for install.sh (2413 bytes).
226 Transfer complete.
2413 bytes received in 8.2e-05 secs (29426.83 Kbytes/sec)
ftp> passive
Passive mode off.
ftp> get install.sh
local: install.sh remote: install.sh
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for install.sh (2413 bytes).
226 Transfer complete.
2413 bytes received in 0.00013 secs (18561.54 Kbytes/sec)

3.3.3、限制连接的并发数、传输速率

[root@vsftpd ~]# vim /etc/vsftpd/vsftpd.conf
max_clients=10
max_per_ip=2
anon_max_rate=50000
local_max_rate=200000

3.4、基于虚拟用户的FTP服务

3.4.1、构建账号数据

建立虚拟 FTP 用户的帐号数据库文件

1、建立文本格式的用户名、密码列表
[root@l]# vim /etc/vsftpd/vusers.list
xiaoqiang
123
xiaohua
123
2、建立berkeley DB格式的数据库文件
[root@vsftpd ~]# cd /etc/vsftpd/
[root@vsftpd vsftpd]# db_load -T -t hash -f vusers.list vusers.db
[root@vsftpd vsftpd]# file vusers.db
vusers.db: Berkeley DB (Hash, version 9, native byte-order)
[root@vsftpd vsftpd]# chmod 600 /etc/vsftpd/vusers.*

创建 FTP 根目录及虚拟用户映射的系统用户

添加虚拟用户的映射账号、ftp根目录
[root@vsftpd vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@vsftpd vsftpd]# chmod 755 /var/ftproot/

建立支持虚拟用户的 PAM 认证文件

1)为虚拟用户建立PAM认证文件
[root@vsftpd vsftpd]# vi /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
2)修改vsftpd配置文件,添加虚拟用户支持
[root@vsftpd vsftpd]# vim vsftpd.conf
删除:userlist_enable=YES
local_enable=yes
write_enable=YES
anon_umask=022
pam_service_name=vsftpd.vu
guest_enable=yes
guest_username=virtual
allow_writeable_chroot=YES
3)为不同的虚拟用过户建立独立的配置文件
[root@vsftpd vsftpd]# mkdir /etc/vsftpd/vusers_dir
[root@vsftpd vsftpd]# vim /etc/vsftpd/vusers_dir/xiaoqiang
anon_upload_enable=yes
anon_mkdir_write_enable=yes
[root@vsftpd vsftpd]# touch xiaohua
[root@vsftpd vsftpd]# vim vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir

验证:小强可以浏览文件、下载文件、上传文件、创建目录;小花只能浏览文件、下载文

小强:
[root@vsftpd ~]# ftp 172.22.1.10
Connected to 172.22.1.10 (172.22.1.10).
220 (vsFTPd 3.0.2)
Name (172.22.1.10:root): xiaoqiang
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 (172,22,1,10,90,148).
150 Here comes the directory listing.
-rw-r- r- 1 0 0 0 May 13 17:59 get_test
226 Directory send OK.
ftp> lcd /root
Local directory now /root
ftp> get get_test
local: get_test remote: get_test
227 Entering Passive Mode (172,22,1,10,106,111).
150 Opening BINARY mode data connection for get_test (0 bytes).
226 Transfer complete.
ftp> put put_test
local: put_test remote: put_test
227 Entering Passive Mode (172,22,1,10,236,153).
150 Ok to send data.
226 Transfer complete.
ftp> mkdir creat_test
257 "/creat_test" created
ftp> quit
221 Goodbye.
[root@vsftpd ~]# ls /root
anaconda-ks.cfg get_test install.sh put_test
[root@vsftpd ~]# ls /opt/ftproot/
creat_test get_test put_test
小花测试
[root@vsftpd ftproot]# ftp 172.22.1.10
Connected to 172.22.1.10 (172.22.1.10).
220 (vsFTPd 3.0.2)
Name (172.22.1.10:root): xiaohua
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 (172,22,1,10,142,226).
150 Here comes the directory listing.
-rw-r- r- 1 0 0 0 May 13 17:59 get_test
226 Directory send OK.
ftp> lcd /root
Local directory now /root
ftp> get get_test
local: get_test remote: get_test
227 Entering Passive Mode (172,22,1,10,102,192).
150 Opening BINARY mode data connection for get_test (0 bytes).
226 Transfer complete.
ftp> put put_test
local: put_test remote: put_test
227 Entering Passive Mode (172,22,1,10,182,151).
550 Permission denied.
ftp> mkdir creat_test
550 Permission denied.
ftp> quit
221 Goodbye.
[root@vsftpd ftproot]# ls /root
anaconda-ks.cfg get_test install.sh put_test
[root@vsftpd ftproot]# ls /opt/ftproot/
get_test
© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容