VSFTP服务搭建

VSFTP服务搭建

一、虚拟账号

  • 首先安装vsftpd服务
# yum install -y vsfptd
  • 按如下配置vsftpd.conf文件
主动模式
Port_enable=YES               开启主动模式
Connect_from_port_20=YES      当主动模式开启的时候 是否启用默认的20端口监听
ftp_data_port=%portnumber%    上一选项使用NO参数是 指定数据传输端口


anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=NO
listen_port=21
xferlog_enable=yes
xferlog_file=/var/log/ftp/vsftpd.log
chroot_local_user=YES
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
listen=YES
ftpd_banner=”welcome test Ftp Server.”
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
local_root=/home/www/test/upload/
virtual_use_local_privs=YES
guest_enable=YES
guest_username=www
user_config_dir=/etc/vsftpd/vuser_conf
pasv_enable=yes
pasv_min_port=4500
pasv_max_port=5000
被动模式
PASV_enable=YES   开启被动模式
PASV_min_port=%number% 被动模式最低端口
PASV_max_port=%number% 被动模式最高端口

listen=yes
listen_port=21
max_clients=100
max_per_ip=10
local_max_rate=5120000
anonymous_enable=no
local_enable=yes
write_enable=no
chroot_local_user=yes
#chroot_list_enable=yes
#chroot_list_file=/etc/vsftpd/chroot_list
guest_enable=yes
guest_username=kingsoft
virtual_use_local_privs=yes
user_config_dir=/etc/vsftpd/vuser_conf
pasv_enable=yes
pasv_min_port=4500
pasv_max_port=5000
tcp_wrappers=yes
local_root=/home/www/test/upload/
xferlog_enable=yes
xferlog_file=/var/log/ftp/vsftpd.log
idle_session_timeout=600
data_connection_timeout=120
accept_timeout=60
connect_timeout=60
connect_from_port_20=no
local_umask=022
pam_service_name=vsftpd.vu
pasv_address=本机ip
pasv_addr_resolve=yes
  • 创建本地账号 www
# useradd www -s /sbin/nologin
  • 创建虚拟用户配置目录
# mkdir /etc/vsftpd/vuser_conf
  • 创建登录账号

创建虚拟用户文件,把这些用户名和密码存放在一个文件中。该文件内容格式是:用户名占用一行,密码占一行。如下:

[root@localhost vsftpd]# pwd
/etc/vsftpd

[root@localhost vsftpd]# ls
chroot_list  ftpusers  login.db  login.txt  user_list  vsftpd.conf  vsftpd.conf.bak  vsftpd_conf_migrate.sh  vuser_conf

[root@localhost vsftpd]# cat login.txt 
zhangsan
asdf1234
lisi
asdf1234
zhaoliu
asdf1234
  • 创建用户账号数据库

虚拟用户和密码的文本文件无法被系统帐号直接调用,所以我们需要使用db_load命令生成db口令数据库文件,命令如下:

# db_load -T -t hash -f /etc/vsftpd/login.txt /etc/vsftpd/login.db
  • 调用系统PAM模块

为了使服务器能够使用上述生成的数据库文件,对客户端进行身份验证,需要调用系统的PAM模块。

PAM(Plugable Authentication Module)为可插拔认证模块,不必重新安装应用系统,通过修改指定的配置文件,调整对该程序的认证方式。PAM模块配置文件路径为/etc/pam.d/目录,此目录下保存着大量与认证有关的配置文件,并以服务名称命名

我们现在切换到/etc/pam.d/ 目录下,编辑vsfptd文件。如下:

#%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 /lib64/security/pam_userdb.so db=/etc/vsftpd/login
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/login

auth是指对用户的用户名口令进行验证

accout是指对用户的帐户有哪些权限哪些限制进行验证

再后面的/lib64/security/pam_userdb.so表示该条审核将调用pam_userdb.so这个库函数进行。

注意该函数会根据系统的位数而所在位置不同。

如果是32bit系统,该文件所在位置是/lib/security/pam_userdb.so
如果是64bit系统,该文件所在位置是/lib64/security/pam_userdb.so

最后db=/etc/vsftpd/login则指定了验证库函数将到这个指定的数据库中调用数据进行验证。其实该文件指的是/etc/vsftpd/login.db文件。

注意:db=/etc/vsftpd/login格式是这样的,去掉.db后缀

  • 创建虚拟用户的Profile文件

