FTP协议
FTP介绍
File Transfer Protocol 早期的三个应用级协议之一 #NFS,samba
基于C/S结构
双通道协议:数据和命令连接
数据传输格式:二进制(默认)和文本
两种模式:服务器角度
主动(PORT style):服务器主动连接
命令(控制):客户端:随机port — 服务器:tcp21
数据: 客户端:随机port —服务器:tcp20
被动(PASV style):客户端主动连接
命令(控制):客户端:随机port — 服务器:tcp21
数据: 客户端:随机port —服务器:随机port
服务器被动模式数据端口示例:
227 Entering Passive Mode (192,168,175,138,224,59)
服务器数据端口为:224*256+59
————————————————————————————
双通道协议:打开两个tcp连接
命令:都是客户端连接服务器 。而数据连接有主被动之分;服务器主动连接客户端,此时服务器数据端口为tcp20 ,而客户端的端口未知,需要通过命令端口发送客户端协商客户端数据端口,让客户端发送过来数据端口,若客户端方面存在防火墙,则连接失败;而被动连接时,服务器若也存在防火墙,也会导致失败,故ftp适合局域网使用,广域网由于防火墙可能导致失败;一般现在有智能防火墙,只要ftp协议命令端口中传输协商的数据端口传输过来时,防火墙会自动打开该端口,即协议追踪;;数据通道传完数据就断开;客户端可以通过指令决定是用哪种数据端口
如图1
FTP服务器:
Wu-ftpd,Proftpd,Pureftpd,ServU,IIS #Servu为商业版
vsftpd:Ver y Secure FTP Daemon,CentOS默认FTP服务器
高速,稳定,下载速度是WU-FTP的两倍
ftp.redhat.com数据:单机最多可支持15000个并发
客户端软件:
ftp,lftp,lftpget,wget,curl
ftp -A ftpserver port -A主动模式 –p 被动模式
lftp –u username ftpserver
lftp username@ftpserver
lftpget ftp://ftpserver/pub/file #非交互方式
gftp: GUI centos5 最新版2.0.19 (11/30/2008)
filezilla,CuteFtp,FlashFXP,LeapFtp #图形工具
IE ftp://username:password@ftpserver
ftp工具 进入输入?为帮助 ,mget ,mput
ftp服务状态码:
1XX:信息 125:数据连接打开
2XX:成功类状态 200:命令OK 230:登录成功
3XX:补充类 331:用户名OK
4XX:客户端错误 425:不能打开数据连接
5XX:服务器错误 530:不能登录
用户认证:
匿名用户:ftp,anonymous,对应Linux用户ftp
系统用户:Linux用户,用户/etc/passwd,密码/etc/shadow
虚拟用户:特定服务的专用用户,独立的用户/密码文件
nsswitch:network service switch名称解析框架
pam:pluggable authentication module 用户认证
/lib64/security /etc/pam.d/ /etc/pam.conf
vsftpd服务
[root@centos7:~]# ftp 172.18.0.1
Connected to 172.18.0.1 (172.18.0.1).
220 (vsFTPd 2.2.2) #ftp服务状态码,版本号
Name (172.18.0.1:root): ftp #匿名账号ftp或者输入anonymous
331 Please specify the password.
Password: #匿名账号密码随便输入或者直接回车
230 Login successful. #状态码,登录成功
Remote system type is UNIX. #远程ftp服务主机
Using binary mode to transfer files. #使用二进制传输文本,或者文本格式传输文本(不推荐,windows由于回车换行和linux不同,会导致内容错乱)
ftp> ls
227 Entering Passive Mode (172,18,0,1,90,93). #passive被动模式
150 Here comes the directory listing.
drwxr-xr-x 21 0 0 4096 Apr 09 10:44 pub
226 Directory send OK.
ftp>
图2
ftp> passive
Passive mode off.
ftp> get winxp_ghost.iso
local: winxp_ghost.iso remote: winxp_ghost.iso
200 PORT command successful. Consider using PASV. #主动模式成功
150 Opening BINARY mode data connection for winxp_ghost.iso (711854080 bytes).
226 Transfer complete.
711854080 bytes received in 7 secs (101727.29 Kbytes/sec)
[root@centos7:~]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 14976 0 172.18.122.109:53402 172.18.0.1:20 数据端口,传完数据即断开连接
ftp> ?
Commands may be abbreviated. Commands are:
! debug mdir sendport site
$ dir mget put size
account disconnect mkdir pwd status
append exit mls quit struct
ascii form mode quote system
bell get modtime recv sunique
binary glob mput reget tenex
bye hash newer rstatus tick
case help nmap rhelp trace
cd idle nlist rename type
cdup image ntrans reset user
chmod lcd open restart umask
close ls prompt rmdir verbose
cr macdef passive runique ?
delete mdelete proxy send
ftp>
ftp不支持tab补全 lftp支持补全 ,都是交互方式,lftpget ftp://172.18.0.1/pub/getty 非交互方式,适合脚本
wget ftp://172.18.0.1/pub/getty #可以显示下载速度等信息
curl ftp://172.18.0.1/pub/RHCE/www.html #显示
curl -o a.html ftp://172.18.0.1/pub/RHCE/www.html #下载到指定文件
ftp -A 172.18.0.1 #-A主动模式 -P被动模式,可以不写,默认为-P
#windows默认为主动模式
C:\Users\29256>ftp 172.18.0.1
连接到 172.18.0.1。
220 (vsFTPd 2.2.2)
200 Always in UTF8 mode.
用户(172.18.0.1:(none)): ftp
331 Please specify the password.
密码:
230 Login successful.
ftp>
ftp> ls
200 PORT command successful. Consider using PASV. #主动模式成功
150 Here comes the directory listing.
C:\Users\29256>netstat -nt | findstr 172.18.0.1
TCP 172.18.118.99:61798 172.18.0.1:445 ESTABLISHED InHost
TCP 172.18.118.99:62795 172.18.0.1:21 ESTABLISHED InHost
[root@centos7:~]# yum info vsftpd
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Installed Packages
Name : vsftpd
Arch : x86_64
Version : 3.0.2
Release : 22.el7
Size : 348 k
Repo : installed
From repo : base
Summary : Very Secure Ftp Daemon
URL : https://security.appspot.com/vsftpd.html #官方地址
License : GPLv2 with exceptions
Description : vsftpd is a Very Secure FTP daemon. It was written completely from
: scratch.
[root@centos7:~]# rpm -ql vsftpd
/etc/logrotate.d/vsftpd #日志滚动策略文件
/etc/pam.d/vsftpd #安全机制的pam模块
/etc/vsftpd
/etc/vsftpd/ftpusers
/etc/vsftpd/user_list
/etc/vsftpd/vsftpd.conf
/usr/lib/systemd/system/vsftpd.service #服务名
/usr/lib/systemd/system/vsftpd.target
/usr/lib/systemd/system/vsftpd@.service
/usr/sbin/vsftpd #主进程
/var/ftp #安装生成的目录
/var/ftp/pub #共享目录
[root@centos7:~]# systemctl start vsftpd #端口21
[root@centos7:~]# ss -nt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
CLOSE-WAIT 15 0 172.18.122.109:39066 172.18.0.1:21
ESTAB 0 0 ::ffff:192.168.31.7:21 ::ffff:192.168.31.6:56662 #31.6机器连接的命令端口
[root@centos7:vsftpd]# ps auxf
root 4736 0.0 0.0 53260 708 ? Ss 16:10 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
nobody 7757 0.0 0.0 55384 1480 ? Ss 20:34 0:00 \_ /usr/sbin/vsftpd /etc/vsftpd/vsftpd.co
ftp 7759 0.0 0.0 57492 1232 ? S 20:34 0:00 \_ /usr/sbin/vsftpd /etc/vsftpd/vsft
实验:基于文件验证的vsftpd虚拟用户
1、创建用户数据库文件
[root@centos7:vsftpd]# pwd
/etc/vsftpd
[root@centos7:vsftpd]# vim ftpusers.txt
ftpuser1
centos1
ftpuser2
centos2
[root@centos7:vsftpd]# db_load -T -t hash -f ftpusers.txt ftpusers.db
[root@centos7:vsftpd]# file ftpusers.db
ftpusers.db: Berkeley DB (Hash, version 9, native byte-order)
[root@centos7:vsftpd]# chmod 600 ftpusers.txt #更改权限,保证安全
[root@centos7:vsftpd]# chmod 600 ftpusers.db
[root@centos7:vsftpd]# useradd vftpuser -s /sbin/nologin #创建一个系统账号当guest账号
[root@centos7:vsftpd]# chmod 555 /home/vftpuser/ #不能有写权限,否则登录失败
[root@centos7:vftpuser]# mkdir upload
[root@centos7:vftpuser]# chown vftpuser upload/ #创建上传文件目录,有写权限
2、修改配置文件
[root@centos7:vsftpd]# vim /etc/pam.d/vsftpd.db #pam认证配置文件
auth required pam_userdb.so db=/etc/vsftpd/ftpusers #无需写后缀.txt
account required pam_userdb.so db=/etc/vsftpd/ftpuses #无需写后缀.db
[root@centos7:vsftpd]# vim vsftpd.conf #vsftp服务配置文件
pam_service_name=vsftpd.db #关联pam模块文件路径
guest_enable=YES #启用来宾
guest_username=vftpuser #所有系统账号映射为guest用户vftpuser
user_config_dir=/etc/vsftpd/vftpuser.d/
3、每个用户各自设置家目录
[root@centos7:~]# mkdir /etc/vsftpd/vftpuser.d/
[root@cos7:~]# vim /etc/vsftpd/vftpuser.d/ftp1
local_root=/home/vftpuser/ftp1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
[root@cos7:~]# vim /etc/vsftpd/vftpuser.d/ftp2
local_root=/home/vftpuser/ftp2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
[root@centos7:vsftpd]# systemctl restart vsftpd