简介

  1. FTPFile Transfer Protocol,文件传输协议) TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。在开发网站的时候,通常利用FTP协议把网页或程序传到Web服务器上。此外,由于FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。<br /> FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。<br /> 2、使用场合<br /> 用于文件的传输;<br /> 3FTP的作用<br /> 用于文件的上传和下载;<br /> 4FTP属于协议及端口号<br /> 属于tcp协议<br /> 端口号:<br /> 21:控制层面,用于账户密码验证,权限的验证;<br /> 20:数据层面,用于文件的上传和下载;

原理

  1. 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

  1. *ftp节点上操作*
  2. //更改主机名
  3. [root@bbb ~]# hostnamectl set-hostname ftp
  4. [root@bbb ~]#
  5. //刷新
  6. [root@ftp ~]# bash
  7. //yum安装FTP服务
  8. [root@ftp ~]# yum install vsftpd -y
  9. //重启ftp
  10. [root@ftp ~]# systemctl restart vsftpd
  11. //安装端口查询依赖
  12. [root@ftp ~]# yum install net-tools telnet -y
  13. //查看21端口(ftp有两个端口号)
  14. [root@ftp ~]# netstat -lntp | grep 21
  15. tcp6 0 0 :::21 :::* LISTEN 10104/vsftpd
  16. //关闭防火墙
  17. [root@ftp ~]# systemctl stop firewalld
  18. [root@ftp ~]# systemctl enable firewalld
  19. [root@ftp ~]# setenforce 0
  20. *NFS节点上操作*
  21. [root@aaa ~]# hostnamectl set-hostname nfs
  22. [root@aaa ~]#
  23. [root@nfs ~]# bash
  24. [root@nfs ~]# yum install vsftpd -y
  25. [root@nfs ~]# systemctl restart vsftpd
  26. //安装端口查询依赖
  27. [root@nfs ~]# yum install net-tools telnet -y
  28. [root@nfs ~]# netstat -lntp | grep 21
  29. tcp6 0 0 :::21 :::* LISTEN 10104/vsftpd
  30. [root@nfs ~]# systemctl stop firewalld
  31. [root@nfs ~]# systemctl enable firewalld
  32. [root@nfs ~]# setenforce 0
  33. *ftp节点上操作*
  34. //移动到vsftpd目录下
  35. [root@ftp ~]# cd /etc/vsftpd/
  36. //查看目录下的文件(重要的是 vsftpd.conf 配置文件)
  37. [root@ftp vsftpd]# ls
  38. ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh
  39. //复制备份配置文件
  40. [root@ftp vsftpd]# cp vsftpd.conf{,.bak}
  41. //查看
  42. [root@ftp vsftpd]# ll
  43. 总用量 28
  44. -rw-------. 1 root root 125 6 10 2021 ftpusers
  45. -rw-------. 1 root root 361 6 10 2021 user_list
  46. -rw-------. 1 root root 5116 6 10 2021 vsftpd.conf
  47. -rw-------. 1 root root 5116 12 14 19:30 vsftpd.conf.bai
  48. -rwxr--r--. 1 root root 338 6 10 2021 vsftpd_conf_migrate.sh
  49. //获取写入文件
  50. ([root@nfs vsftpd]# grep -v '#' vsftpd.conf.bak > vsftpd.conf
  51. [root@nfs vsftpd]# egrep -v '^$|^#' vsftpd.conf.bak > vsftpd.conf
  52. [root@nfs vsftpd]#
  53. [root@nfs vsftpd]# cat vsftpd.conf
  54. anonymous_enable=YES
  55. local_enable=YES
  56. write_enable=YES
  57. local_umask=022
  58. dirmessage_enable=YES
  59. xferlog_enable=YES
  60. connect_from_port_20=YES
  61. xferlog_std_format=YES
  62. listen=NO
  63. listen_ipv6=YES
  64. pam_service_name=vsftpd
  65. userlist_enable=YES
  66. tcp_wrappers=YES

配置FTP

创建账号数据
虚拟用户配置
image.png

  1. *ftp节点上操作*
  2. 1.创建账号数据
  3. [root@ftp vsftpd]# vi users.conf
  4. [root@ftp vsftpd]# cat users.conf
  5. zhanghao //账号
  6. 123456 //密码
  7. mima //账号
  8. 000000 //密码
  9. //vsftpd 服务使用 Berkeley DB 格式的数据库文件来存放虚拟用户账号。建立
  10. 这种数据库文件需要用到 db_load 工具,db_load 工具由 db4-utils 软件包提供,
  11. 默认已安装
  12. //所以转换下
  13. [root@ftp vsftpd]# db_load -T -t hash -f /etc/vsftpd/users.conf /etc/vsftpd/users.db
  14. [root@ftp vsftpd]# ll
  15. 总用量 40
  16. -rw-------. 1 root root 125 6 10 2021 ftpusers
  17. -rw-------. 1 root root 361 6 10 2021 user_list
  18. -rw-r--r--. 1 root root 28 12 14 20:09 users.conf
  19. -rw-r--r--. 1 root root 12288 12 14 20:11 users.db
  20. -rw-------. 1 root root 248 12 14 19:42 vsftpd.conf
  21. -rw-------. 1 root root 5116 12 14 19:30 vsftpd.conf.bai
  22. -rwxr--r--. 1 root root 338 6 10 2021 vsftpd_conf_migrate.sh
  23. //为了提高虚拟用户账号文件的安全性,应将文件权限设置为 600,以免数据外泄
  24. [root@ftp vsftpd]# chmod 600 users.db
  25. //*创建 FTP 根目录及虚拟用户映射的系统用户
  26. [root@ftp vsftpd]# useradd vsftpd -d /home/vsftpd -s /sbin/nologin
  27. [root@ftp vsftpd]# mkdir -p /home/vsftpd/xmcsxy
  28. [root@ftp vsftpd]# chmod -R 755 /home/vsftpd
  29. ([root@ftp vsftpd]# chmod -R 777 /home/)
  30. //*建立支持虚拟用户的 PAM 认证文件(若要读取虚拟用户的账号数据文件,则需要创建新的 PAM 认证配置)
  31. [root@ftp vsftpd]# vi /etc/pam.d/vsftpd
  32. auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/users
  33. account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/users

2.添加虚拟用户支持

  1. //2.添加虚拟用户支持
  2. //*在 vsftpd.conf 文件中添加虚拟用
  3. [root@ftp vsftpd]# vi vsftpd.conf
  4. anonymous_enable=yes //把这个换成no
  5. //再添加四行
  6. chroot_local_user=YES
  7. guest_enable=YES
  8. allow_writeable_chroot=YES
  9. user_config_dir=/etc/vsftpd/vsftpd_user_conf
  10. //*有了上述配置以后,就可以在/etc/vsftpd/vsftpd_user_conf 目录中为每个虚拟用户分别建立配置文件了。
  11. [root@ftp vsftpd]# mkdir -p /etc/vsftpd/vsftpd_user_conf
  12. //移动到虚拟用户使用的配置文件目录
  13. [root@ftp vsftpd]# cd /etc/vsftpd/vsftpd_user_conf
  14. [root@ftp vsftpd_user_conf]# vi zhanghao
  15. //添加这三行
  16. local_root=/home/vsftpd/xmcsxy
  17. anon_upload_enable=YES
  18. write_enable=YES
  19. [root@ftp vsftpd_user_conf]# vi mima
  20. //也添加这三行
  21. local_root=/home/vsftpd/xmcsxy# //当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录
  22. anon_upload_enable=YES
  23. write_enable=YES

3,启动服务并测试

  1. //重启
  2. [root@ftp vsftpd_user_conf]# systemctl restart vsftpd
  3. [root@ftp vsftpd_user_conf]# systemctl enable vsftpd
  4. Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
  5. 如果报错是553应该就是权限错误
  6. [root@ftp ~]# chmod 755 -R /etc/vsftpd/vsftpd_user_conf/
  7. [root@ftp ~]# chmod 777 -R /home/vsftpd/

FTP服务 - 图2
成功
FTP服务 - 图3

  1. //在nfs上测试
  2. [root@nfs ~]# yum -y install lftp
  3. [root@nfs ~]# lftp zhangsan@192.168.100.11
  4. [root@nfs ~]# lftp bai:1234@192.168.142.162:21
  5. lftp bai@192.168.142.162:~> ls
  6. -rw------- 1 14 50 1244 Dec 14 09:35 anaconda-ks.cfg
  7. -rw------- 1 14 50 751 Dec 14 09:37 bai.html
  8. -rwxrwxrwx 1 0 0 0 Dec 14 09:29 bai.txt
  9. -rw------- 1 14 50 552085090 Dec 14 09:37 英语.pptx
  10. lftp bai@192.168.142.162:/>