Linux之FTP服务
1. FTP服务和FTP协议
FTP服务是Internet上最早应用主机之间进行数据传输的基本服务之一。FTP服务的一个非常重要的特点就是可以独立于平台,也就是说在UNIX、MAC、Windows等操作系统中都可以实现FTP的客户端和服务器。尽管目前已经普遍采用HTTP方式传送文件,但FTP仍然是跨平台直接传送文件的主要方式。FTP文件传输协议(File Transfer Protocol,FTP)。该协议定义了一个在远程计算机系统和本地计算机系统之间传输文件的一个标准。FTP运行在OSI模型的应用层,并利用传输控制协议TCP在不同的主机之间提供可靠的数据传输。FTP在文件传输中还支持断点续传功能,可以大幅度地减小CPU和网络带宽的开销。
2. FTP的工作原理
与大多数的Internet服务一样,FTP协议也是一个客户机/服务器系统,用户通过一个支持FTP协议的客户机程序,连接到远程主机上的FTP服务器程序,用户通过客户机程序向服务器程序发送命令,服务器程序执行用户所发出的命令,并将结果返回给客户机。
3.FTP使用的端口号:
数据传输端口 20 #用于数据的上传和下载
命令传输端口 21 #用于ftp命令的传输
4. FTP的两种模式:
PORT(主动)方式的连接过程是:(服务器连接客户端)
客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
当需要传送数据时,客户端在命令链路上用 PORT命令告诉服务器:“我打开了****端口(大于1024的随机端口),你过来连接我”。
于是服务器从20端口向客户端的****端口发送连接请求,建立一条数据链路来传送数据。
PASV(被动)方式的连接过程是:(客户端连接服务器)
客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。
当需要传送数据时,服务器在命令链路上用 PASV命令告诉客户端:“我打开了****端口(大于1024的随机端口),你过来连接我”。
于是客户端向服务器的****端口发送连接请求,建立一条数据链路来传送数据。
1. 安装vsftpd
yum -y install vsftpd #服务端
yum -y install ftp lftp #客户端
如果在服务器将三个都安装,那么服务器也可以作为客户端登录本台服务器的FTP
FTP配置文件:
主配置文件:/etc/vsftpd/vsftpd.conf
用户访问控制配置文件:/etc/vsftpd/{ftpusers, user_list}
FTP的家目录:/var/ftp
systemctl restart vsftpd.service #启动服务
systemctl enable vsftpd.service #设为开机自启动
netstat -ntl |grep :21 #现在是只能看到监听21端口
tcp6 0 0 :::21 :::* LISTEN
lsof -i:21 #查看服务是否已经启来
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vsftpd 3321 root 3u IPv4 21400 0t0 TCP *:ftp (LISTEN)
FTP的工作模式解析:vsftpd默认的工作模式是被动模式
2. CentOS 7中vsftpd默认的主配置文件
查看vsftpd的默认主配置文件
cat -n /etc/vsftpd/vsftpd.conf | grep -v ^# #grep -v ^# 代表是过滤以#号开头的行
12 anonymous_enable=YES #是否允许匿名用户登陆,yes是允许
16 local_enable=YES #允许本地用户登陆
19 write_enable=YES #允许本地用户写权限
23 local_umask=022 #本地用户上传或创建文件时的权限
29 #anon_upload_enable=YES #默认是注释的,意为允许匿名用户上传文件
33 #anon_mkdir_write_enable=YES #默认是注释的,意为允许匿名用户创建文件
37 dirmessage_enable=YES #文件的描述
40 xferlog_enable=YES #开启日志(/var/log/xferlog),只上传和下载的记录
43 connect_from_port_20=YES #是否允许开启主动模式,通过20端口传输数据
57 xferlog_std_format=YES #为yes的话代表创建一个新的日志文件,为no的话,日志放到/var/log/vsftpd.log文件里
114 listen=YES #独立模式,为yes代表是用vsftpd本身脚本启动,为no代表要以xinetd守护进程启动
125 pam_service_name=vsftpd #支持模块的植入
126 userlist_enable=YES #打开用户列表
127 tcp_wrappers=YES #通过TCP把数据打包再传输
3. 登录FTP服务器
ftp 192.168.1.10
Connected to 192.168.1.10.
220 (vsFTPd 2.0.5)
530 Please login with USER and PASS.
530 Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
Name (192.168.1.10:root): ftp #输入匿名用户ftp
331 Please specify the password.
Password: #它的密码任意或者为空
230 Login successful.
ftp> ? #使用?号可以查看能使用哪些命令
ftp> help passive #help+命令可以查看命令的帮助
passive toggle passive transfer mode
ftp> passive #使用passive命令切换模式
Passive mode off. #这时表示被动模式关闭
ftp> passive
Passive mode on. #这时表示被动模式开启
ftp> ls #建立数据链路(列出当前ftp家目录中的内容)
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-r--r-- 1 0 0 0 Aug 23 22:29 a.txt
drwxr-xr-x 2 0 0 6 Nov 05 2016 pub
226 Directory send OK.
ftp> get a.txt #get是下载文件命令
local: 1.txt remote: 1.txt
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for 1.txt (0 bytes).
226 Transfer complete.
ftp> put initial-setup-ks.cfg #put是上传文件文件命令
local: initial-setup-ks.cfg remote: initial-setup-ks.cfg
200 PORT command successful. Consider using PASV.
550 Permission denied.
#这时候使用下载命令会报权限拒绝,因为默认匿名用户是没有上传权限的。(通过配置文件可以修改权限)
4. 不允许匿名用户登录
修改ftp配置文件:vim /etc/vsftpd/vsftpd.conf
12 anonymous_enable=NO #把YES改为NO
systemctl restart vsftpd #重启服务生效
测试:结果发现匿名用户FTP登录不上
ftp 192.168.1.10
Connected to 192.168.1.10 (192.168.1.10).
220 (vsFTPd 3.0.2)
Name (192.168.1.10:root): ftp
331 Please specify the password.
Password:
530 Login incorrect.
Login failed. #登陆失败
ftp>
5. 匿名用户下载
修改配置文件: vim /etc/vsftpd/vstfp.conf
anonymous_enable=YES #先允许匿名用户登录
默认使用匿名用户登录的服务端的/var/ftp目录下,因为/etc/passwd里的ftp用户的家目录就是/var/ftp,所以其实就是登录到它的家目录。匿名用户默认是可以登录,也可以下载,因为/var/ftp是755权限
注意:匿名用户对登录的目录有rx权限,对目录里的文件有r权限就可以下载。
6. 匿名用户的上传
默认是不允许匿名用户上传的,因为ftp服务本身不允许系统权限给匿名写,所以解决方法是在登录目录下创建一个用于上传的目录,给一个写权限。
chmod 777 /var/ftp/pub #把pub改为可写,用于上传
修改配置文件:vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_upload_enable=YES #允许匿名用户上传文件,这行默认是注释掉的,要把#去掉
anon_mkdir_write_enable=YES #允许匿名用户创建目录,这行默认是注释掉的,要把#去掉
systemctl restart vsftpd.service #重启服务
ftp> put a.txt #这时可以上传了
local: a.txt remote: a.txt
227 Entering Passive Mode (192,168,1,20,177,88).
150 Ok to send data.
226 Transfer complete.
ftp> mkdir bb #这也可以创建目录
257 "/pub/bb" created