vsftpd

FTP--file transfer protcol文件传输协议
FTP是一种在互联网中进行文件传输的协议,基于C/S模式,默认服务端口号是20、21
20端口用于数据传输、21端口用于接收客户端的FTP命令与参数。

linux上的叫vsftpd(ver secure ftp daemon)

一、安装

1、安装vsftpd服务程序

# yum install vsftpd -y

#注意关闭防火墙规则
iptables -F

 1.1、vsftpd配置文件

   注意配置文件,不得有任何多余的空格!否则会重启失败

  #过滤出非注释行,非空行
  [root@linux ~]# grep -vE '^#|^$' /etc/vsftpd/vsftpd.conf
  anonymous_enable=YES  #是否开启匿名用户允许访问
  local_enable=YES    #是否允许本地用户登录FTP
  write_enable=YES    #write_enable=YES #全局设置,是否容许写入,开启允许上传的权限
  local_umask=022     #本地用户上传文件的umask
  dirmessage_enable=YES    #允许为目录配置显示信息,显示每个目录下面的message_file文件的内容
  xferlog_enable=YES    #开启日志功能,以及存放路径
  xferlog_file=/var/log/vsftpd.log  #日志路径
  connect_from_port_20=YES    #使用20端口进行连接
  xferlog_std_format=YES    #标准日志格式
  listen=YES        #绑定到监听端口
  listen_ipv6=YES    #开启ipv6
  pam_service_name=vsftpd    #设置PAM的名称
  userlist_enable=YES    #设置用户已列表,允许或是禁止
  tcp_wrappers=YES    #控制主机访问,检查/etc/hosts.allow  hosts.deny的配置达到防火墙作用

2、安装ftp客户端

  ftp客户端有多种形式,图形化、命令行

  • 2.1  ftp命令客户端

ftp> ascii  # 设定以ASCII方式传送文件(缺省值) 
ftp> bell   # 每完成一次文件传送,报警提示. 
ftp> binary # 设定以二进制方式传送文件. 
ftp> bye    # 终止主机FTP进程,并退出FTP管理方式. 
ftp> case   # 当为ON时,用MGET命令拷贝的文件名到本地机器中,全部转换为小写字母. 
ftp> cd     # 同UNIX的CD命令. 
ftp> cdup   # 返回上一级目录. 
ftp> chmod  # 改变远端主机的文件权限. 
ftp> close  # 终止远端的FTP进程,返回到FTP命令状态, 所有的宏定义都被删除. 
ftp> delete # 删除远端主机中的文件. 
ftp> dir [remote-directory] [local-file] # 列出当前远端主机目录中的文件.如果有本地文件,就将结果写至本地文件. 
ftp> get [remote-file] [local-file] # 从远端主机中传送至本地主机中. 
ftp> help [command] # 输出命令的解释. 
ftp> lcd # 改变当前本地主机的工作目录,如果缺省,就转到当前用户的HOME目录. 
ftp> ls [remote-directory] [local-file] # 同DIR. 
ftp> macdef                 # 定义宏命令. 
ftp> mdelete [remote-files] # 删除一批文件. 
ftp> mget [remote-files]    # 从远端主机接收一批文件至本地主机. 
ftp> mkdir directory-name   # 在远端主机中建立目录. 
ftp> mput local-files # 将本地主机中一批文件传送至远端主机. 
ftp> open host [port] # 重新建立一个新的连接. 
ftp> prompt           # 交互提示模式. 
ftp> put local-file [remote-file] # 将本地一个文件传送至远端主机中. 
ftp> pwd  # 列出当前远端主机目录. 
ftp> quit # 同BYE. 
ftp> recv remote-file [local-file] # 同GET. 
ftp> rename [from] [to]     # 改变远端主机中的文件名. 
ftp> rmdir directory-name   # 删除远端主机中的目录. 
ftp> send local-file [remote-file] # 同PUT. 
ftp> status   # 显示当前FTP的状态. 
ftp> system   # 显示远端主机系统类型. 
ftp> user user-name [password] [account] # 重新以别的用户名登录远端主机. 
ftp> ? [command] # 同HELP. [command]指定需要帮助的命令名称。如果没有指定 command,ftp 将显示全部命令的列表。
ftp> ! # 从 ftp 子系统退出到外壳。
  • 2.2 FileZilla图形化工具

  安装ftp命令行
  yum install ftp -y

