FTP
ftp简介
网络文件共享服务主流的主要有三种,分别是ftp、nfs、samba。
FTP是File Transfer Protocol(文件传输协议)的简称,用于internet上的控制文件的双向传输。
FTP也是一个应用程序,基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议以传输文件。
在FTP的使用当中,用户经常遇到两种概念:下载和上传
| 下载(Download) | 上传(Upload) |
|---|---|
| 从远程主机拷贝文件至自己的计算机上 | 将文件从自己的计算机上拷贝至远程主机上 |
ftp架构
FTP工作于应用层,监听于tcp的21号端口,是一种C/S架构的应用程序。其有多种客户端和服务端的应用程序,下面来简单介绍一下
| 客户端工具 | 服务端软件 |
|---|---|
| ftp lftp,lftpget wget,curl filezilla gftp(Linux GUI) 商业软件(flashfxp,cuteftp) |
wu-ftpd proftpd(提供web接口的一种ftp服务端程序) pureftp vsftpd(Very Secure) ServU(windows平台的一种强大ftp服务端程序) |
ftp数据连接模式
ftp有2种数据连接模式:命令连接和数据连接
- 命令连接:是指文件管理类命令,始终在线的持久性连接,直到用户退出登录为止
- 数据连接:是指数据传输,按需创建及关闭的连接
其中数据连接需要关注的有2点,一是数据传输格式,二是数据传输模式
数据传输格式有以下两种:
- 文件传输
- 二进制传输
数据传输模式也有2种:
- 主动模式:由服务器端创建数据连接
- 被动模式:由客户端创建数据连接
两种数据传输模式的建立过程:
| 传输模式 | 建立过程 |
|---|---|
| 主动模式 | 命令连接: Client(1025)--> Server(21) 客户端以一个随机端口(大于1023)来连服务器端的21号端口 数据连接: Server(20/tcp) --> Client(1025+1) 服务器端以自己的20号端口去连客户端创建命令连接时使用的随机端口+1的端口号 |
| 被动模式 | 命令连接: Client(1110) --> Server(21) 客户端以一个随机端口来连成服务器端的21号端口 数据连接: Client(1110+1) --> Server(随机端口) 客户端以创建命令连接的端口+1的端口号去连服务器端通过命令连接告知自己的一个随机端口号来创建数据连接 |
主动模式有个弊端,因为客户端的端口是随机的,客户端如果开了防火墙,
则服务器端去连客户端创建数据连接时可能会被拒绝
用户认证
ftp的用户主要有三种:
- 虚拟用户:仅用于访问某特定服务中的资源
- 系统用户:可以登录系统的真实用户
- 匿名用户
vsftpd
此处我们要说的ftp应用程序是vsftpd,这也是在公司中用得最多的一款ftp软件。
vsftpd安装
[root@cb ~]# yum -y install vsftpd Updating Subscription Management repositories. Unable to read consumer identity This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register. Repository base is listed more than once in the configuration Repository extras is listed more than once in the configuration Repository centosplus is listed more than once in the configuration 上次元数据过期检查:14:30:12 前,执行于 2021年04月08日 星期四 00时50分09秒。 软件包 vsftpd-3.0.3-28.el8.x86_64 已安装。 依赖关系解决。 ============================================================================================= 软件包 架构 版本 仓库 大小 ============================================================================================= 升级: vsftpd x86_64 3.0.3-32.el8 AppStream 180 k 事务概要 ============================================================================================= 升级 1 软件包 总下载:180 k 下载软件包: vsftpd-3.0.3-32.el8.x86_64.rpm 439 kB/s | 180 kB 00:00 --------------------------------------------------------------------------------------------- 总计 437 kB/s | 180 kB 00:00 运行事务检查 事务检查成功。 运行事务测试 事务测试成功。 运行事务 准备中 : 1/1 运行脚本: vsftpd-3.0.3-32.el8.x86_64 1/1 升级 : vsftpd-3.0.3-32.el8.x86_64 1/2 运行脚本: vsftpd-3.0.3-32.el8.x86_64 1/2 运行脚本: vsftpd-3.0.3-28.el8.x86_64 2/2 清理 : vsftpd-3.0.3-28.el8.x86_64 2/2 运行脚本: vsftpd-3.0.3-28.el8.x86_64 2/2 验证 : vsftpd-3.0.3-32.el8.x86_64 1/2 验证 : vsftpd-3.0.3-28.el8.x86_64 2/2 Installed products updated. 已升级: vsftpd-3.0.3-32.el8.x86_64 完毕!
vsftpd配置
/etc/pam.d/vsftpd //vsftpd用户认证配置文件 /etc/vsftpd/ //配置文件目录 /etc/vsftpd/vsftpd.conf //主配置文件 //匿名用户(映射为ftp用户)的共享资源位置是/var/ftp //系统用户通过ftp访问的资源位置为用户的家目录 //虚拟用户通过ftp访问的资源位置为给虚拟用户指定的映射成为的系统用户的家目录
vsftpd常见的配置参数:
| 参数 | 作用 |
|---|---|
| anonymous_enable=YES | 启用匿名用户登录 |
| anon_upload_enable=YES | 允许匿名用户上传 |
| anon_mkdir_write_enable=YES | 允许匿名用户创建目录,但是不能删除 |
| anon_other_write_enable=YES | 允许匿名用户创建和删除目录 |
| local_enable=YES | 启用本地用户登录 |
| write_enable=YES | 允许本地用户有写权限 |
| local_umask=022 | 通过ftp上传文件的默认遮罩码 |
| chroot_local_user=YES | 禁锢所有的ftp本地用户于其家目录中 |
| chroot_list_enable=YES | 开启禁锢文件列表 需要与chroot_list_file参数一起使用 |
| chroot_list_file=/etc/vsftpd/chroot_list | 指定禁锢列表文件路径 在此文件里面的用户将被禁锢在其家目录中 |
| allow_writeable_chroot=YES | 允许被禁锢的用户家目录有写权限 |
| xferlog_enable=YES | 是否启用传输日志,记录ftp传输过程 |
| xferlog_std_format=YES | 传输日志是否使用标准格式 |
| xferlog_file=/var/log/xferlog | 指定传输日志存储的位置 |
| chown_uploads=YES | 是否启用改变上传文件属主的功能 |
| chown_username=whoever | 指定要将上传的文件的属主改为哪个用户 此用户必须在系统中存在 |
| pam_service_name=vsftpd | 指定vsftpd使用/etc/pam.d下的 哪个pam配置文件进行用户认证 |
| userlist_enable=YES | 是否启用控制用户登录的列表文件: 默认为/etc/vsftpd/user_list文件 |
| userlist_deny=YES | 是否拒绝userlist指定的列表文件中存在的用户登录ftp |
| max_clients=# | 最大并发连接数 |
| max_per_ip=# | 每个IP可同时发起的并发请求数 |
| anon_max_rate | 匿名用户的最大传输速率,单位是“字节/秒” |
| local_max_rate | 本地用户的最大传输速率,单位是“字节/秒” |
| dirmessage_enable=YES | 启用某目录下的.message描述信息 假定有一个目录为/upload,在其下创建一个文件名为.message, 在文件内写入一些描述信息,则当用户切换至/upload目录下时会自动显示.message文件中的内容 |
| message_file | 设置访问一个目录时获得的目录信息文件的文件名,默认是.message |
| idle_session_timeout=600 | 设置默认的断开不活跃session的时间 |
| data_connection_timeout=120 | 设置数据传输超时时间 |
| ftpd_banner="Welcome to chenlf FTP service." | 定制欢迎信息,登录ftp时自动显示 |
//虚拟用户的配置: //所有的虚拟用户会被统一映射为一个指定的系统帐号,访问的共享位置即为此系统帐号的家目录 //各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定 //虚拟用户帐号的存储方式: 1.文件:编辑文件,此文件需要被编码为hash格式。 奇数行为用户名 偶数行为密码 2.关系型数据库的表中: 通过即时查询数据库完成用户认证 mysql库:pam要依赖于pam_mysql软件,可以通过epel源yum安装
vsftpd虚拟用户配置
vsftpd虚拟用户的配置步骤如下:
| 服务端 | cb | 192.168.122.143 |
| 客服端 | cxx | 192.168.122.148 |
匿名用户访问模式
[root@cb ~]# cat > /etc/vsftpd/vsftpd.conf <<EOF > anonymous_enable=yes > local_enable=YES > write_enable=YES > local_umask=022 > anon_upload_enable=YES > anon_mkdir_write_enable=YES > anon_other_write_enable=YES > EOF [root@cxx ~]# ftp 192.168.122.143 Connected to 192.168.122.143 (192.168.122.143). 220 (vsFTPd 3.0.3) Name (192.168.122.143:root): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls 227 Entering Passive Mode (192,168,122,143,47,149). 150 Here comes the directory listing. drwxr-xr-x 2 0 0 6 Apr 27 2020 pub 226 Directory send OK. ftp> cd pub 250 Directory successfully changed. ftp> mkdir cb 550 Create directory operation failed. ftp> ls 227 Entering Passive Mode (192,168,122,143,21,150). 150 Here comes the directory listing. 226 Directory send OK. ftp> exit 221 Goodbye. [root@cb ~]# ll /var/ftp/ 总用量 0 drwxr-xr-x. 2 root root 6 8月 13 2018 pub [root@cb ~]# chown ftp /var/ftp/pub/ [root@cb ~]# ll /var/ftp/ 总用量 0 drwxr-xr-x. 2 ftp root 6 8月 13 2018 pub //修改所有者后,在用客户端尝试 [root@cxx ~]# ftp 192.168.122.143 Connected to 192.168.122.143 (192.168.122.143). 220 (vsFTPd 3.0.3) Name (192.168.122.143:root): anonymous 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> cd pub 250 Directory successfully changed. ftp> mkdir cb 257 "/pub/cb" created ftp> ls 227 Entering Passive Mode (192,168,122,143,140,217). 150 Here comes the directory listing. drwx------ 2 14 50 6 Apr 08 08:35 cb 226 Directory send OK. ftp> exit 221 Goodbye. //查看一下 [root@cb ~]# ll /var/ftp/pub/ 总用量 0 drwx------. 2 ftp ftp 6 4月 8 16:35 cb
本地用户模式
//写配置文件 [root@cb ~]# cat /etc/vsftpd/vsftpd.conf anonymous_enable=NO 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 userlist_deny=YES //重启服务 [root@cb ~]# systemctl restart vsftpd [root@cb ~]# cat /etc/vsftpd/user_list # vsftpd userlist # If userlist_deny=NO, only allow users in this file # If userlist_deny=YES (default), never allow users in this file, and # do not even prompt for a password. # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers # for users that are denied. root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody [root@cb ~]# useradd cb [root@cb ~]# echo cb | passwd --stdin cb 更改用户 cb 的密码 。 passwd:所有的身份验证令牌已经成功更新。 [root@cxx ~]# ftp 192.168.122.143 Connected to 192.168.122.143 (192.168.122.143). 220 (vsFTPd 3.0.3) Name (192.168.122.143:root): cb 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> ls -a 227 Entering Passive Mode (192,168,122,143,246,47). 150 Here comes the directory listing. drwx------ 2 1002 1002 62 Apr 08 08:42 . drwxr-xr-x 5 0 0 40 Apr 08 08:42 .. -rw-r--r-- 1 1002 1002 18 Jan 14 2019 .bash_logout -rw-r--r-- 1 1002 1002 141 Jan 14 2019 .bash_profile -rw-r--r-- 1 1002 1002 312 Jan 14 2019 .bashrc 226 Directory send OK. ftp> mkdir cb1 257 "/home/cb/cb1" created ftp> ls 227 Entering Passive Mode (192,168,122,143,81,42). 150 Here comes the directory listing. drwxr-xr-x 2 1002 1002 6 Apr 08 08:44 cb1 226 Directory send OK. ftp> exit 221 Goodbye. //在服务端查看 [root@cb ~]# ll /home/cb/ 总用量 0 drwxr-xr-x. 2 cb cb 6 4月 8 16:44 cb1
虚拟用户模式
虚拟用户的配置: 所有的虚拟用户会被统一映射为一个指定的系统帐号,访问的共享位置即为此系统帐号的家目录 各虚拟用户可被赋予不同的访问权限,通过匿名用户的权限控制参数进行指定 虚拟用户帐号的存储方式: 1.文件:编辑文件,此文件需要被编码为hash格式。 奇数行为用户名 偶数行为密码 2.关系型数据库的表中: 通过即时查询数据库完成用户认证 mysql库:pam要依赖于pam_mysql软件,可以通过epel源yum安装
虚拟用户模式配置流程大致如下:
1.建立虚拟FTP用户数据库文件
2.创建FTP根目录及虚拟用户映射的系统用户
3.建立虚拟用户的PAM认证文件
4.在vsftpd.conf文件中添加支持配置
5.为虚拟用户设置不同权限
6.重启服务
//建立虚拟FTP用户数据库文件 [root@cb ~]# cat > /etc/vsftpd/vuser.txt <<EOF > cb > a > cb1 > b > EOF //使用db_load命令用HASH算法生成FTP用户数据库文件vuser.db [root@cb ~]# db_load -T -t hash -f /etc/vsftpd/vuser.txt /etc/vsftpd/vuser.db //提高虚拟用户帐号文件的安全性,应将文件权限设置为600,以避免数据外泄 [root@cb ~]# chmod 600 /etc/vsftpd/vuser* //创建FTP根目录及虚拟用户映射为系统用户 [root@cb ~]# useradd -d /var/ftproot -s /sbin/nologin vuser //修改其家目录权限保证其他用户可以访问 [root@cb ~]# chmod 755 /var/ftproot/ //建立虚拟用户的PAM认证文件 [root@cb ~]# vim /etc/pam.d/vsftpd.vu [root@cb ~]# cat /etc/pam.d/vsftpd.vu auth required pam_userdb.so db=/etc/vsftpd/vuser account required pam_userdb.so db=/etc/vsftpd/vuser //在vsftpd.conf文件中添加支持配置 [root@cb ~]# cat > /etc/vsftpd/vsftpd.conf <<EOF > anonymous_enable=NO > local_enable=YES > write_enable=YES > pam_service_name=vsftpd.vu > guest_enable=YES > guest_username=vuser > allow_writeable_chroot=YES > EOF //为虚拟用户设置不同权限 [root@cb ~]# mkdir /etc/vsftpd/vuser_dir [root@cb ~]# echo 'user_config_dir=/etc/vsftpd/vuser_dir' >> /etc/vsftpd/vsftpd.conf //为不同的虚拟用户配置权限,yuqinghao用户可以上传和创建目录,以及写入权限 [root@cb ~]# vim /etc/vsftpd/vuser_dir/cb [root@cb ~]# cat /etc/vsftpd/vuser_dir/cb anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES [root@cb ~]# touch /etc/vsftpd/vuser_dir/cb1 [root@cb ~]# systemctl restart vsftpd //在客户端测试 [root@cxx ~]# ftp 192.168.122.143 Connected to 192.168.122.143 (192.168.122.143). 220 (vsFTPd 3.0.3) Name (192.168.122.143:root): cb 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> mkdir 1 257 "/1" created ftp> exit 221 Goodbye. [root@cxx ~]# ftp 192.168.122.143 Connected to 192.168.122.143 (192.168.122.143). 220 (vsFTPd 3.0.3) Name (192.168.122.143:root): cb1 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> mkdir 2 550 Permission denied. ftp> exit 221 Goodbye.
浙公网安备 33010602011771号