简介
FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。<br /> FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。<br /> 2、使用场合<br /> 用于文件的传输;<br /> 3、FTP的作用<br /> 用于文件的上传和下载;<br /> 4、FTP属于协议及端口号<br /> 属于tcp协议<br /> 端口号:<br /> 21:控制层面,用于账户密码验证,权限的验证;<br /> 20:数据层面,用于文件的上传和下载;
原理
FTP 是 C/S 架构的服务,拥有一个服务器端和一个客户端,FTP 底层通过 TCP 协议来作为传输协议,所以 FTP 协议是一种可靠的文件传输方式,FTP 提 供了两个端口号, 20 和 21 号端口,20 号是数据接口,提供数据之间的传输,21 号是命令接口,提供命令之间的传输。<br /> FTP 服务端与客户端连接一般有两种模式:主动模式(Active Mode)和被动模 式(Passive Mode) <br /> 在主动模式下,FTP 客户端随机开启一个大于 1024 的端口 N 向服务器的 21 号端口发起连接,发送 FTP 用户名和密码,然后开放 N+1 号端口进行监听,并 向服务器发出 PORT N+1 命令,告诉服务端客户端采用主动模式并开放了端口。 FTP 服务器接收到 PORT 命令后,会用其本地的 FTP 数据端口(通常是 20)来 连接客户端指定的端口 N+1,进行数据传输。如图: <br /> ![image.png](https://cdn.nlark.com/yuque/0/2021/png/25425154/1639443060227-771e4cf9-c13d-456f-be5d-7e8b600dfb1d.png#clientId=u4b818d17-908b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=375&id=u9d70a004&margin=%5Bobject%20Object%5D&name=image.png&originHeight=750&originWidth=1242&originalType=binary&ratio=1&rotation=0&showTitle=false&size=280140&status=done&style=none&taskId=u15cc4ce5-14b1-45f6-99cd-34b975666a9&title=&width=621)<br /> 在被动模式下,FTP 客户端随机开启一个大于 1024 的端口 N 向服务器的 21 号端口发起连接,发送用户名和密码进行登陆,同时会开启 N+1 端口。然后向 服务器发送 PASV 命令,通知服务器自己处于被动模式。服务器收到命令后,会 开放一个大于 1024 的端口 P(端口 P 的范围是可以设置的,后面会说到这个是 很重要的)进行监听,然后用 PORT P 命令通知客户端,自己的数据端口是 P。 客户端收到命令后,会通过 N+1 号端口连接服务器的端口 P,然后在两个端口之 间进行数据传输。如图: <br /> ![image.png](https://cdn.nlark.com/yuque/0/2021/png/25425154/1639443137660-1be81800-e526-4291-a017-58b7f79db920.png#clientId=u4b818d17-908b-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=446&id=u3ea11e2c&margin=%5Bobject%20Object%5D&name=image.png&originHeight=952&originWidth=1297&originalType=binary&ratio=1&rotation=0&showTitle=false&size=294370&status=done&style=none&taskId=u7f53dcce-b946-46f1-b4e3-fa0dd829854&title=&width=607.4954223632812)
安装FTP
*ftp节点上操作*
//更改主机名
[root@bbb ~]# hostnamectl set-hostname ftp
[root@bbb ~]#
//刷新
[root@ftp ~]# bash
//yum安装FTP服务
[root@ftp ~]# yum install vsftpd -y
//重启ftp
[root@ftp ~]# systemctl restart vsftpd
//安装端口查询依赖
[root@ftp ~]# yum install net-tools telnet -y
//查看21端口(ftp有两个端口号)
[root@ftp ~]# netstat -lntp | grep 21
tcp6 0 0 :::21 :::* LISTEN 10104/vsftpd
//关闭防火墙
[root@ftp ~]# systemctl stop firewalld
[root@ftp ~]# systemctl enable firewalld
[root@ftp ~]# setenforce 0
*NFS节点上操作*
[root@aaa ~]# hostnamectl set-hostname nfs
[root@aaa ~]#
[root@nfs ~]# bash
[root@nfs ~]# yum install vsftpd -y
[root@nfs ~]# systemctl restart vsftpd
//安装端口查询依赖
[root@nfs ~]# yum install net-tools telnet -y
[root@nfs ~]# netstat -lntp | grep 21
tcp6 0 0 :::21 :::* LISTEN 10104/vsftpd
[root@nfs ~]# systemctl stop firewalld
[root@nfs ~]# systemctl enable firewalld
[root@nfs ~]# setenforce 0
*ftp节点上操作*
//移动到vsftpd目录下
[root@ftp ~]# cd /etc/vsftpd/
//查看目录下的文件(重要的是 vsftpd.conf 配置文件)
[root@ftp vsftpd]# ls
ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
//复制备份配置文件
[root@ftp vsftpd]# cp vsftpd.conf{,.bak}
//查看
[root@ftp vsftpd]# ll
总用量 28
-rw-------. 1 root root 125 6月 10 2021 ftpusers
-rw-------. 1 root root 361 6月 10 2021 user_list
-rw-------. 1 root root 5116 6月 10 2021 vsftpd.conf
-rw-------. 1 root root 5116 12月 14 19:30 vsftpd.conf.bai
-rwxr--r--. 1 root root 338 6月 10 2021 vsftpd_conf_migrate.sh
//获取写入文件
([root@nfs vsftpd]# grep -v '#' vsftpd.conf.bak > vsftpd.conf)
[root@nfs vsftpd]# egrep -v '^$|^#' vsftpd.conf.bak > vsftpd.conf
[root@nfs vsftpd]#
[root@nfs vsftpd]# cat vsftpd.conf
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
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
配置FTP
创建账号数据
虚拟用户配置
*ftp节点上操作*
1.创建账号数据
[root@ftp vsftpd]# vi users.conf
[root@ftp vsftpd]# cat users.conf
zhanghao //账号
123456 //密码
mima //账号
000000 //密码
//vsftpd 服务使用 Berkeley DB 格式的数据库文件来存放虚拟用户账号。建立
这种数据库文件需要用到 db_load 工具,db_load 工具由 db4-utils 软件包提供,
默认已安装
//所以转换下
[root@ftp vsftpd]# db_load -T -t hash -f /etc/vsftpd/users.conf /etc/vsftpd/users.db
[root@ftp vsftpd]# ll
总用量 40
-rw-------. 1 root root 125 6月 10 2021 ftpusers
-rw-------. 1 root root 361 6月 10 2021 user_list
-rw-r--r--. 1 root root 28 12月 14 20:09 users.conf
-rw-r--r--. 1 root root 12288 12月 14 20:11 users.db
-rw-------. 1 root root 248 12月 14 19:42 vsftpd.conf
-rw-------. 1 root root 5116 12月 14 19:30 vsftpd.conf.bai
-rwxr--r--. 1 root root 338 6月 10 2021 vsftpd_conf_migrate.sh
//为了提高虚拟用户账号文件的安全性,应将文件权限设置为 600,以免数据外泄
[root@ftp vsftpd]# chmod 600 users.db
//*创建 FTP 根目录及虚拟用户映射的系统用户
[root@ftp vsftpd]# useradd vsftpd -d /home/vsftpd -s /sbin/nologin
[root@ftp vsftpd]# mkdir -p /home/vsftpd/xmcsxy
[root@ftp vsftpd]# chmod -R 755 /home/vsftpd
([root@ftp vsftpd]# chmod -R 777 /home/)
//*建立支持虚拟用户的 PAM 认证文件(若要读取虚拟用户的账号数据文件,则需要创建新的 PAM 认证配置)
[root@ftp vsftpd]# vi /etc/pam.d/vsftpd
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/users
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/users
2.添加虚拟用户支持
//2.添加虚拟用户支持
//*在 vsftpd.conf 文件中添加虚拟用
[root@ftp vsftpd]# vi vsftpd.conf
anonymous_enable=yes //把这个换成no
//再添加四行
chroot_local_user=YES
guest_enable=YES
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
//*有了上述配置以后,就可以在/etc/vsftpd/vsftpd_user_conf 目录中为每个虚拟用户分别建立配置文件了。
[root@ftp vsftpd]# mkdir -p /etc/vsftpd/vsftpd_user_conf
//移动到虚拟用户使用的配置文件目录
[root@ftp vsftpd]# cd /etc/vsftpd/vsftpd_user_conf
[root@ftp vsftpd_user_conf]# vi zhanghao
//添加这三行
local_root=/home/vsftpd/xmcsxy
anon_upload_enable=YES
write_enable=YES
[root@ftp vsftpd_user_conf]# vi mima
//也添加这三行
local_root=/home/vsftpd/xmcsxy# //当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录
anon_upload_enable=YES
write_enable=YES
3,启动服务并测试
//重启
[root@ftp vsftpd_user_conf]# systemctl restart vsftpd
[root@ftp vsftpd_user_conf]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
如果报错是553应该就是权限错误
[root@ftp ~]# chmod 755 -R /etc/vsftpd/vsftpd_user_conf/
[root@ftp ~]# chmod 777 -R /home/vsftpd/
成功
//在nfs上测试
[root@nfs ~]# yum -y install lftp
[root@nfs ~]# lftp zhangsan@192.168.100.11
[root@nfs ~]# lftp bai:1234@192.168.142.162:21
lftp bai@192.168.142.162:~> ls
-rw------- 1 14 50 1244 Dec 14 09:35 anaconda-ks.cfg
-rw------- 1 14 50 751 Dec 14 09:37 bai.html
-rwxrwxrwx 1 0 0 0 Dec 14 09:29 bai.txt
-rw------- 1 14 50 552085090 Dec 14 09:37 英语.pptx
lftp bai@192.168.142.162:/>