运维基础-存储02 FTP
1、FTP协议
1、FTP协议简介
- FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的协议之一。
- FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。
- FTP传输效率非常高,在网络上传输大的文件时,一般也采用该协议。
- 默认情况下FTP协议使用TCP端口中的20和21这两个端口,其中20用于传输数据,21用于传输控制信息。
2、FTP两种工作方式
- 一个客户端和服务器之间,只会有一个命令连接,但可能会有多个数据连接。
- 命令连接:传输命令。命令连接会一直在,直到客户端断开连接。
- 数据连接:传输数据。每个数据连接就是一次数据传输,数据传输完成该连接随即断开。
1、主动模式(PORT)
- 主动模式下,客户端随机打开一个大于1024的端口N向服务器的21端口发起连接,同时开放N+1端口,并向服务器发出“port N+1”命令。
- 由服务器的20端口主动连接到客户端N+1端口。
- 注意:FTP的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。对于客户端的防火墙来说,这是从外部到内部的连接,可能会被阻止。
2、被动模式(PASV)
- 被动模式下,客户端打开两个随机端口N和N+1(N>1024)。
- 客户端的N端口连接服务器的21端口,提交PASV命令。
- 然后,服务器会开启一个随机端口P(P>1024),返回如“227 entering passive mode(127,0,0,1,4,18)”。它返回了227开头的信息,在括号中有以逗号隔开的六个数字,前四个指服务器的地址,最后两个,将倒数第二个乘256再加上最后一个数字,这就是FTP服务器开放的用来进行数据传输的端口。
- 客户端收到命令并取得服务器的数据端口P之后,会通过N+1端口连接服务器的P端口,然后在两个端口之间进行数据传输。
3、配置主动、被动模式
- 在linux上,如果不配置pasv_enable=NO,默认是被动模式。
1 2 3 4 5 6 7 8 9 10 11 | ###编辑/etc/vsftpd/vsftpd.conf #主动模式(active) pasv_enable=NO #passive模式关闭 port_enable=YES #active模式开启 connect_from_port_20=YES #即默认情况下,FTP PORT主动模式进行数据传输时使用20端口(ftp-data) #被动模式(passive) pasv_enable=YES pasv_min_port=3000 pasv_max_port=4000 #设定在PASV模式下,建立数据传输所可以使用port范围的下界和上界 |
3、FTP的协议实现
- FTP协议是C/S架构。
1、服务端应用
- Windows:Serv-U、IIS、FileZilla等。
- 开源:WU-ftpd、ProFTPD、Pure-FTPd、vsftpd等。
2、客户端应用
- Windows:ftp、FileZilla、CuteFTP、FlashFXP等。
- 开源:lftp、ftp、Filezilla、gftp等。
2、安装并启动vsftpd
- vsftpd(Very Secure FTP daemon)是一个非常安全的FTP守护进程。它完全是从头开始写的。
1、部署环境
- 软件版本
- vsftpd-3.0.2-29.el7_9.x86_64
- 系统环境
- FTP服务端:192.168.248.130,CentOS Linux release 7.7.1908 (Core)
- FTP客户端:192.168.248.131,CentOS Linux release 7.7.1908 (Core)
- FTP客户端:192.168.248.1,windows10
2、FTP服务端
1、安装vsftpd(必须)
1 | ] # yum install vsftpd |
2、停止防火墙和SELinux(必须)
1 2 3 4 5 | ] # systemctl stop firewalld.service #停止防火墙 ] # systemctl disable firewalld.service #禁止防火墙开机自启 ] # setenforce 0 #禁用selinux,临时有效 ] # vim /etc/selinux/config #SELINUX=disabled,重启机器后生效。禁止selinux,永久生效 |
3、创建用户和配置目录
1 2 3 4 5 6 7 8 9 10 11 12 13 | ] # useradd ftpuser ] # echo "root"| passwd --stdin ftpuser ] # mkdir /home/ftpuser/{write,read} ] # chown ftpuser.ftpuser -R /home/ftpuser/ #修改目录的属主属组 ] # chmod -w /home/ftpuser/ ] # chmod -w /home/ftpuser/read/ ] # ll -d /home/ftpuser/ dr-x------. 5 ftpuser ftpuser 103 8月 27 12:48 /home/ftpuser/ ] # ll /home/ftpuser/ dr-xr-xr-x. 2 ftpuser ftpuser 6 8月 27 12:48 read #只读 drwxr-xr-x. 2 ftpuser ftpuser 6 8月 27 12:48 write #可读可写 |
4、配置vsftpd
- 此配置只有ftpuser用户可以登录FTP,且将其禁锢在其家目录中。匿名用户也被禁用了。
- 默认配置是所有普通用户都可以登录FTP,且不将其禁锢在其家目录。匿名用户也可以登录FTP。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ] # vim /etc/vsftpd/vsftpd.conf #全局写权限 write_enable=YES #禁用匿名用户,默认不禁用 anonymous_enable=NO #设置可以登录FTP的白名单,/etc/vsftpd/user_list。默认所有的普通用户都可以登录 userlist_enable=YES userlist_deny=NO #禁锢/etc/vsftpd/chroot_list中的用户在其家目录中。默认所有可登录用户都不禁锢在其家目录 chroot_list_enable=YES chroot_list_file= /etc/vsftpd/chroot_list ] # vim /etc/vsftpd/user_list #可以登录FTP的白名单,只有在这个文件中的用户可以登录FTP ftpuser ] # vim /etc/vsftpd/chroot_list #禁锢其中的用户在其加目录中 ftpuser |
5、启动vsftpd服务(必须)
- 有两种启动方式
- 独立守护进程(standalone):由服务进程自行监听套按字,并接收用户访问请求。
- 瞬时守护进程(transient):由受托管方代为监听套按字,服务进程没有访问请求时不启动,当托管方收到访问请求时,才启动服务进程。
- Centos6:xinetd独立守护进程, /etc/xinetd.d/。
- Centos7:由systemd代为监听。
1 2 3 | ] # rpm -ql vsftpd /usr/lib/systemd/system/vsftpd .service #独立守护进程 /usr/lib/systemd/system/vsftpd .target #瞬时守护进程 |
- 启动服务
1 2 3 | ] # systemctl start vsftpd.service #启动vsftpd服务 ] # systemctl enable vsftpd.service #开机自启 |
6、禁止FTP用户登录系统
1 2 3 4 5 6 7 8 | ] # which nologin /usr/sbin/nologin ] # vim /etc/shells #将/usr/sbin/nologin添加到最后 ] # usermod -s /usr/sbin/nologin FTP_user ] # su – FTP_user #测试登录FTP_user |
3、FTP客户端
- Windows:ftp、FileZilla、CuteFTP、FlashFXP等。
- 开源:lftp、ftp、Filezilla、gftp等。
示例:linux客户端
1 2 3 4 5 6 7 8 9 | ] # yum install ftp ] # ftp 192.168.248.130 Name (192.168.248.130:root): ftpuser Password: 230 Login successful. ftp > ls dr-xr-xr-x 2 1001 1001 6 Aug 27 04:48 read drwxr-xr-x 2 1001 1001 29 Aug 27 04:58 write |
3、vsftpd配置文件
1、vsftpd配置文件
- vsftpd配置文件的路径:/etc/vsftpd/
- /etc/vsftpd/vsftpd.conf:vsftpd的主配置文件
- /etc/vsftpd/ftpusers:禁止文件中的用户登录FTP。默认使用
- /etc/vsftpd/user_list:黑/白名单,禁止或只允许文件中的用户登录FTP。默认是黑名单
- /etc/vsftpd/chroot_list:禁锢文件中的用户在其家目录中。默认不使用,需要显示配置
- /etc/vsftpd/user_list和/etc/vsftpd/ftpusers共同作用,只有两个文件都允许登录时才能登录。
2、vsftpd主配置文件选项
- vsftpd主配置文件的路径:/etc/vsftpd/vsftpd.conf
- 主配置文件的说明:man vsftpd.conf
- 配置选项:directive value #注意:directive之前不能有多余字符。
- 配置项的默认值,是该配置项被注释或没有时生效的值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | write_enable=YES #是否拥有全局的写权限,默认yes。 #当write_enable=NO时,所有用户有且只有下载权限 ###匿名用户 anonymous_enable=YES #是否启用匿名用户,默认yes。 #禁用匿名用户,必须显示定义anonymous_enable=NO #anon_world_readable_only=YES #是否可以下载,默认yes #anon_upload_enable=YES #是否可以上传文件,默认no。当SELinux=enforcing检查SE bool allow_ftpd_anon_write, allow_ftpd_full_access #anon_mkdir_write_enable=YES #是否可以创建目录,默认no #anon_other_write_enable=YES #是否可以删除文件、目录和修改权限,默认no #anon_umask=077 #设定匿名用户上传文件的umask,默认为077 ###本地用户 local_enable=YES #是否启用本地用户,默认yes。当SELinux=enforcing检查 SE bool ftp_home_dir local_umask=022 #设定本地用户上传文件的umask,默认为077 ###禁锢用户在其家目录中 #chroot_local_user=YES #是否禁锢所有本地用户在其家目录中,默认no。禁锢需要事先去除用户对家目录的写权限。 #chroot_list_enable=YES #是否禁锢chroot_list_file指定的列表文件中的用户在其家目录中,默认no。禁锢需要事先去除用户对家目录的写权限。 #chroot_list_file=/etc/vsftpd/chroot_list ###控制可登录vsftpd服务的用户列表 userlist_enable=YES #启用/etc/vsftpd/user_list文件来控制可登录用户 #userlist_deny=YES #默认yes。YES是黑名单,NO是白名单。 #名单是/etc/vsftpd/user_list。和下面文件共同作用 #/etc/vsftpd/ftpusers列在此文件中的用户都被禁止使用ftp服务。(#cat /etc/pam.d/vsftpd) ###传输日志 xferlog_enable=YES #激活上传/下载日志。 xferlog_std_format=YES #使用标准的ftpd xferlog格式保存日志文件。 #xferlog_file=/var/log/xferlog #日志文件的位置。默认值/var/log/xferlog ###监听套接字 listen=NO #vsftpd以独立模式运行并监听IPv4套接字。不能与listen_ipv6指令同时使用。 listen_ipv6=YES #允许监听IPv6套接字。默认情况下,监听IPv6的“any”地址(::)将接受来自IPv6和IPv4客户端的连接。 ###并发连接数限制 #max_clients=2000 #限制并发的客户端个数 #max_per_ip=50 #限制每个客户机IP的并发连接数 ###上传下载速率 #anon_max_rate=0 #匿名最大速度(字节/秒) #local_max_rate=0 #本地用户最大速率(字节/秒) ###超时时间 #idle_session_timeout=600 #空闲会话超时的默认值。 #data_connection_timeout=120 #数据连接超时的默认值。 #如果您愿意,您可以安排将上传的匿名文件由不同的用户拥有。注意!不推荐使用“root”上传文件! #chown_uploads=YES #chown_username=whoever ###安全 pam_service_name=vsftpd #登录FTP服务器的时候进行认证是根据/etc/pam.d/vsftpd文件定义的内容进行 tcp_wrappers=YES #对有状态连接的特定服务进行安全检测并实现访问控制 #nopriv_user=ftpsecure #建议您在系统上定义一个唯一的用户,ftp服务器可以将其作为完全隔离的非特权用户使用。 #ls_recurse_enable=YES #激活内置ls的“-R”选项。这在默认情况下是禁用的 dirmessage_enable=YES #激活目录消息-当远程用户进入某个目录时,发送给他们的消息。 connect_from_port_20=YES #确保端口传输连接来自端口20 (ftp-data)。 #ftpd_banner=Welcome to blah FTP service. #自定义登录横幅字符串 |
4、vsftpd认证和虚拟用户
1、vsftpd认证
- vsftpd将认证功能托管给PAM模块。
- PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。
1 2 3 4 5 6 7 8 9 | ~] # ldd /usr/sbin/vsftpd #用于打印程序或者共享库文件所依赖的共享库列表。 .... libpam.so.0 => /lib64/libpam .so.0 (0x00007f8514c23000) #可以看的出vsftpd调用pam进行认证 ... ] # cat /etc/pam.d/vsftpd ] # cat /etc/pam.d/password-auth pam_unix.so模块通过读取 /etc/passwd 和shadow进行认证,默认情况所有操作系统的普通用户都可以登录FTP。 |
- FTP协议是明文的,即使用明文传输数据,因此FTP协议是不安全。可以在FTP数据经过的结点获取其账号和密码,所以不能使用任何系统用户去登陆FTP。
2、vsftpd的虚拟用户
- ftp有三种用户:匿名用户、系统用户、虚拟用户。
- 在三种用户模式中,虚拟用户是最安全的。
- 虚拟用户:非系统用户,用户账号是不能登录操作系统的用户账号(认证不使用/etc/passwd)。
- 虚拟用户可以将用户账号存储于MySQL、Redis、文件等。
- vsftpd服务在认证的时候调用PAM模块,由PAM模块去查看存储的账号信息进行账号认证操作。
1、安装mariadb-server
1 | ] # yum install mariadb-server |
2、安装 pam-mysql模块
- centos6自带有PAM模块,不需要安装
- centos7没有PAM模块,需要安装
1 2 3 4 5 6 7 | ] # yum install mariadb-devel pam-devel #安装编译软件的开发环境 ] # yum groupinstall "Development Tools" "Server Platform Development" #安装开发环境 ] # tar zvfx pam_mysql-0.7RC1.tar.gz ] # cd pam_mysql-0.7RC1/ ] # ./configure --with-pam=/usr --with-mysal=/usr --with-pam-mods-dir=/usr/lib64/security ] # make && make instal ] # ls /usr/lib64/security | grep mysql #生成pam_mysql.so模块 |
3、ftp使用虚拟用户做认证的步骤
- 将虚拟用户映射成来宾用户(虚拟用户映射到的本地(系统)用户,即来宾用户就是本地用户)
- 在vsftpd配置文件中启用来宾用户,并指明PAM认证文件
4、创建虚拟用户
- 启动mysql
1 2 3 4 | ] # vim /etc/my.cnf skip-name-resolve=ON innodb_file_per_table=ON ] # systemctl start mariadb.service |
- 创建虚拟用户
1 2 3 4 5 | grant all on vsftpd.* to 'vsftpd' @ '127.0.0.1' identified by 'vsftpd' ; #创建数据库账号 create database vsftpd; #创建数据库 use vsftpd; create table user (id int primary key auto_increment, name char (25) not null , passwd varchar (100) not null ); insert into user ( name ,passwd) values ( 'tom' , password ( 'tom' )),( 'jerry' , password ( 'jerry' )); #创建两个虚拟用户,tom和jerry |
5、配置来宾用户,并指明PAM认证文件
- 编辑/etc/vsftpd/vsftpd.conf
1 2 3 | pam_service_name=vsftpd.vusers #修改指令。指定PAM认证文件 guest_enable=YES #添加指令。启用来宾用户 guest_username=vuser #添加指令。来宾用户(虚拟用户映射到的本地用户) |
- 编辑PAM认证文件/etc/pam.d/vsftpd.vusers
1 2 | auth required /usr/lib64/security/pam_mysql .so user=vsftpd passwd =vsftpd host=127.0.0.1 db=vsftpd table=user usercolumn=name passwdcolumn= passwd crypt =2 account required /usr/lib64/security/pam_mysql .so user=vsftpd passwd =vsftpd host=127.0.0.1 db=vsftpd table=user usercolumn=name passwdcolumn= passwd crypt =2 |
- 创建来宾用户
1 2 3 4 5 | ] # mkdir -p /ftp/vuser/pub ] # useradd -d /ftp/vuser vuser ] # chown vuser.vuser -R /ftp/vuser/ ] # chmod -w /ftp/vuser/ #虚拟用户也会禁锢在其家目录中,因此他不能对他的家目录有写权限 |
6、测试虚拟用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #使用虚拟用户tom登录FTP D:\ ftp > ftp 192.168.248.130 用户(192.168.248.130:(none)): tom 密码: 230 Login successful. ftp > pwd 257 "/" #使用虚拟用户jerry登录FTP D:\ ftp > ftp 192.168.248.130 用户(192.168.248.130:(none)): jerry 密码: 230 Login successful. ftp > pwd 257 "/" |
7、设置虚拟用户的权限
- 虚拟用户默认只有下载权限。
- 虚拟用户权限设置的指令和匿名用户的一样。
- 编辑配置文件/etc/vsftpd/vsftpd.conf
- 在/etc/vsftod/vusers_config/目录下创建与虚拟用户同名的文件,文件内容就是虚拟用户的权限。
1 | user_config_dir= /etc/vsftpd/vuser_config/ #添加指令。 |
示例:
- 匿名用户tom拥有上传、创建目录的权限,且umask是022;
- 匿名用户jerry拥有上传、删除的权限,且umask是默认值077。
1 2 3 4 5 6 7 8 9 10 11 12 | ] # mkdir /etc/vsftpd/vuser_config/ ] # vim /etc/vsftpd/vuser_config/tom anon_upload_enable=YES anon_mkdir_write_enable=YES anon_umask=022 ] # vim /etc/vsftpd/vuser_config/jerry anon_upload_enable=YES anon_other_write_enable=YES ] # systemctl restart vsftpd.service |
5、FTP的三种用户
1、匿名用户
- 匿名用户其实也是本地用户:ftp
- 匿名用户的家目录是/var/ftp,即匿名用户访问的是/var/ftp
- 匿名用户默认被禁锢在其家目录中,因此其家目录不能有写权限。
- 匿名登录FTP的时候,用户可以是ftp,也可以是anonymous,没有密码。
2、本地用户
- 本地用户访问的是其在ftp服务器上的家目录
- 本地用户默认没有被禁锢在其家目录中,需要显示设置。
- 禁止本地用户访问FTP服务。因为FTP协议是明文,不安全。
3、虚拟用户
- 虚拟用户访问的是其在ftp服务器上映射的本地用户的家目录。
- 虚拟用户不使用/etc/shadow存储用户信息,而是使用其他方式,例如mysql。
- 虚拟用户最终也需要映射到一个本地用户上(即来宾用户)。所有的虚拟用户都映射到了同一个本地用户上,因此拥有同一个家目录。
- 虚拟用户是FTP服务用户(用来访问FTP服务的),其用户信息没有存储在shadow中;来宾用户是本地用户,其用户信息存储在shadow中。
- 虚拟用户默认被禁锢在其家目录中,因此其家目录不能有写权限。
6、登录FTP
- 本地用户和虚拟用户的认证方式不同,因此他们一般不会同时存在。
- FTP用户的权限受制于FTP服务的共享权限和文件系统的本地权限,因此FTP用户的真正权限是二者的交集。
1、使用url登录FTP
- 基本格式如下:
1 | ftp://username:password@HOST:PORT/PATH/ |
示例:
1 2 3 4 5 6 | #登录匿名用户 ftp://192.168.248.130:21/ #登录虚拟用户 ftp://tom@192.168.248.130:21/ ftp://jerry@192.168.248.130:21/ |
2、使用FTP客户端登录FTP
1、windows使用FTP客户端(cmd)
- 登录FTP时的命令选项
1 2 3 4 5 6 7 8 9 10 11 12 | FTP [- v ] [-d] [-i] [-n] [-g] [-s:filename] [-a] [-A] [-w:windowsize] [host] - v :禁止显示远程服务器响应。 -n:禁止在初始连接时自动登录。 -i:关闭多文件传输过程中的交互式提示。 -d:启用调试。显示客户机和服务器之间传递的全部 ftp 命令 -g:禁用文件名通配(请参阅GLOB命令)。 -s:filename:指定包含FTP命令的文本文件;命令在FTP启动后自动运行。 -a:在绑字数据连接时使用所有本地接口。 -A:匿名登录。 -w:windowsize:覆盖默认的传输缓冲区大小65535。 host:指定主机名称或要连接到的远程主机的IP地址。 |
- ftp内置命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ls #查看远程文件 dir #查看远程文件,相当于ls -l ! dir #查看本地文件 pwd #查看远程所在的目录 cd #切换远程目录 lcd #切换本地目录 put #上传一个文件 mput #上传多个文件 get #下载一个文件 mget #下载多个文件 |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 | #匿名登录 D:\ ftp > ftp -A - v 192.168.248.130 对 root@DESKTOP-JL0L7FT 匿名登录成功 ftp > pwd 257 "/" #虚拟用户登录 D:\ ftp > ftp - v 192.168.248.130 用户(192.168.248.130:(none)): tom 密码: ftp > pwd 257 "/" |
2、linux使用FTP客户端
- 登录FTP时的命令选项
1 | ftp [-Apinegvtd] [ hostname ] |
示例:
1 2 3 4 5 6 7 8 9 10 11 | ] # ftp 192.168.248.130 Name (192.168.248.130:root): tom #虚拟用户登录 Password: #输入密码 ] # ftp 192.168.248.130 Name (192.168.248.130:root): ftp #匿名用户登录 Password: #没有密码,直接回车 ] # ftp 192.168.248.130 Name (192.168.248.130:root): anonymous #匿名用户登录 Password: #没有密码,直接回车 |
2、Linux使用lftp客户端
1 2 3 4 5 6 | #虚拟用户登录 lftp -u tom 192.168.248.130 #匿名用户登录 lftp -u ftp 192.168.248.130 lftp -u anonymous 192.168.248.130 |
vsftpd配置示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | write_enable=YES anonymous_enable=NO anon_other_write_enable=YES anon_umask=022 local_enable=YES local_umask=000 chroot_list_enable=YES chroot_list_file= /etc/vsftpd/chroot_list #所有的用户 xferlog_enable=YES xferlog_std_format=YES xferlog_file= /var/log/xferlog max_per_ip=800 max_clients=1500 listen=YES connect_from_port_20=YES idle_session_timeout=300 data_connection_timeout=300 dirmessage_enable=YES pam_service_name=vsftpd ftp_username=nobody use_localtime=YES allow_writeable_chroot=YES pasv_promiscuous=YES |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!