二、vsftpd三种登录模式

vsftpd允许用户三种认证的模式登录到FTP服务器。 

本地用户模式,基于Linux本地账号密码进行认证,配置简单,但是一旦被破解,服务器信息就很危险
匿名用户模式,任何人无需密码直接登录
虚拟用户模式,单独为FTP创建用户数据库,基于口令验证账户信息,只适用于FTP,不会影响其他用户信息,最为安全。

1、匿名用户模式

  匿名用户模式是最不安全的方式,一般用在访问不重要的、允许公开的文件,且放在企业内网环境中、置于防火墙规则下,以保证基本的安全性。

  ①vsftpd默认开启了匿名用户模式。修改配置文件以定义匿名用户的权限

[root@linux ~]# grep '^anon' /etc/vsftpd/vsftpd.conf
anonymous_enable=YES    #允许匿名访问
anon_upload_enable=YES    #允许匿名用户上传
anon_mkdir_write_enable=YES    #允许匿名用户创建目录
anon_other_write_enable=YES    #允许匿名用户修改目录

  ②重启服务,且加载开机自启

[root@linux ~]# systemctl restart vsftpd  #重启服务
[root@linux ~]# systemctl enable vsftpd   #开启自启

  ③此时可以使用ftp客户端命令,连接ftp服务端了。连接了FTP服务端,其实连接的是目录/var/ftp/

[root@linux ~]# ftp 123.206.16.61        #连接ftp服务器的ip地址
Connected to 10.141.32.137 (10.141.32.137).
220 (vsFTPd 3.0.2)
Name (10.141.32.137:root): anonymous        #填入默认的账号
331 Please specify the password.
Password:                                   #密码为空,直接回车
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

ftp> ls    
227 Entering Passive Mode (10,141,32,137,98,195).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0            4096 Oct 30  2018 pub
226 Directory send OK.
ftp> cd pub        #切换工作目录
250 Directory successfully changed.
ftp> mkdir chaoge                #发现在这里创建文件夹报错了
550 Create directory operation failed.

2、本地用户模式

  使用Linux本地用户模式,比匿名用户来的安全,修改配置文件,关闭匿名模式,开启本地用户模式

 ① 相关配置文件

[root@chaogelinux pub]# ls /etc/vsftpd/
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh

 ② 修改配置文件如下/etc/vsftpd/vsftpd.conf

anonymous_enable=NO    #关闭匿名用户模式
local_enable=YES    #开启本地用户模式
write_enable=YES    #设置可写权限
local_umask=022    #文件umask值
userlist_enable=YES    #启用【禁止登录的用户名单】文件名是,ftpusers,user_list
userlist_deny=YES    #开启禁止登录名单

 ③  重启vsftpd服务,加载配置

systemctl restart vsftpd
systemctl enable vsftpd

 ④ 此时可以使用ftp客户端连接了,使用linux本地用户信息(/etc/passwd中的用户),默认访问的是该用户的家目录

yum: ~ y$ftp 123.206.16.61
Connected to 123.206.16.61.
220 (vsFTPd 3.0.2)
Name (123.206.16.61:ch): ch
331 Please specify the password.
Password:
230 Login successful.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-rw-r--    1 2002     2002           31 Nov 21 01:57 fine.txt
226 Directory send OK.    
ftp> mkdir 到此一游            #新建文件夹
257 "/home/chaoge/到此一游" created

有些用户是无法登录ftp,是因为vsftp有一个名单,写上了禁止谁登录

ftpusers , user_list

