VSFTP文件服务器

主动模式和被动模式

FTP基于TCP协议,有两个端口,一个数据端口一个控制端口(命令端口),控制端口为21,数据端口根据模式的不同,端口也并不固定为20。

主动模式:PORT

客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口,也就是21端口。然后客户端开始 监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。接着服务器会从它自己的数据端口(20)连接到客户端指定的数据端口(N+1)。
简要概括:
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。

针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:
1. 任何大于1024的端口到FTP服务器的21端口。(客户端初始化的连接)
2. FTP服务器的21端口到大于1024的端口。 (服务器响应客户端的控制端口)
3. FTP服务器的20端口到大于1024的端口。(服务器端初始化数据连接到客户端的数据端口)
4. 大于1024端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口)

开启主动模式:
pasv_enable=no
若设置为YES,则使用PASV工作模式;若设置为NO,则使用PORT模式。默认值为YES,即使用PASV工作模式。

主动模式下:
SecureFX工具去连接ftp,客户没有允许开放端口,服务器没法与客户端相连接,关闭客户端防火墙

被动模式:PASV

在被动方式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从服务器到客户端的数据端口的入方向连接被防火墙过滤掉的问题。
当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口(N > 1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交 PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。

对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:
1. 从任何大于1024的端口到服务器的21端口 (客户端初始化的连接)
2. 服务器的21端口到任何大于1024的端口 (服务器响应到客户端的控制端口的连接)
3. 从任何大于1024端口到服务器的大于1024端口 (客户端初始化数据连接到服务器指定的任意端口)
4. 服务器的大于1024端口到远程的大于1024的端口(服务器发送ACK响应和数据到客户端的数据端口)

简要概括:
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,
服务器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来传送数据。

开启被动模式
默认是开启的,但是要指定一个端口范围,打开vsftpd.conf文件,在后面加上
pasv_enable=yes
若设置为YES,则使用PASV工作模式;若设置为NO,则使用PORT模式。默认值为YES,即使用PASV工作模式。
pasv_min_port=30000
在PASV工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口。默认值为0。
pasv_max_port=30999
在PASV工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口。默认值为0。

主动和被动的优缺点

主动模式对FTP服务器的管理有利,但对客户端的管理不利,因为FTP服务器企图与客户端的高位随机端口建立链接,而这个端口可能会被客户端的防火墙阻塞;
被动模式对FTP客户端管理有利,但对服务端管理不利,因为客户端要与服务端建立两个端口连接,其中一个高位随机端口可能会被服务器端的防火墙阻塞掉;
为了安全考虑就必须选择被动模式,幸运的是可以通过为服务器端指定一个有限的端口范围来减小端口的暴漏,不在范围内的端口就会被防火墙阻拦,危险性降低了。

简单概括:
主动模式(PORT)和被动模式(PASV),主动模式就是服务器端向客户端发起链接;被动模式就是客户端向服务器端发起链接;两者的共同点是都是用21端口进验证和管理,区别就在于传输数据的方式不同,PORT模式传输数据固定使用的20端口,PASV模式传输数据则是1025-65535之间随机。

配置文件

## 匿名配置
anonymous_enable=YES
# 是否允许匿名访问,默认允许;

write_enable=YES
# 是否允许登录用户有写权限,属于全局配置,默认允许;

no_anon_password=NO
# 匿名登录时是否询问密码,默认为NO;

ftp_username=ftp
# 定义匿名登入的使用者名称。默认值为ftp。

anon_root=/var/ftp
# 使用匿名登入时,所登入的目录。默认值为/var/ftp。注意ftp目录不能是777的权限属性,即匿名用户的家目录不能有777的权限。

anon_upload_enable=YES
# 匿名情况下允许上传,只有在write_enable=YES时,此项才有效;默认值为NO;

anon_world_readable_only=YES
# 允许匿名者下载可阅读文件,默认为YES

anon_mkdir_write_enable=YES
# 匿名情况下允许创建目录,只有在write_enable=YES时,此项才有效;

anon_other_write_enable=YES
# 允许匿名登陆者有更多除上传和创建目录之外的其他权限,例如删除或重命名,默认值为NO;

chown_uploads=YES/NO
# 设置是否改变匿名用户上传文件(非目录)的属主。默认值为NO。

chown_username=username
# 设置匿名用户上传文件(非目录)的属主名。建议不要设置为root。

anon_umask=077
# 设置匿名登入者新增或上传文件时的umask 值。默认值为077,则新建文件的对应权限为700。

deny_email_enable=YES/NO
# 若是启动这项功能,则必须提供一个档案/etc/vsftpd/banner_emails,内容为email address。若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。默认值为NO。

banned_email_file=/etc/vsftpd/banner_emails
# 此文件用来输入email address,只有在deny_email_enable=YES时,才会使用到此档案。若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入。

## 本地用户配置

local_enable=YES
# 是否允许本地用户访问,默认允许;文件/etc/vsftpd.ftpusers中的本地用户禁止登陆。

local_root=/home/username
# 当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。

local_umask=022
# 本地用户新增文件时的umask值。

file_open_mode=0755
# 本地用户上传档案后的档案权限,与chmod 所使用的数值相同。

## 欢迎语设置

dirmessage_enable=YES
# 如果启动这个选项,那么使用者第一次进入一个目录时,会检查该目录下是否有.message这个文件,如果有,则会出现此文件的内容,通常这个文件会放置欢迎话语,或是对该目录的说明。

message_file=.message
# 设置目录消息文件,可将要显示的信息写入该文件。默认值为.message。

banner_file=/etc/vsftpd/banner
# 当使用者登入时,会显示此设定所在的档案内容,通常为欢迎话语或是说明。默认值为无。如果欢迎信息较多,则使用该配置项。

ftpd_banner=Welcome to blah FTP service.
# 这里用来定义欢迎话语的字符串,banner_file是档案的形式,而ftpd_banner 则是字符串的形式。

## 控制是否切换上级目录

chroot_list_enable=YES
# 设置是否启用chroot_list_file配置项指定的用户列表文件

chroot_list_file=/etc/vsftpd/chroot_list
# 用于指定用户列表文件,该文件用于控制哪些用户可以切换到用户家目录的上级目录。

chroot_local_user=YES
# 用于指定用户列表文件中的用户是否允许切换到上级目录

allow_writeable_chroot=YES
# 允许用户对主目录有写权限

通过搭配可以实现以下几种效果:
1. 当chroot_list_enable=YES,chroot_local_user=YES时,在/etc/vsftpd/chroot_list文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。
2. 当chroot_list_enable=YES,chroot_local_user=NO时,在/etc/vsftpd/chroot_list文件中列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录
3. 当chroot_list_enable=NO,chroot_local_user=YES时,所有的用户均不能切换到其他目录。
4. 当chroot_list_enable=NO,chroot_local_user=NO时,所有的用户均可以切换到其他目录。

## 数据传输模式设置

# FTP在传输数据时,可以使用二进制方式,也可以使用ASCII模式来上传或下载数据。
ascii_upload_enable= NO
# 设置是否启用ASCII 模式上传数据,默认值为NO。

ascii_download_enable=NO
# 设置是否启用ASCII 模式下载数据,默认值为NO。
## 访问控制设置

1. 控制主机访问
tcp_wrappers=YES
# 设置vsftpd是否与tcp wrapper相结合来进行主机的访问控制。默认值为YES。如果启用,则vsftpd服务器会检查/etc/hosts.allow和/etc/hosts.deny 中的设置,来决定请求连接的主机,是否允许访问该FTP服务器.
# 比如:若要仅允许192.168.1.1—192.168.1.254的用户可以连接FTP服务器,则在/etc/hosts.allow文件中添加以下内容:
# vsftpd:192.168.1.:allow
# all:all:deny

2. 控制用户访问
# 对于用户的访问控制可以通过/etc目录下的user_list和ftpusers文件来实现
userlist_enable=YES
# 是否启用user_list文件

userlist_file=/etc/vsftpd/user_list
# 控制用户访问FTP的文件,里面写着用户名称。一个用户名称一行。

userlist_deny=YES
# 决定user_list文件中的用户是否能够访问FTP服务器。若设置为YES,则user_list文件中的用户不允许访问FTP,若设置为NO,则只有user_list文件中的用户才能访问FTP

# /etc/vsftpd/ftpusers文件专门用于定义不允许访问FTP服务器的用户列表(注意:如果userlist_enable=YES,userlist_deny=NO,此时如果在user_list和ftpusers中都有某个用户时,那么这个用户是不能够访问FTP的,即ftpusers的优先级要高)。默认情况下user_list和ftpusers,这两个文件已经预设置了一些不允许访问FTP服务器的系统内部账户。如果系统没有这两个文件,那么新建这两个文件,将用户添加进去即可。

3. 邮箱控制
deny_email_enable=YES
# 是否启用邮箱地址黑名单设置。

banned_email_file=/etc/vsftpd/banned_emails
# 设置那些邮箱禁止登录,一行一个e-mail addresses
## 访问速率设置

anon_max_rate=0
# 设置匿名登入者使用的最大传输速度,单位为B/s,0 表示不限制速度。默认值为0。

local_max_rate=0
# 本地用户使用的最大传输速度,单位为B/s,0 表示不限制速度。默认值为0。

## 超时时间设置

accept_timeout=60
# 设置建立FTP连接的超时时间,单位为秒。默认值为60。

connect_timeout=60
# PORT 方式下建立数据连接的超时时间,单位为秒。默认值为60。

data_connection_timeout=120
# 设置建立FTP数据连接的超时时间,单位为秒。默认值为120。

idle_session_timeout=600
# 设置多长时间不对FTP服务器进行任何操作,则断开该FTP连接,单位为秒.
## 日志文件设置

xferlog_enable=YES
# 开启日志

xferlog_file=/var/log/xferlog
# 设定系统记录上传下载的日志文件

xferlog_std_format=YES
# 是否以标准xferlog的格式记录日志

log_ftp_protocol=NO
# 如果启用此选项,所有的FTP请求和响应都会被记录到日志中,默认日志文件在/var/log/vsftpd.log。启用此选项时,xferlog_std_format不能被激活。这个选项有助于调试。默认值为NO。

## 定义用户配置文件
# 在vsftpd中,可以通过定义用户配置文件来实现不同的用户使用不同的配置。
user_config_dir=/etc/vsftpd/userconf

#设置用户配置文件所在的目录。当设置了该配置项后,用户登陆服务器后,系统就会到/etc/vsftpd/userconf目录下,读取与当前用户名相同的文件,并根据文件中的配置命令,对当前用户进行更进一步的配置。

#例如:定义user_config_dir=/etc/vsftpd/userconf,且主机上有使用者 test1,test2,那么我们就在user_config_dir 的目录新增文件名为test1和test2两个文件。若是test1 登入,则会读取user_config_dir 下的test1 这个档案内的设定。默认值为无。利用用户配置文件,可以实现对不同用户进行访问速度的控制,在各用户配置文件中定义local_max_rate=XX,即可。

## 工作模式和端口设置

listen_port=21
# 设置FTP服务器建立连接所监听的端口,默认值为21。

connect_from_port_20=YES
# 设定端口20进行传输数据

ftp_data_port=20
# 设置在PORT方式下,FTP数据连接使用的端口,默认值为20。

pasv_enable=YES
# 若设置为YES,则使用PASV工作模式;若设置为NO,则使用PORT模式。默认值为YES,即使用PASV工作模式。

pasv_max_port=0
# 在PASV工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口。默认值为0。

pasv_min_port=0
# 在PASV工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口。默认值为0。

## 与连接相关的设置

listen=YES
# 设置vsftpd服务器是否以standalone模式运行。以standalone模式运行是一种较好的方式,此时listen必须设置为YES,此为默认值。建议不要更改,有很多与服务器运行相关的配置命令,需要在此模式下才有效。若设置为NO,则vsftpd不是以独立的服务运行,要受到xinetd服务的管控,功能上会受到限制。

max_clients=0
# 设置vsftpd允许的最大连接数,默认值为0,表示不受限制。若设置为100时,则同时允许有100个连接,超出的将被拒绝。只有在standalone模式运行才有效。

max_per_ip=0
# 设置每个IP允许与FTP服务器同时建立连接的数目。默认值为0,表示不受限制。只有在standalone模式运行才有效。

listen_address= ip地址
# 设置FTP服务器在指定的IP地址上侦听用户的FTP请求。若不设置,则对服务器绑定的所有IP地址进行侦听。只有在standalone模式运行才有效。

setproctitle_enable=YES/NO(NO)
# 设置每个与FTP服务器的连接,是否以不同的进程表现出来。默认值为NO,此时使用ps aux |grep ftp只会有一个vsftpd的进程。若设置为YES,则每个连接都会有一个vsftpd的进程。

## 虚拟用户设置
# 虚拟用户使用PAM认证方式。

pam_service_name=vsftpd
# 设置PAM使用的名称,默认值为/etc/pam.d/vsftpd。

guest_enable= YES/NO
# 启用虚拟用户。默认值为NO。

guest_username=ftp
# 这里用来映射虚拟用户。默认值为ftp。

virtual_use_local_privs=YES/NO
# 当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限。默认情况下此参数是关闭的(NO)
## 其他设置

text_userdb_names= YES/NO(NO)
# 设置在执行ls –la之类的命令时,是显示UID、GID还是显示出具体的用户名和组名。默认值为NO,即以UID和GID方式显示。若希望显示用户名和组名,则设置为YES。

ls_recurse_enable=YES/NO(NO)
# 若是启用此功能,则允许登入者使用ls –R(可以查看当前目录下子目录中的文件)这个指令。默认值为NO。

hide_ids=YES/NO(NO)
# 如果启用此功能,所有档案的拥有者与群组都为ftp,也就是使用者登入使用ls -al之类的指令,所看到的档案拥有者跟群组均为ftp。默认值为关闭。

download_enable=YES/NO(YES)
# 如果设置为NO,所有的文件都不能下载到本地,文件夹不受影响。默认值为YES

匿名用户

匿名用户使用的登陆名为ftp或anonymous,口令为空;匿名用户不能离开匿名用户家目录/var/ftp,且只能下载不能上传。

默认情况下,匿名用户的ftp根目录是/var/ftp/,该目录默认无法设置777权限,否则FTP无法正常启动。

vsftpd.conf配置文件示例:

anonymous_enable=YES
no_anon_password=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
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40200

操作示例:

[root@localhost ~]# ftp 192.168.0.1
Connected to 192.168.0.1 (192.168.0.1).
220 (vsFTPd 3.0.2)
Name (192.168.0.1:root): anonymous
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,0,1,156,65).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0              10 Jun 09  2021 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,0,1,156,158).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               4 Dec 28 05:56 txt1
226 Directory send OK.
ftp> get txt1
local: txt1 remote: txt1
227 Entering Passive Mode (192,168,0,1,156,213).
150 Opening BINARY mode data connection for txt1 (4 bytes).
226 Transfer complete.
4 bytes received in 0.000185 secs (21.62 Kbytes/sec)
ftp> put txt1
local: txt1 remote: txt1
227 Entering Passive Mode (192,168,0,1,156,111).
550 Permission denied.
ftp> 

