文件传输协议,基于该协议FTP客户端与服务端可以实现共享文件,上传文件,下载文件。FTP基于TVP协议生成一个虚拟的连接,主要用于控制FTP连接信息,同时再生成一个单独的TCP连接用于FTP数据传输,用户可以通过客户端向FTP服务段上传,下载,删除文件,FTP服务端可以同时提供给多人共享使用;
FTP服务是client/server(C/S)模式,基于FTP协议是新FTP文件对外共享及传输的软件称之FTP服务器源端,客户端程序基于FTP协议,则称之为FTP客户端,FTP客户端可以向FTP服务器上传,下载文件;
FTP主动模式:
客户端从一个任意端口N(N>1024)连接到FTP服务器的port21命令端口,客户端开始监听端口N+1,并发送FTP命令"port N+1" 到FTP服务器,之后服务端才以数据端口20来连接客户端N+1端口
FTP被动模式:
客户端从一个任意端口N(N>1024)连接到服务端的port21命令端口,客户端开始监听端口N+1,并提交PASV命令,这个时候服务端会开启一个任意的端口(P>1024)发送PORT P命令交给客户端,客户端发起从本地端口N+1到服务器端口P的连接用来传输数据
FTP基于C/S模式,FTP客户端与服务器端有两种传输 模式,分别是FTP主动模式、FTP被动模式,主被动模式均是以FTP服务器端为参照。
主动模式 PORT
被动模式 PASV
FTP主被动模式,默认为主动模式,设置为被动模式使用端口方法如下:
pasv_enable=YES
pasv_min_port=YES
pasv_min_port=YES
【Vsftpd.conf配置文件详解】
/etc/vsftpd/vsftpd.conf #主配置文件 anonymous_enable=YES #允许匿名用户访问 local_enable=YES #允许本地用户访问 write_enable=YES #本地系统用户写入权限 local_umask= #本地用户创建文件及目录默认权限掩码 anon_upload_enable=YES #匿名用户是否可以上传 anon_mkdir_write_enable=YES #匿名用户是否可以创建 dirmessage_enable=YES #如果目录存在。message隐藏文件,进入该目录,会显示.message xferlog_std_from_port_20=YES #FTP使用20端口进行数据传输 xferlog_std_format=YES #日志文件将根据xferlog的标准格式写入 listen=NO #Vsftpd不以独立的服务启动,通过xinetd服务服务进行管理,建议改成YES listen_ipv6=YES #启用IPv6监听
pam_service_name=vsftpd #列出与pam相关的文件名称,即/etc/pam.d/目录下 的文件名称 userlist_enable=YES #vsftpd.user_list和ftpusers配置文件里用户禁止访问FTP tcp_wrappers=YES #设置vsftpd与tcp wrapper结合进行主机的访问控制,vsftpd服务检查/etc/hosts.allow和/etc/hosts.deny中的设置,来决定请求连接的主机,
是否允许访问该FTP服务器
【本地用户实战】
# yum install -y vsftpd libdb libdb-utils --skip-broken
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES #开启系统用户验证
write_enable=YES #写入权限
local_umask=
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/user_list #对应的是系统列表,
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES #启用用户列表文件
userlist_deny=NO #不禁用用户列表中的用户
tcp_wrappers=YES
useradd -M -s /sbin/nologin ftpuser #创建系统用户,用于访问ftp
passwd ftpuser #设置密码
echo "ftpuser" >> /etc/vsftpd/user_list #将ftpuser系统用户添加用户列表。
mkdir /home/ftpuser
chown ftpuser:ftpuser /home/ftpuser/
systemctl restart vsftpd
ps:这里要保证/home/ftpuser目录权限属主属组是对应的系统用户以及读写权限
验证:
【 vsftp虚拟用户实战】
如果是基于vsftpd系统用户访问FTP服务器,系统用户越来越不利于 管理,而且不利于系统安全管理。因此,为了能更加的安全使用vsftpd,需要vsftpd虚拟用户方式,
vsftpd虚拟用户原理:虚拟用户就是没有实际真实系统用户,而是通过映射到其中真实用户以及设置相应的权限来实现访问验证的,虚拟用户不能登入linux系统,从而保证了系统更加安全可靠
# yum install -y vsftpd libdb libdb-utils --skip-broken
#useradd -s /sbin/nologin vsftpduser #所有vsftpd虚拟用户需要映射到一个系统用户,该系统用户不需要密码,也不需要登录,主要用于虚拟用户映射使用
# vim /etc/vsftpd/ftpuser.txt #创建虚拟用户临时文件/etc/vsftpd/ftpuser.txt;
xiaoyu
123456
xiaozhang
123456
# db_load -T -t hash -f /etc/vsftpd/ftpuser.txt /etc/vsftpd/vsftpd_login.db #生成VSFTPD虚拟用户数据库认证文件,设置权限700
# chmod 700 /etc/vsftpd/vsftpd_login.db
# file /etc/vsftpd/vsftpd_login.db
/etc/vsftpd/vsftpd_login.db: Berkeley DB (Hash, version 9, native byte-order)
# vim /etc/pam.d/vsftpd #配置PAM认证文件,/etc/pam.d/vsftpd行首加入以下配置
auth required pam_userdb.so db=/etc/vsftpd/vsftpd_login
account required pam_userdb.so db=/etc/vsftpd/vsftpd_login
# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=
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
#config virtual_userFTP
guest_enable=YES #启用虚拟用户
guest_username=vsftpduser #映射虚拟用户至系统用户vsftpduser
user_config_dir=/etc/vsftpd/vsftpd_user_conf #设置虚拟用户所在的目录
virtual_use_local_privs=YES #虚拟用户使用与本地用户相同的权限
# mkdir -p /etc/vsftpd/vsftpd_user_conf/ #创建虚拟用户配置文件所在的目录,与上述vsftpd.conf配置所对应
# vim /etc/vsftpd/vsftpd_user_conf/xiaoyu #创建虚拟用户配置文件,例如:创建xiaoyu这个虚拟用户,
local_root=/home/vsftpduser/xiaoyu #xiaoyu虚拟用户配置文件路径
write_enable=YES #允许登录xiaoyu有写入权限
anon_world_readable_only=YES #允许匿名用户下载,然后读取文件
anon_upload_enable=YES #允许匿名用户上传文件权限,只有在write_enable=YES时该配置参数才生效
anon_mkdir_write_enable=YES #允许匿名用户创建目录,只有在write_enable=YES时改配置参数才生效
anon_other_write_enable=YES #允许匿名用户其他全权限,如修改全权限,删除,改名等
创建虚拟用户 各自的虚拟目录
# mkdir -p /home/vsftpduser/{xiaoyu,zhangsan}; #在系统用户vsftpduser的家目录各自创建虚拟用户的虚拟目录,并授权
# chown -R ftpuser:ftpuser /home/ftpuser/xiaoyu
# ll -d /home/vsftpduser/xiaoyu/
drwxr-xr-x. 2 ftpuser ftpuser 18 6月 24 17:32 /home/vsftpduser/xiaoyu/
# systemctl restart vsftpd
# netstat -anput | grep vsftpd
tcp6 0 0 :::21 :::* LISTEN 3271/vsftpd
[root@localhost ~]# systemctl enable vsftpd
在本地客户端验证即可!
【主动与被动模式】
在本章博客开篇中讲到vsftp主备动模式的原理,首先我们需要知道的是,vsftp的主被动是相对于FTPServer端来说的,
主动模式:server主动向客户端发起连接请求
被动模式:server等待客户端发起连接请求(默认模式)
那么问题来了,再生产环境中,如何选择主被动模式呢?可以遵循以下规则:
1)客户端没有设置防火墙,选用主动模式
2)服务端没有防火墙,选择使用被动模式
3)双方都有防火墙的情况下, vsftpd可以服务端设置端口范围,选用被动模式
【拓展】
参数详解
-A:启用主动模式
-p:启用被动模式(默认为ftp和pftp)
-i:在mget中关闭提示
-n:禁止自动登录
-e:禁用readline支持(如果存在)
-g:禁用文件名通配符
-m:不要强制数据通道接口与控制通道相同
-v:详细模式
-t:启用数据包跟踪[无功能]
-d:启用调试
ftp> user xiaoyu 1 #user是传递用户名密码的命令
331 Please specify the password.
230 Login successful.
ftp> dir #查看所在的文件内容
227 Entering Passive Mode (127,0,0,1,109,22).
150 Here comes the directory listing.
drwxr-xr-x 2 500 500 4096 Sep 08 01:09 test01
226 Directory send OK.
ftp>
#/bin/bash
ftp -n <<EOF
open 192.168.2.138
user xiaoyu 1
prompt #不提示认证,直接执行上传
mput test01.txt
EOF