PAM配置完毕后,我们现在开始创建虚拟用户与系统用户对应的文件。切换到/etc/vsftpd/vuser_conf目录下,并创建用户文件。注意该文件名称一定要与login.txt中的虚拟用户要对应。比如现在login.txt文件有zhangsan用户,那么在 /etc/vsftpd/vuser_conf目录下创建一个文件名为zhangsan的文件。
[root@localhost vsftpd]# cat /etc/vsftpd/vuser_conf/zhangsan

local_root=/home/www/test1/upload/   #表示使用本地用户登录到ftp时的默认目录
virtual_use_local_privs=YES   #虚拟用户和本地用户有相同的权限
guest_username=www   #表示的是设置FTP对应的系统用户为www
write_enable=YES
anon_umask=022

以上配置完毕后,启动vsftpd服务完成。
测试zhangsan、lisi ftp用户均可以正常登录,对应的根目录不同,均有创建和删除、上传权限。

关于chroot:

1. chroot_local_user

 2. chroot_list_enable

 3. chroot_list_file

可以通过如下两种方法来设置chroot,从而杜绝上述不安全的情况发生:

(1)设置所有的本地用户执行chroot,只要将/etc/vsftpd/vsftpd.con文件中的chroot_local_ user值置为YES,即 chroot_local_user=YES。

(2)设置指定的用户执行chroot,按照如下方法进行设置:

chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

设置后,只有/etc/vsftpd.chroot_list文件中指定的用户才能够执行chroot命令。

常见报错:

1)vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误的解决方法

如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误,要修复这个错误,可以用命令chmod a-w /home/user去除用户主目录的写权限

二、本地账号

  1. 配置文件vsftpd.conf 说明
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
#chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
#local_root=/var/ftp
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
userlist_deny=NO
tcp_wrappers=YES
  1. 创建本地账号并登陆测试
 139  useradd zhaoliu
 140  passwd zhaoliu
 141  lftp zhaoliu:asdf1234@localhost
  1. 将用户账号加入user_list

image-20210417173514472

  1. 配置文件说明

anonymous_enable=NO      # 不允许匿名用户登录

local_enable=YES         # 允许本地用户登录

write_enable=YES         # 允许写入

local_umask=022     # 掩码为022,表示755的权限

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

xferlog_enable=YES     #是否启用上传/下载日志记录。如果启用,则上传与下载的信息将被完整纪录在xferlog_file 所定义的档案中。预设为开启。

connect_from_port_20=YES     # 指定FTP使用20端口进行数据传输,默认值为YES。

xferlog_std_format=YES     # 如果启用,则日志文件将会写成xferlog的标准格式,如同wu-ftpd 一般。默认值为关闭

listen=YES     # 监听IPv4 sockets

listen_ipv6=NO     # 关闭ipv6

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

userlist_enable=YES     # 是否启用vsftpd.user_list文件

tcp_wrappers=YES     # 如果启用,则vsftpd服务器会检查/etc/hosts.allow 和/etc/hosts.deny 中的设置,来决定请求连接的主机,是否允许访问该FTP服务器

use_localtime=YES     # vsftpd将显示当前时区中包含时间的目录列表

port_enable=YES     # 如果为NO,则表示禁止用PORT方法获取数据连接

chroot_local_user=YES       # 全部用户被限制在主目录

chroot_list_enable=YES       # 启用例外用户名单

chroot_list_file=/etc/vsftpd/chroot_list # 指定例外用户列表文件,列表中的用户不被锁定在主目录

allow_writeable_chroot=YES     # 允许写入

local_root=/home/ftptest     # 设置本地用户登录后所在的目录

  1. 配置禁止跳出家目录权限

chroot_list里的用户可以跳出默认目录,访问/var/ftp目录,其它用户只能访问自己家目录/home/%user%

#chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
  1. userlist为白名单,只有列表内的用户可以访问ftp
userlist_enable=YES
userlist_deny=NO

image-20210417173322819

三、匿名账号

  1. 配置文件vsftpd.conf代码

添加如下4行代码:

anon_upload_enable=(yes/no);        #控制匿名用户对文件(非目录)上传权限
anon_world_readable_only=(yes/no); #控制匿名用户对文件的下载权限
anon_mkdir_write_enable=(yes/no);  #控制匿名用户对文件夹的创建权限
anon_other_write_enable=(yes/no);  #控制匿名用户对文件和文件夹的删除和重命名
  1. 主动模式
anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_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
  1. 被动模式

如需更改默认的信令端口21,还需要修改/etc/services文件里面的ftp端口

anonymous_enable=YES
local_enable=YES
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=NO
listen_port=8020
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=50000
  1. 创建上传目录