本地用户

本地用户的登录名为本地用户名,口令为此本地用户的口令;本地用户可以在自 己家目录中进行读写操作;本地用户可以离开自家目录切换至有权限访问的其他目录,并在权限允许的情况下进行上传/下载。

Vsfptd.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
chroot_local_user=YES
chroot_list_enable=NO
listen=NO
listen_ipv6=YES
allow_writeable_chroot=YES
local_root=/home/ftpuser
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40200

添加ftp系统用户

$ useradd ftpuser -s /sbin/nologin
$ passwd ftpuser

之后重启ftp。

访问示例:

[root@localhost download]# ftp 192.168.0.1
Connected to 192.168.0.1 (192.168.0.1).
220 (vsFTPd 3.0.2)
Name (192.168.0.1:root): ftpuser
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,0,1,156,168).
150 Here comes the directory listing.
226 Directory send OK.
ftp> pwd
257 "/"
ftp> put txt
local: txt remote: txt
227 Entering Passive Mode (192,168,0,1,156,114).
150 Ok to send data.
226 Transfer complete.
20 bytes sent in 0.0165 secs (1.21 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,0,1,156,134).
150 Here comes the directory listing.
-rw-r--r--    1 1006     1006           20 Dec 28 06:31 txt
226 Directory send OK.
ftp> mkdir dir
257 "/dir" created
ftp> ls
227 Entering Passive Mode (192,168,0,1,156,234).
150 Here comes the directory listing.
drwxr-xr-x    2 1006     1006           10 Dec 28 06:31 dir
-rw-r--r--    1 1006     1006           20 Dec 28 06:31 txt
226 Directory send OK.