[root@linux vsftpd]# pwd
/etc/vsftpd
[root@linux vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh

#文件中写入的名字,都是禁止登录的
[root@linux vsftpd]# cat ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

####如此,禁止登录的用户
yum: ~ yo$ftp 123.206.16.61
Connected to 123.206.16.61.
220 (vsFTPd 3.0.2)
Name (123.206.16.61:yo): root
530 Permission denied.
ftp: Login failed.

 

3、虚拟用户模式

 

 ①首先安装Berkeley DB工具

  yum install db4 db4-utils -y

  创建用于进行FTP认证的用户数据库,奇数行账户名、偶数行是密码

[root@linux vsftpd]# cat ftp_user.txt
haog
666
yu
888

  由于这样的明文信息很不安全,vsftpd也无法加载该格式的数据,因此还得用db_load命令对ftp_user.txt文件数据加密,且设置权限使得普通用户无权限查阅

 

  选项-T允许应用程序能够将文本文件转译载入进数据库。由于我们之后是将虚拟用户的信息以文件方式存储在文件里的,为了让Vsftpd这个应用程序能够通过文本来载入用户数据,必须要使用这个选项。

  子选项-t,追加在在-T选项后,用来指定转译载入的数据库类型。扩展介绍下,-t可以指定的数据类型有Btree、Hash、Queue和Recon数据库。

  -f 参数后面接包含用户名和密码的文本文件,文件的内容是:奇数行用户名、偶数行密码

[root@linux vsftpd]# db_load -T -t hash -f /etc/vsftpd/ftp_user.txt /etc/vsftpd/ftp_user.db
将用户信息文件转换为数据库并使用hash加密
#检查文件属性
[root@linux vsftpd]# file ftp_user.db
ftp_user.db: Berkeley DB (Hash, version 9, native byte-order)

#降低文件权限
[root@linux vsftpd]# ll ftp_user.db
-rw-r--r-- 1 root root 12288 1月   8 09:36 ftp_user.db
[root@linux vsftpd]# chmod 600 ftp_user.db
[root@linux vsftpd]# ll ftp_user.db
-rw------- 1 root root 12288 1月   8 09:36 ftp_user.db

#删除旧的数据文件
[root@linux vsftpd]# rm -rf ftp_user.txt

  创建当虚拟用户登录后默认访问的文件夹路径,且和linux中的一个本地用户做一个映射关系,防止匿名用户登录后,创建了文件夹,但是系统没有此用户报错权限问题

#新建一个用户,指定用户家目录,且禁止登录
useradd -d /var/ftpdir -s /sbin/nologin virtual_ch

#检查此ftpdir的属性
[root@linux vsftpd]# ls -ld /var/ftpdir/
drwx------ 2 virtual_chao virtual_chao 4096 1月   8 09:46 /var/ftpdir/

#更改文件夹权限
[root@chaogelinux vsftpd]# chmod -Rf 755 /var/ftpdir/

#添加virtual_chao用户至ftpusers禁止用户登录文件,增大系统安全,但是不会影响虚拟用户登录
[root@linux vsftpd]# echo 'virtual_chao' >> ftpusers

  此时需要创建支持虚拟用户的PAM文件,PAM是一组安全机制的模块,编辑认证文件/etc/pam.d/vsftpd

  在Linux中进行身份或是状态的验证程序是由PAM来进行的,PAM(Pluggable Authentication Modules)可动态加载验证模块,因为可以按需要动态的对验证的内容进行变更,所以可以大大提高验证的灵活性

#注释掉文中所有语句,添加以下2句,注意db参数指定的是db_load生成的文件路径,无需添加后缀

[root@linux pam.d]# cat /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/ftp_user
account required pam_userdb.so db=/etc/vsftpd/ftp_user

  最后修改vsftpd配置文件

[root@linux pam.d]# grep -Ev '^$|^#' /etc/vsftpd/vsftpd.conf
anonymous_enable=NO     #禁止匿名模式
local_enable=YES        #允许本地用户
write_enable=YES    
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd        #指定PAM认证文件
userlist_enable=YES
userlist_deny=YES
tcp_wrappers=YES
guest_enable=YES        #开启虚拟用户
guest_username=virtual_chao        #指定虚拟用户账号
allow_writeable_chroot=YES      #如果用户被限制只能在其家目录,允许用户可以对家目录写入数据

【针对不同的虚拟用户设置不同的权限】

用户ftp认证的虚拟账号,ftp_user.txt

  • haog,允许上传,新建,修改,查看,删除权限
  • yy,只读权限

这样的需求可以通过vsftpd配置实现,定义user_config_dir参数实现不同的虚拟用户,不同的权限配置

#新建管理虚拟用户权限的文件夹
mkdir /etc/vsftpd/virtual_user_dir

#进入文件夹,创建权限的配置文件
[root@linux vsftpd]# cd /etc/vsftpd/virtual_user_dir/
[root@linux virtual_user_dir]# cat chaoge
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

#再创建一个yy文件,禁止写入
[root@linux virtual_user_dir]# pwd
/etc/vsftpd/virtual_user_dir
[root@linux virtual_user_dir]# ls
haog  yy
[root@linux virtual_user_dir]# cat yy
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO

编辑vsftpd主配置文件,添加如下一行

cat /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/virtual_user_dir

重启vsftpd服务,注意配置文件,不得有任何莫名其妙的空格!否则会重启失败

systemctl restart vsftpd

【此时使用客户端登录用户haog,进行读写】

yum: ~ hao$ftp 123.206.16.61
Connected to 123.206.16.61.
220 (vsFTPd 3.0.2)
Name (123.206.16.61:hao): haog    #用匿名用户登录haog
331 Please specify the password.
Password:
230 Login successful.
ftp> ls            #此时看到的是匿名用户映射的家目录内容
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Jan 08 02:49 haha
226 Directory send OK.
ftp> mkdir 到此一游        #haog有权限增加文件
257 "/到此一游" created

#####检查服务器上的FTP目录
[root@linux ftpdir]# pwd
/var/ftpdir
[root@linux ftpdir]# ls
haha  到此一游

【使用yy用户登录ftp服务端,查看是否能够读写】

yum: ~ hao$ftp 123.206.16.61
Connected to 123.206.16.61.
220 (vsFTPd 3.0.2)
Name (123.206.16.61:yuchao): yy
331 Please specify the password.
Password:
230 Login successful.
ftp> mkdir yy也想到此一游                #无法写入数据,只能读取
550 Permission denied.
ftp> ls
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Jan 08 02:49 haha
drwx------    2 2003     2003         4096 Jan 08 02:50 超哥到此一游
226 Directory send OK.

三、下载及上传文件

1. 连接ftp服务器
格式:ftp [hostname| ip-address]
a)在linux命令行下输入:
ftp 192.168.1.1
b)服务器询问你用户名和密码,分别输入用户名和相应密码,待认证通过即可。