[root@localhost ftp]# mkdir upload
[root@localhost ftp]# chmod -R 777 upload
  1. 修改配置文件vsftpd.conf 说明

anonymous_enable=YES #是否允许匿名用户登录
write_enable=YES #enable any form of FTP write command
anon_upload_enable=YES #是否允许匿名用户上传文件
anon_mkdir_write_enable=YES #是否允许匿名用户创建目录
anon_other_write_enable=YES #是否允许匿名用户删除、重命名等
anon_umask=022 #权限掩码,匿名用户上传文档时预设的权限掩码;文件夹权限为 777-022=755,一般的文件权限为 666-022=644;默认权限掩码为077,匿名用户上传之后文件夹权限是700,文件的权限是600。
anon_world_readable_only=YES #当为YES时,文件的other用户必须有r权限才允许下载,即使文件的属主为ftp且对文件有r权限也无法下载,为了安全考虑,默认为YES;当为NO时,则只要属主为ftp且对文件有r权限即可下载;

  1. 被动访问方式:
listen_port=5021                  ;命令通道端口,默认为21

编辑/etc/services 文件,将其中的ftp 21/tcp 改为 ftp 8020/tcp

pasv_enable=YES                      ;允许被动模式

pasv_min_port=50000                   ;被动模式使用端口范围

pasv_max_port=60000

pasv_enable=YES|NO
YES,允许数据传输时使用PASV模式。NO,不允许使用PASV模式。默认值为YES。


pasv_min_port=port number 
pasv_max_port=port number

设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界,0 表示任意。默认值为0。把端口范围设在比较高的一段范围内,比如50000-60000,将有助于安全性的提高。

四、FTP工作模式

(1)PORT(主动)模式

所谓主动模式,指的是FTP服务器“主动”去连接客户端的数据端口来传输数据,其过程具体来说就是:客户端从一个任意的非特权端口N(N>1024)连接到FTP服务器的命令端口(即tcp 21端口),紧接着客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。然后服务器会从它自己的数据端口(20)“主动”连接到客户端指定的数据端口(N+1),这样客户端就可以和ftp服务器建立数据传输通道了。

(2)PASV(被动)模式

所谓被动模式,指的是FTP服务器“被动”等待客户端来连接自己的数据端口,其过程具体是:当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N >1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。(注意此模式下的FTP服务器不需要开启tcp 20端口了)

五、安全配置

Idle_session_timeout=600    (单位:秒,用户会话空闲后10分钟) 
Data_connection_timeout=120 (单位:秒,将数据连接空闲2分钟断) 
Accept_timeout=60      (单位:秒,将客户端空闲1分钟后断) 
Connect_timeout=60     (单位:秒,中断1分钟后又重新连接) 
Local_max_rate=50000   (单位:bit,本地用户传输率50K) 
Anon_max_rate=30000    (单位:bit,匿名用户传输率30K) 

Pasv_min_port=50000
Pasv_max_port=60000 (将客户端的数据连接端口改在5000060000之间)
Max_clients=200     (FTP的最大连接数) 
Max_per_ip=4        (每IP的最大连接数) 
Listen_port=5555    (从5555端口进行数据连接)

六、日志功能

xferlog_enable=YES             // FTP服务器记录上传下载情况
xferlog_std_format=YES        // 表示将记录的上传下载情况写在xferlog_file所指定的文件中,即/var/log/xferlog文件

xferlog_file=/var/log/xferlog   // 指定日志记录文件(该文件可以利用标准日志工具进行分析)

dual_log_enable=YES           // 开启双份日志记录功能,在用xferlog文件记录服务器上传下载情况的同时,vsftpd_log_file所指定的文件(即/var/log/vsftpd.log),也将用来记录服务器的传输情况

vsftpd_log_file=/var/log/vsftpd.log      // vsftpd格式的日志文件

syslog_enable=NO              // 将vsftpd日志输出到系统日志中

七、修改FTP默认端口

1、编辑/etc/vsftpd/vsftpd.conf 文件,在该配置文件中添加此行:listen_port=8020

image-20210416231725126

2、编辑/etc/services 文件,将其中的
ftp 21/tcp 改为 ftp 8020/tcp
ftp 21/udp 改为 ftp 8020/tcp

image-20210416231547501

3、执行/etc/init.d/vsftpd restart 重新启动vsftpd 服务。
启动完成后可以使用

image-20210416231508317

八、参考资料

https://www.cnblogs.com/kuliuheng/p/3209674.html

https://www.cnblogs.com/ssrs-wanghao/articles/13751408.html

posted @   peterjiang520  阅读(626)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示