问题:

#错误
530 Login incorrect.
Login failed.

# 解决:
在/etc/shells文件最后一行追加上添加系统用户时指定的shell
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/sbin/nologin

虚拟用户

安装必要的工具:

$ yum -y install db4*

创建虚拟用户文件:

# 注意格式,奇数行为用户名,偶数行为密码

[root@master_host vsftpd]# cat virtusers 
user1
123456
user2
654321

生成虚拟用户数据文件:

$ db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db

设置认证文件PAM:

1. 为虚拟用户新建pam文件
$ vim /etc/pam.d/virtuser.pam
auth       required        pam_userdb.so   db=/etc/vsftpd/virtusers
account    required        pam_userdb.so   db=/etc/vsftpd/virtusers

2. 或者在/etc/pam.d/vsftpd文件里注释掉原有内容,然后添加下面的配置
auth       required        pam_userdb.so   db=/etc/vsftpd/virtusers
account    required        pam_userdb.so   db=/etc/vsftpd/virtusers

创建虚拟账号对应的系统用户:

useradd  -s /sbin/nologin ftpuser

为每个虚拟账户设置配置文件:

在/etc/vsftpd/vsftpd.conf中添加: user_config_dir=/etc/vsftpd/vconf,注意目录下配置文件名必须和虚拟用户名相同

