- A+
FTP:File Transfer Protocol ,文件传输协议
FTP:属于NAS存储的一种协议,基于CS结构。
FTP的工作原理:
ftp采用的是双端口模式,分为命令端口和数据端口
-
命令端口:固定,tcp/21,命令端口对应的就是命令通道
-
数据端口:不固定,数据端口对应的就是数据通道
说明:
ftp不同的工作模式使用不同类型的端口。
ftp的工作模式:(从服务器角度)
-
主动模式:服务器主动向客户端发起连接
-
被动模式:服务器被动接受客户端的连接请求
说明:
主动模式和被动模式是数据通道的概念。
ftp的通信流程:
-
1.服务端开启对21端口的监听。
-
2.客户端发起对服务端的连接请求,通过服务器的21端口连接到服务器。此时建立起了命令通道,命令通道用于传输和通信相关的一些指令。
-
3.建立数据通道
如果是主动模式:服务端会使用20端口主动连客户端的一个随机端口。
如果是被动模式:客户端使用一个随机端口连接服务端的一个随机端口 -
4.使用数据通道进行数据的传输。
说明:
不管是主动模式还是被动模式,服务端都会打开两个端口,一个固定的21端口用于和客户端建立命令通道。一个20或其他端口用于和客户端建立数据通道。
使用防火墙的连接跟踪功能可以解决防火墙对随机端口的拦截。
防火墙连接跟踪功能:
监控命令通道中传输的指令,自动分析随机端口,在客户端发起连接的时候就自动打开了这个随机端口。
iptables启动连接跟踪功能的方法:
探测端口是否打开的方法:
telnet工具
格式:telnet host port #如果能响应则端口就是打开的
例如:查看22端口是否开启
#如果telnet能响应则端口就是打开的' [root@CentOS8 ~]# telnet 10.0.0.12 22 Trying 10.0.0.12... Connected to 10.0.0.12. Escape character is '^]'. SSH-2.0-OpenSSH_8.0
常见 FTP 相关软件
服务端软件:centos默认的FTP服务端软件是FTP
客户端软件:FTP、wget、curl等等
vsftpd 软件
Very Secure FTP Daemon,CentOS 默认FTP服务器
特点:
速度快、稳定性好
官网:
https://security.appspot.com/vsftpd.html
vsftpd的相关配置:
配置文件格式:option=value
注意:= 前后不要有空格
使用:man vsftpd.conf 可以查看csftpd的相关配置说明
- 配置命令通道的命令端口
默认为21端口
listen_port=2121 默认值为21
- 数据通道主动模式的端口
connect_from_port_20=YES #设置主动模式端口为20 ftp_data_port=20 (默认) #指定主动模式的端口
- 被动模式端口范围
linux ftp 客户端默认使用被动模式 windows ftp 客户端默认使用主动模式 pasv_min_port=6000 0为随机分配,端口范围会影响客户端的并发数 pasv_max_port=6010 #表示被动模式端口范围是6000---6010
- ftp服务器的时间
use_localtime=YES 使用当地时间(默认为NO,使用GMT) #默认使用的是格林尼治时间,北京时间为:GMT+8
- 匿名用户登录
#开启后可以使用匿名用户ftp或anonymous登录 anonymous_enable=YES #支持匿名用户,CentOS8 默认不允许匿名 no_anon_password=YES #匿名用户略过口令检查 , 默认NO,表示不输入匿名用户的密码进行登录
- 匿名用户上传文件
anon_upload_enable=YES #表示允许匿名上传,注意:文件系统权限 #FTP服务端允许了匿名用户上传,但是指定文件的权限不允许上传也是没法上传成功 所以需要在服务器的指定目录下给ftp用户添加权限 anon_mkdir_write_enable=YES 匿名建目录
范例:实现匿名用户上传
服务端: [root@CentOS8 ~]# vim /etc/vsftpd/vsftpd.conf anon_upload_enable=YES #允许匿名用户上传 #如果没有开启权限,虽然打开了匿名上传功能,但是跨网络传输数据,ftp对远程目录的文件夹没有写权限,所以不能上传。 #给ftp用户根目录下的pub目录添加ftp用户的权限 [root@CentOS8 ~]# setfacl -m u:ftp:rwx /var/ftp/pub/ #给ftp用户权限 客户端: [root@CentOS8 ~]# ftp 10.0.0.11 Connected to 10.0.0.11 (10.0.0.11). 220 (vsFTPd 3.0.3) Name (10.0.0.11:root): ftp 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> !ls anaconda-ks.cfg test.1 ftp> cd pub 250 Directory successfully changed. ftp> put test.1 local: test.1 remote: test.1 227 Entering Passive Mode (10,0,0,11,51,195). 150 Ok to send data. 226 Transfer complete. 10485760 bytes sent in 0.057 secs (184086.66 Kbytes/sec) ftp>
说明:
不能给FTP根目录写权限,只能给子目录写权限,否则报如下错误
#服务端 [root@CentOS8 ~]# setfacl -m u:ftp:rwx /var/ftp/ #客户端访问 [root@CentOS8 ~]# ftp 10.0.0.11 Connected to 10.0.0.11 (10.0.0.11). 220 (vsFTPd 3.0.3) Name (10.0.0.11:root): ftp 500 OOPS: vsftpd: refusing to run with writable root inside chroot() Login failed. 421 Service not available, remote server has closed connection ftp>
方法一: anon_world_readable_only=NO 默认YES 所有人都具有读权限的文件才能下载 方法二: anon_umask=0333 指定匿名上传文件的umask,默认077,注意:0333中的0不能省略 0333是八进制形式 实现上传文件的删除和修改 anon_other_write_enable=YES 可删除和修改上传的文件,默认NO
- 指定匿名用户的上传文件的默认的所有者和权限
#默认上传文件的所有者就是客户端当前的账号 chown_uploads=YES #默认NO YES表示允许修改上传文件的权限和所有者 chown_username=wang #文件所有者 chown_upload_mode=0644 #文件权限
- 设置Linux系统用户登录ftp服务器
local_enable=YES #是否允许本地用户登录,YES表示允许 write_enable=YES #是否允许本地用户上传文件,YES表示允许 local_umask=022 #指定系统用户上传文件的默认权限对应umask
- 将系统用户映射为一个指定的账号
guest_enable=YES #所有系统用户都映射成某一个guest用户 guest_username=ftp #配合上面选项才生效,指定guest用户 local_root=/ftproot #指定guest账号登录进来映射的目录 #设置每个用户都拥有独立的配置 user_config_dir=/etc/vsftpd/conf.d/ 每个用户独立的配置文件目录 这里可以针对不同的用户放不同的配置
范例: 让所有的系统用户映射指定guest用户
服务器端配置 [root@CentOS8 ~]# vim /etc/vsftpd/vsftpd.conf guest_enable=YES guest_username=ftp local_root=/ftproot [root@CentOS8 ~]# useradd bob [root@CentOS8 ~]# passwd bob [root@CentOS8 ~]# mkdir ftproot/ [root@CentOS8 ~]# touch test1 客户端: [root@CentOS8 ~]# ftp 10.0.0.11 Connected to 10.0.0.11 (10.0.0.11). 220 (vsFTPd 3.0.3) Name (10.0.0.11:root): bob 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 (10,0,0,11,172,77). 150 Here comes the directory listing. -rw-r--r-- 1 0 0 0 Oct 21 03:46 test.1 226 Directory send OK. ftp>
范例:映射登录的用户为guest用户,并使用独立的家目录
服务端: #创建tom和bob两个用户 #修改服务器配置文件 [root@CentOS8 ~]# vim /etc/vsftpd/vsftpd.conf guest_enable=YES 所有系统用户都映射成guest用户 guest_username=ftp 配合上面选项才生效,指定guest用户 local_root=/ftproot 指定guest用户登录所在目录,但不影响匿名用户的登录目录 user_config_dir=/etc/vsftpd/conf.d/ 每个用户独立的配置文件目录 #创建存放tom和bob独立配置文件的目录 [root@CentOS8 ~]# mkdir /etc/vsftpd/conf.d/ #生成tom和bob的独立配置文件 [root@CentOS8 conf.d]# echo "local_root=/ftproot_bob" > /etc/vsftpd/conf.d/bob [root@CentOS8 conf.d]# echo "local_root=/ftproot_tom" > /etc/vsftpd/conf.d/tom #重启服务 [root@CentOS8 ~]# systemctl status vsftpd.service #创建对应的文件目录 [root@CentOS8 ~]# mkdir /ftproot_bob /ftproot_tom [root@CentOS8 ftproot_bob]# touch bob.test [root@CentOS8 ftproot_tom]# touch tom.test 客户端测试: [root@CentOS8 ~]# ftp 10.0.0.11 Connected to 10.0.0.11 (10.0.0.11). 220 (vsFTPd 3.0.3) Name (10.0.0.11:root): bob 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 (10,0,0,11,222,234). 150 Here comes the directory listing. -rw-r--r-- 1 0 0 0 Oct 21 05:37 bob.test 226 Directory send OK. ftp>
- 禁锢系统用户
禁锢所有系统用户在家目录中:
#不允许用户随便切换目录,只能在家目录中 chroot_local_user=YES #禁锢系统用户,默认NO,即不禁锢 此时ftp会把对应用户的家目录作为根目录,如果这个家目录存在写权限则登录的时候会提示错误相关错误信息。
访问ftp服务器可以通过三种类型的账号进行访问:
-
匿名用户:ftp、anonmous,共享目录在/vat/ftp下
-
系统用户:例如linux的自身的账号,默认进入的就是用户的加目录
-
虚拟账号:专用于ftp服务的账号,虚拟账号:给对应服务使用的账号,不在操作系统上的账号
- 日志
vsftpd默认使用的就是wu-ftp的日志格式 #wu-ftp 日志:默认启用 xferlog_enable=YES #启用记录上传下载日志,此为默认值 xferlog_std_format=YES #使用wu-ftp日志格式,此为默认值 xferlog_file=/var/log/xferlog #可自动生成, 此为默认值 #vsftpd日志:默认不启用 dual_log_enable=YES 使用vsftpd日志格式,默认不启用 vsftpd_log_file=/var/log/vsftpd.log 可自动生成, 此为默认值
- 提示信息:
(1)登录前提示信息
方法一: ftpd_banner="welcome to mage ftp server" 方法二:将提示信息存放到一个文件中 banner_file=/etc/vsftpd/ftpbanner.txt
(2)目录访问提示信息
dirmessage_enable=YES #此为默认值,开启这个选项后,在对应目录中创建指定文件就实现了提示信息 message_file=.message #信息存放在指定目录下.message ,此为默认值,只支持单行说明
- PAM模块实现用户访问控制
pam是一个可插拔的配置模块,利用pam可以控制用户的访问
pam_service_name=vsftpd # 默认值 vsftpd是/etc/pam.d/vsftpd下的一个文件 #pam配置文件:/etc/pam.d/vsftpd /etc/vsftpd/ftpusers 默认文件中用户拒绝登录,默认是黑名单,但也可以是白名单
查看黑名单中限制登录ftp的用户
[root@CentOS8 pam.d]# cat /etc/vsftpd/ftpusers # Users that are not allowed to login via ftp root bin daemon adm lp sync shutdown halt mail news uucp operator games nobody
是否启用控制用户登录的列表文件
userlist_enable=YES #此为默认值,表示启用xx这个文件列表 userlist_deny=YES(默认值) #表示将xx设置为黑名单,不提示口令,NO为白名单 userlist_file=/etc/vsftpd/user_list #此为默认值,指定登录列表文件
[root@CentOS8 pam.d]# 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
- 连接数限制
max_clients=0 #设置最大并发连接数 max_per_ip=0 #设置每个IP同时发起的最大连接数
- 连接超时时间设置;
connect_timeout=60 #主动模式数据连接超时时长 accept_timeout=60 #被动模式数据连接超时时长 data_connection_timeout=300 #数据连接无数据输超时时长 idle_session_timeout=60 #无命令操作超时时长
- 设置传输速率,单位:字节/秒
anon_max_rate=0 匿名用户的最大传输速率,以字节为单位,比如:1024000表示1MB/s local_max_rate=0 本地用户的最大传输速率