2. 下载文件

下载文件通常用get和mget这两条命令。
a) get
格式:get [remote-file] [local-file]
将文件从远端主机中传送至本地主机中。
如要获取远程服务器上/usr/your/1.htm,
ftp> get /usr/your/1.htm 1.htm (回车)

b) mget      
格式:mget [remote-files]
从远端主机接收一批文件至本地主机。
如要获取服务器上/usr/your/下的所有文件,则

ftp> cd /usr/your/
ftp> mget *.* (回车)

此时每下载一个文件,都会有提示。如果要除掉提示,则在mget *.* 命令前先执行:prompt off

注意:文件都下载到了linux主机的当前目录下。比如,在 /usr/my下运行的ftp命令,则文件都下载到了/usr/my下。

3.上传文件

a) put
格式:put local-file [remote-file]
将本地一个文件传送至远端主机中。
如要把本地的1.htm传送到远端主机/usr/your,并改名为2.htm

ftp> put 1.htm /usr/your/2.htm (回车)

b) mput
格式:mput local-files
将本地主机中一批文件传送至远端主机。
如要把本地当前目录下所有html文件上传到服务器/usr/your/ 下

ftp> cd /usr/your (回车)
ftp> mput *.htm (回车)

注意:上传文件都来自于主机的当前目录下。比如,在 /usr/my下运行的ftp命令,则只有在/usr/my下的文件linux才会上传到服务器/usr/your 下。

4. 断开连接
bye:中断与服务器的连接。

ftp> bye (回车)

posted @ 2021-12-16 20:52  骏马秋风  阅读(443)  评论(0)    收藏  举报