配置文件示例:

# 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_file=/var/log/xferlog
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=NO
listen=NO
listen_ipv6=YES
allow_writeable_chroot=YES
pam_service_name=virtuser.pam # 指定的新PAM认证文件
userlist_enable=YES
tcp_wrappers=YES
pasv_enable=YES
pasv_min_port=40000
pasv_max_port=40200
guest_enable=YES
virtual_use_local_privs=YES
guest_username=ftpuser
user_config_dir=/etc/vsftpd/vconf

# user1 文件
local_root=/home/user1
# user2 文件
local_root=/home/user2

# 注意创建完虚拟用户的根目录后需要修改目录的属主权限为guest_username配置项对应的系统用户

访问示例:

[root@localhost download]# ftp 192.168.0.1
Connected to 192.168.0.1 (192.168.0.1).
220 (vsFTPd 3.0.2)
Name (192.168.0.1:root): user1
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,0,1,156,167).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 28 07:58 user1
226 Directory send OK.

[root@localhost download]# ftp 192.168.0.1
Connected to 192.168.0.1 (192.168.0.1).
220 (vsFTPd 3.0.2)
Name (192.168.0.1:root): user2
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,0,1,156,248).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Dec 28 07:58 user2
226 Directory send OK.
posted @ 2022-12-29 10:46  忘川的彼岸  阅读(114)  评论(0编辑  收藏  举报