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 (回车)

浙公网安备 33010602011771号