本文总结了如何在Linux系统上搭建FTP服务器,以及使用Windows系统和LInux系统作为客户端进行匿名用户连接和本地用户连接的过程;内容包括FTP概述、FTP的配置文件和常见配置方式、FTP服务器连接实验、常见报错原因和解决方法以及常用FTP命令和FTP应答码分析。发布于此供大家交流学习!如果对您有用不妨点个赞!

如有侵权,请联系删除!

目录

FTP服务器搭建

1、FTP概述

(1)FTP基本介绍

(2)FTP工作原理

①FTP的双通道机制

Ⅰ、FTP控制连接

Ⅱ、FTP数据连接

②FTP的两种数据传输模式

Ⅰ、主动传输模式(PORT)

Ⅱ、被动传输模式(PASV)

2、FTP配置文件

(1)FTP相关文件与目录

(2)FTP主配置文件介绍

①主配置文件 vsftpd.conf 内容

③FTP用户权限(根目录访问权限制)

(3)FTP常见配置

①FTP用户类别

②常见配置

Ⅰ、默认配置

Ⅰ、匿名用户常用配置

Ⅱ、本地用户常用配置

Ⅲ、虚拟用户

3、FTP服务器实验

(1)在Linux服务端搭建FTP服务器

①安装 vsftpd 安装包

②修改主配置文件vsftpd.conf

③关闭防火墙

④创建用户与用户组(用于本地用户登录)

⑤创建测试文件

(2)在Windows客户端连接FTP服务器

①匿名用户连接(图形化界面)

Ⅰ、文件系统连接

Ⅱ、FileZilla连接

②本地用户连接

FileZilla连接

(3)在Linux客户端连接FTP服务器

①匿名用户连接

②本地用户连接

(4)常见无法连接或无法上传文件原因

①无法连接:检查防火墙

Ⅰ、图形化界面

Ⅱ、命令行

②无法上传文件:权限不足

③无法上传文件:SELinux阻止

Ⅰ、什么是SELinux?

Ⅱ、为什么 SELinux 默认阻止 FTP 写入?

Ⅲ、如何防止SELinux阻止ftp文件上传

4、FTP命令与报错分析

(1)常用FTP命令

①登录FTP服务器

②查看、访问文件目录

Ⅰ、显示文件列表

Ⅱ、访问目录

Ⅲ、查看当前目录

Ⅳ、切换本地工作目录

③下载文件

Ⅰ、下载单个文件

Ⅱ、下载多个文件

Ⅲ、文件传输方式

④上传文件

⑤结束并退出FTP

(2)FTP错误应答分析


FTP服务器搭建

1、FTP概述

前面我们提到过如何在Linux系统上进行文件的上传与下载,但当时的实验仅在作为主机的Windows系统上和在虚拟机上搭建的CentOS7.9系统上进行,在两个系统上均有全部的权限,因此通过FinalShell或者lrzsz命令能够较为轻松地实现文件的上传与下载。

  • 那么如果在实际工作中,我们想要实现一台主机远程从另一台主机上下载文件,应该怎么做呢?

    • 这就需要搭建FTP服务器了,通过FTP协议可以解决不同计算机系统之间的文件传输。

  • 那么如果在实际工作中,我们想要实现在多台主机之间共享文件存储,应该怎么做呢?

    • 这就需要搭建NFS服务器了,通过NFS可以将多台主机的存储空间共享。

本文主要讲述如何在Linux的CentOS79系统上搭建FTP服务器,并通过Windows系统进行连接下载

(1)FTP基本介绍

  • FTP,全称File Transfer Protocol,即文件传输协议。FTP是一种在网络中进行文件传输的广泛使用的标准协议,也是典型的C/S架构的应用层协议,需要由服务端软件、客户端软件两个部分共同实现文件传输功能。

C/S架构:全称Client/Server,即客户端服务器架构。

  • FTP的存在大幅简化了文件传输的复杂性,它不仅能够摆脱计算机和操作系统类型的限制,使文件通过网络从一台主机传送到另一个主机;还提供交互式的访问,允许客户端指明文件的类型与格式,并能够设置客户端对服务的文件的存取权限。FTP 已经是因特网上使用得最广泛的文件传送协议之一。

  • FTP常用于在计算机之间批量传输文件、在公司内部网路中共享大文件,或是网站设计者将构成网站内容的大量文件批量上传到他们的Web服务器。

(2)FTP工作原理

关于FTP工作原理有两个关键知识点:

  • FTP采用双通道机制:FTP会建立两个TCP连接,一个用于发送命令,一个用于传输数据;

  • FTP有两种传输模式:主动传输模式和被动传输模式。

①FTP的双通道机制
Ⅰ、FTP控制连接
  • 客户端用大于1024的随机高端口(端口号N)与FTP服务器建的TCP 21端口建立一个TCP连接,这个连接专门用于发送控制指令,如发送用户名密码进行登陆,进行上传、下载操作等指令。这个连接称为FTP的控制连接

Ⅱ、FTP数据连接
  • FTP传输数据和FTP发送控制命令不使用同一个TCP会话。当FTP控制连接建立好之后,再准备传输文件,这时会专门建立一个用于传输数据的TCP连接,称为FTP的数据连接

②FTP的两种数据传输模式
Ⅰ、主动传输模式(PORT)
  • 在控制连接建立好后,客户端向FTP服务器通告自己将用于建立数据连接的随机高端口(一般是控制连接的端口号N+1),FTP服务器主动使用20端口与客户端通告的随机高端口(N+1)建立数据连接,称为主动模式。

所谓“主动”,是针对服务器而言的。

Ⅱ、被动传输模式(PASV)
  • 客户端和FTP服务器通过控制连接进行协商,让FTP服务器打开一个指定的高端口等待客户端(一般控制连接的端口N+1)来对其进行连接。这种服务器被动等待客户端来建立数据连接的模式就被称为被动模式。

所谓“被动”,也是针对服务器而言的。

【注】在使用FTP软件进行数据传输时,可以选用ASII模式和二进制模式,它的关系一般是:

  • ASCII模式:将8位字节转换为10位ASCII字符(多用于传输文本)

  • 二进制模式:原封不动传输原始字节流(多用于图片/视频等二进制文件的传输)

2、FTP配置文件

(1)FTP相关文件与目录

在CentOS7.9系统中安装vsftpd后,会出现以下相关配置文件:

文件路径文件名作用
/etc/vsftpd/vsftpd.confFTP服务器的主配置文件控制全局行为(如匿名访问、用户限制、日志等)
/etc/vsftpd/ftpusersFTP用户黑名单列在此文件中的用户禁止登录FTP(优先级最高)
/etc/vsftpd/user_listFTP用户名单根据vsftpd.conf中的userlist_deny参数决定是黑名单还是白名单
/etc/pam.d/vsftpdPAM认证配置定义用户登录时的认证方式(如密码策略、模块限制)

PAM(Pluggable Authentication Modules)即可插拔式认证模块,它是一种高效而且灵活的用户级别的认证方式,它也是当前Linux服务器普遍使用的认证方式。PAM可以根据用户的网段、时间、用户名、密码等实现认证。

还有以下目录:

目录路径作用
/var/ftp该文件夹是vsftpd提供服务的文件集散地,包括一个pub子目录。在默认配置下,所有的目录都只是只读的。

(2)FTP主配置文件介绍

①主配置文件 vsftpd.conf 内容
  • 对FTP的主配置文件vsftpd.conf,使用以下命令可以将实际有效的选项筛选出来:

cat /etc/vsftpd/vsftpd.conf | grep "# "

  • 筛选后的结果加上注释如下:

    • 注释的配置默认为NO

# ========== 1. 登录和对匿名用户的设置 ==========
12 anonymous_enable=YES          # 允许匿名登录(用户名为ftp或anonymous,默认密码为空)
16 local_enable=YES              # 允许本地系统用户(/etc/passwd中的用户)登录FTP
19 write_enable=YES              # 允许文件写入(上传/删除/重命名),需配合目录权限
23 local_umask=022               # 本地用户上传文件的默认权限掩码(文件:644,目录:755)
29 #anon_upload_enable=YES       # 【需取消注释】允许匿名用户上传文件(需确保匿名目录可写)
33 #anon_mkdir_write_enable=YES  # 【需取消注释】允许匿名用户创建目录
​
# ========== 2. 设置欢迎信息 ==========
37 dirmessage_enable=YES         # 用户进入目录时显示该目录下的.message文件内容
#ftpd_banner=Welcome to FTP   # 【需取消注释】自定义登录欢迎语(修改内容)
​
# ========== 3. 设置用户登录后所在的目录 ==========
#local_root=/var/ftp          # 【需取消注释】强制本地用户登录后锁定到指定目录
#anon_root=/var/ftp/pub       # 【需取消注释】设置匿名用户的根目录(默认/var/ftp)
​
# ========== 4. 控制用户是否允许切换到上级目录 ==========
# 配合 write_enable=YES
101 #chroot_local_user=YES        # 【需取消注释】锁定所有本地用户到其家目录
102 #chroot_list_enable=YES       # 启用例外用户列表(需配合chroot_local_user)
104 #chroot_list_file=/etc/vsftpd/chroot_list  # 【需取消注释】指定例外用户列表文件路径
​
# ========== 5. 设置访问控制 ==========
userlist_enable=YES           # 启用用户列表控制(默认拒绝/etc/vsftpd/user_list中的用户)
#userlist_deny=NO              # 只有vsftpd.user_list文件中的用户,才能访问FTP服务器
91 #deny_email_enable=YES        # 【需取消注释】禁止匿名用户使用特定邮箱登录
93 #banned_email_file=/etc/vsftpd/banned_emails  # 【需取消注释】被禁邮箱列表文件路径
pam_service_name=vsftpd       # 指定PAM认证配置文件(默认/etc/pam.d/vsftpd)
tcp_wrappers=YES              # 启用TCP Wrappers(通过/etc/hosts.{allow,deny}控制访问)
​
# ========== 6. 设置访问速度 ==========
#local_max_rate=102400        # 【需取消注释】本地用户最大传输速率(字节/秒)
#anon_max_rate=51200          # 【需取消注释】匿名用户最大传输速率
​
# ========== 7. 定义用户配置文件 ==========
#user_config_dir=/etc/vsftpd/user_conf  # 【需取消注释】为用户单独配置参数
​
# ========== 8. 与连接相关的设置 ==========
60 #idle_session_timeout=600     # 【需取消注释】会话超时时间(秒,无操作自动断开)
63 #data_connection_timeout=120  # 【需取消注释】数据传输连接超时时间(秒)
67 #nopriv_user=ftpsecure        # 【需取消注释】指定vsftpd以低权限用户运行(增强安全性)
​
# ========== 9. FTP工作方式与端口设置 ==========
115 listen=NO                    # 不以独立模式运行(由xinetd或systemd托管)
124 listen_ipv6=YES              # 启用IPv6监听(需系统支持IPv6)
43 connect_from_port_20=YES     # 主动模式使用20端口传输数据(传统FTP模式)
#pasv_min_port=30000         # 【需取消注释】被动模式最小端口(需与防火墙配合)
#pasv_max_port=31000         # 【需取消注释】被动模式最大端口
​
# ========== 10. 设置传输模式 ==========
40 xferlog_enable=YES           # 记录传输日志(默认/var/log/xferlog)
57 xferlog_std_format=YES       # 使用标准wu-ftpd日志格式(兼容性更好)
53 #xferlog_file=/var/log/xferlog  # 【需取消注释】自定义日志路径
83 #ascii_upload_enable=YES     # 【需取消注释】允许ASCII模式上传(可能导致文件损坏)
84 #ascii_download_enable=YES   # 【需取消注释】允许ASCII模式下载(文本文件适用)
​
# ====== 其他关键安全选项(建议添加) ======
#ssl_enable=YES               # 【需取消注释】启用SSL/TLS加密(FTPS)
#allow_writeable_chroot=YES   # 【需取消注释】允许被chroot的用户写入家目录
​

【注】原配置文件中不知为何无userlist_deny=NO选项,此处为我自行添加,选定user_list为白名单,但注意不要取消注释!若取消注释后又没有在user_list文件中添加anonymousftp,则将无法使用匿名登录,并且添加用户后均要在user_list中填写对应用户的用户名才可连接ftp!!!

③FTP用户权限(根目录访问权限制)
  • 在默认配置下,用户可以使用命令cd ..切换到上级目录。

    • 比如,若用户登录后所在的目录为/var/ftp,则在ftp的命令行ftp>下,执行cd ..命令后,用户将切换到其上级目录/var;若继续执行该命令,则可进入Linux系统的根目录,从而可以对整个Linux的文件系统进行操作

  • 若设置了write_enable=YES,则用户还可对根目录下的文件进行改写操作,会给系统带来极大的安全隐患,因此,必须防止用户切换到Linux的根目录

基于上述内容,防止用户切换到根目录的相关的配置项如下:

  • chroot_list_enable=YES

    • 设置是否启用chroot_list_file配置项指定的用户列表文件。

    • 设置为YES则只有列在/etc/vsftpd/chroot_list文件中的的帐号才可以切换到上级目录,其他用户被锁定;默认NO,即不启用列表文件,仅列表中的用户被锁定

  • chroot_local_user=YES

    • 设置为YES时,则本地用户默认被锁定到其家目录,不能切换到上级目录;默认NO,即默认登录在家目录,但可以切换到上级目录。

      【注】设置local_root=/var/ftp后,用户默认登录在/var/ftp

  • chroot_list_file=/etc/vsftpd/chroot_list

    • 用于指定用户列表文件,该文件用于控制哪些用户可以切换到FTP站点根目录的上级目录。

具体情况有以下几种:

  • chroot_list_enable=YESchroot_local_user=YES时:在/etc/vsftpd/chroot_list文件中列出的用户,可以切换到上级目录;未在文件中列出的用户,不能切换到站点根目录的上级目录。

  • chroot_list_enable=YESchroot_local_user=NO时:在/etc/vsftpd/chroot_list文件中列出的用户,不能切换到站点根目录的上级目录;未在文件中列出的用户,可以切换到上级目录。

  • chroot_list_enable=NOchroot_local_user=YES时: 所有用户均不能切换到上级目录。

  • chroot_list_enable=NOchroot_local_user=NO时: 所有用户均可以切换到上级目录。

  • 当用户不允许切换到上级目录时,登录后FTP站点的根目录“/”是该FTP账户的主目录,即文件的系统的/var/ftp目录。

(3)FTP常见配置

①FTP用户类别

vsftpd允许用户以3种认证模式登录到FTP服务器上:

  • 匿名用户:任何人都可以直接登录服务器;

  • 本地用户:通过本地用户输入密码登录服务器;

  • 虚拟用户:本身不存在、是一个虚拟出来的用户、就算黑客破解的用户信息也无法登录服务器。

②常见配置
Ⅰ、默认配置
  • 匿名用户:

    • 允许登录,登录后默认进入文件夹/var/ftp中,无法进入FTP服务器端的其他目录

    • 允许下载文件,但无法上传文件、创建目录与删除或重命名文件

  • 本地用户:

    • 允许登录,登录后默认进入自己的家目录,如果想和匿名用户进入同一个文件夹,需要配置local_root=/var/ftp,同时可以切换到FTP服务器端的其他目录

    • 允许下载、上传、删除、重命名与新建文件,新建文件权限为644umask=022),目录权限为755。

umask:创建文件的默认访问权限为 -rw-rw-rw-(即666),创建目录的默认权限 drwxrwxrwx(即777),而 umask 值则表明了需要从默认权限中去掉哪些权限来成为最终的默认权限值。umask=022,即指在默认权限的基础下,所属用户权限不变;所属用户组权限减2;其他用户权限减2,最终文件权限为644

  • 虚拟用户:

    • 默认虚拟用户功能未激活,若想启用需要配置pam_service_name和数据库认证。

  • 由上述可知,若想配置匿名用户登录,默认的配置已经足够(仅上传);若想配置本地用户登录,登录位置与文件修改权限看需求进行配置,文件修改权限需要ftp配置与文件权限设置同时考虑

  • ftpusersuser_list文件默认均为黑名单,如果想要以root身份远程登录ftp,则需要在这两个文件中把root注释掉,不过由于root身份权限较大,因此不建议。

Ⅰ、匿名用户常用配置
  • 要求:允许匿名用户登录FTP服务器,并能够下载文件,但不可以上传和修改文件。

  • 默认配置即可。

Ⅱ、本地用户常用配置
  • 要求:禁止匿名用户登录,仅允许本地用户登录,并能够上传、下载文件,创建文件夹,但用户被锁定在/var/ftp目录下;

对应配置更改如下:

(配置前的数字为该配置在vsftpd.conf中的行号,可通过命令:set nu打开显示行号)

  • 禁止匿名用户登录:

12 anonymous_enable=YES  # 作用:配置是否允许匿名用户登录,更改为:anonymous_enable=NO
  • 配置本地用户默认登录位置:

17 local_root=/var/ftp   # 作用:配置客户端连接FTP服务端后的目录位置,主配置文件中默认无此项,需要自行添加,此处在第17行处添加。
  • 锁定用户到默认登录位置,禁止进入服务器端的根目录:

101 #chroot_local_user=YES  # 作用:配置本地用户是否被锁定在默认登录位置;更改为:取消注释
102 #chroot_list_enable=YES # 作用:配置仅在chroot_list_file指定文件中存在的用户,才可切换到ftp服务器端的上层目录,突破锁定;更改为:取消注释
104 #chroot_list_file=/etc/vsftpd/chroot_list   # 作用:选定列表文件;更改为:取消注释
  • 允许被chroot禁锢的用户写入文件

105 #allow_writeable_chroot=YES # 作用:允许被 chroot 禁锢的用户写入文件;原配置文件中没有该项,需要自行添加
  • 创建文件chroot_list

touch /etc/vsftpd/chroot_list
Ⅲ、虚拟用户

3、FTP服务器实验

(1)在Linux服务端搭建FTP服务器

①安装 vsftpd 安装包

Ⅰ、检查软件包

  • 进入root用户,使用命令rpm -q vsftpd检查是否已安装vsftpd软件包;

Ⅱ、安装软件包

  • 若未安装,则使用命令yum -y install vsftpd安装vsftpd软件包;

Ⅲ、拷贝主配置文件

  • 使用命令cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.default

②修改主配置文件vsftpd.conf

Ⅰ、根据需求修改主配置文件vsftpd.conf

Ⅱ、修改完成后使用以下命令启动ftp服务:

重启FTP服务:systemctl restart vsftpd

开启FTP自启动:systemctl enable vsftpd

【注】每次修改完主配置文件后均需要重启服务,不然可能无法执行修改后的配置。

③关闭防火墙

使用以下命令关闭防火墙:systemctl stop firewalld

④创建用户与用户组(用于本地用户登录)

Ⅰ、创建ftp测试用户组:group ftp_test

Ⅱ、创建ftp测试用户: useradd -g ftp_test -d /home/ftpuser1 ftpuser1 useradd -g ftp_test -d /home/ftpuser2 ftpuser2

Ⅲ、设置用户密码:passwd ftpuser1passwd ftpuser2

或如果想要实现一条命令完成密码设置,可以采用以下命令: echo "123456" | passed --studio ftpuser1echo "123456" | passed --studio ftpuser2

⑤创建测试文件
  • /var/ftp中创建文本文件test1_ftp.txt用于测试;

  • /var/ftp/pub中创建文本文件test2_ftp.txtan_linux_ftp1.txtan_window_ftp1.txtlocal_linux_ftp1.txtlocal_window_ftp1.txt用于匿名用户连接测试和本地用户连接测试。

(2)在Windows客户端连接FTP服务器

  • 在Windows系统中由许多方式可以连接FTP服务器,最简单的方式是直接在文件系统通过ftp://ip地址进行访问,也可以通过win + R在运行窗口输入cmdpowershell使用ftp ip地址进行连接。同时也有许多更加直观、多功能的软件可以辅助FTP连接,比如WinSCP和FileZilla,本文主要使用FileZilla在Windows系统上进行FTP连接

  • FileZilla是一款支持多协议、多语言、多标签的FTP客户端和服务端软件,具有图形化用户界面和站点管理等功能,下载时分为客户端和服务端,本文仅下载安装Windows的客户端FileZilla软件,下载地址如下:下载 - FileZilla中文网

①匿名用户连接(图形化界面)
  • 要求:允许匿名用户登录FTP服务器,并能够下载文件,但不可以上传和修改文件。

  • 主配置文件修改:无需修改,默认配置即可。

Ⅰ、文件系统连接
  • 打开文件系统,在地址栏输入ftp://192.168.205.XX(即FTP服务器的IP地址)直接回车进行连接;

  • 连接后仅能下载文件,无法上传文件或新建文件夹:

Ⅱ、FileZilla连接

  • 选择上传文件,上传失败,表示此时匿名登录无法上传文件:

②本地用户连接
  • 要求:禁止匿名登录,仅允许本地登录,本地用户能够上传、下载文件,创建文件夹,但用户1作为普通访问者被锁定在/var/ftp目录下,用户2作为管理员可以进入FTP服务端上层目录。

  • 按上面提到的本地用户常用配置进行配置,并将用户ftpuser2加入文件chroot_list中作为管理员。

FileZilla连接
  • 打开FileZilla,输入主机IP后直接点击“快速连接”,尝试匿名用户连接,连接失败;

  • 继续输入用户名ftpuser1和对应的密码,点击“快速连接”,连接后可以下载文件、上传文件、创建文件,但无法进入FTP服务器端上层目录;

  • 退出当前连接,输入用户名ftpuser2和对应的密码,点击“快速连接”,连接后可以下载文件、上传文件、创建文件,也能进入FTP服务器端上层目录。

(3)在Linux客户端连接FTP服务器

  • 如将Linux系统作为客户端连接FTP服务器,需要使用ftp相关命令,但Linux系统并未自带相关命令,故需要通过以下命令进行下载安装:yum -y install ftp,相关ftp命令在下一个部分里讲述。

  • 为了仅使用一台虚拟机完成实验,故此处用在本机上创建的用户进行ftp服务器连接。

①匿名用户连接
  • 提前登录ftpuser1用户,主配置文件默认;

Ⅰ、使用命令ftp 192.168.205.XX进行ftp服务器连接,用户名填写ftp或者anonymous可实现匿名登录,密码为空;

Ⅱ、进入pub文件夹,使用命令get an_linux_ftp1.txt下载提前准备好的an_linux_ftp1.txt文件;

Ⅲ、使用命令mkdir 1尝试创建文件,创建失败;

Ⅳ、使用命令quit退出ftp连接;

Ⅴ、进入家目录/home/ftpuser1,确定文件下载完成。

②本地用户连接
  • 要求:禁止匿名登录,仅允许本地登录,本地用户能够上传、下载文件,创建文件夹,但用户1作为普通访问者被锁定在/var/ftp目录下,用户2作为管理员可以进入FTP服务端上层目录。

  • 按上面提到的本地用户常用配置进行配置,并将用户ftpuser2加入文件chroot_list中作为管理员。

Ⅰ、使用命令ftp 192.168.205.XX进行ftp服务器连接,用户名填写ftp,密码为空,尝试匿名用户登录,登录失败;

Ⅱ、在ftp环境ftp>下使用命令close结束会话,再使用命令open 192.168.205.XX再次登录,用户名填写ftpuser1并填写对应密码,登录成功;尝试下载文件、上传文件,创建文件夹并访问上级目录;

Ⅲ、使用命令close结束会话,重新使用命令open 192.168.205.XX登录,用户名填写ftpuser2并填写对应密码,登录成功;尝试下载文件、上传文件,创建文件夹并访问上级目录。

(4)常见无法连接或无法上传文件原因

在尝试上述的实验中,本人多次遇到了使用本地用户连接FTP服务端可下载文件但无法上传文件的问题,此时会报以下错误码:

553 Could not create file.

后来解决了这个问题,便顺便在此对常见的问题做个总结

Linux网络——FTP服务_需要配置防火墙的入规则:允许访问ftp服务-20、21端口-CSDN博客

①无法连接:检查防火墙

在默认的防火墙下,FTP连接会被防火墙拦截,在前面的服务器搭建部分,我们提到使用以下命令直接关闭防火墙

systemctl stop firewalld

但实际上这个方法并不太安全,我们可以通过配置防火墙设置来使防火墙允许FTP连接通过,同样有两种方法:

Ⅰ、图形化界面


Ⅱ、命令行
systemctl start firewalld                           # 打开防火墙
firewall-cmd --permanent --add-service=ftp          # 允许ftp通过防火墙
systemctl restart firewalld                         # 重新开启防火墙(刷新)

【注】配置完都需要重启,重启需要十几秒,请不要配置完马上重新尝试FTP连接。

②无法上传文件:权限不足

以默认登录FTP服务器端的文件夹/var/ftp为例,其默认权限为:

drwxr-xr-x root root    # 即755,仅root用户具有写入权限
  • 但实际上我们通过FTP本地用户连接往往不是root用户(root用户在/etc/vsftpd/ftpusers文件中被列入FTP连接黑名单),而上传文件至/var/ftp文件夹、或在该文件夹内创建文件夹,需要写入权限,因此在上传或创建前需要使用以下命令增加权限:

chmod -R 777 /var/ftp
  • 或者也可以在权限为755的情况下将文件夹所属的用户转为ftp客户端连接的本地用户,即:

chown ftpuser1:ftp_test /var/ftp

③无法上传文件:SELinux阻止

在排除了权限的问题后如果还是无法上传文件,那很有可能是SELinux阻止了文件的上传。

Ⅰ、什么是SELinux?

SELinux,全称Security-Enhanced Linux,即安全强化Linux,是 Linux 内核的一个 强制访问控制(MAC, Mandatory Access Control) 安全模块,由美国国家安全局(NSA)设计并贡献给开源社区。它通过 精细化权限管理,限制进程和用户的访问范围,即使 root 用户也可能被拦截,从而提供更高的系统安全性。

SELinux 的简单原理

  • 标签机制(Labeling):

    所有系统资源(文件、目录、端口、进程等)都被标记为安全上下文(Security Context),例如:

    <BASH>
    drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html

    其中

    httpd_sys_content_t

    是 SELinux 类型,决定哪些进程可以访问该资源。

  • 策略规则(Policy): SELinux 根据预定义的策略规则,检查进程(如 vsftpd)是否被允许访问特定标签的资源(如 /var/ftp)。

SELinux 的模式状态

  • Enforcing(强制模式):默认状态,主动拦截违规操作并记录日志。

  • Permissive(宽容模式):仅记录违规操作,不阻止(用于调试)。

  • Disabled(禁用模式):完全关闭 SELinux(需重启生效,不推荐)。

查看当前状态:

<BASH>
getenforce  # 输出 Enforcing/Permissive
sestatus    # 查看详细信息

更详细的关于SELinux的介绍可参考以下链接: SELinux详解-CSDN博客

Ⅱ、为什么 SELinux 默认阻止 FTP 写入?
  • 最小权限原则:防止恶意用户通过 FTP 服务:

    • 上传恶意文件;

    • 篡改系统文件;

    • 利用符号链接(symlink)攻击其他目录。

Ⅲ、如何防止SELinux阻止ftp文件上传

临时测试:通过命令setenforce 0将SELinux临时配置为Permissive宽容模式。

【注】配置完都生效需要十几秒,请不要配置完马上重新尝试FTP连接。

永久解决:更改启用SELinux内部配置的和FTP相关的布尔值。

最终结论:采用命令setsebool -P ftpd_full_access on,分析如下:

  • 使用以下命令列出SELinux上所有与FTP相关的布尔值条款:

语法:getsebool [-a] [布尔值条款]
# -a:列出当前系统上所有布尔值条款的设置状态
getsebool -a | grep ftp

  • 与FTP服务相关的布尔值分析如下:

布尔值默认值作用
ftpd_anon_writeoff允许 匿名用户(anonymous) 上传文件到 FTP 服务器。
ftpd_connect_all_unreservedoff允许 FTP 服务绑定所有未保留的端口(>1024)。
ftpd_connect_dboff允许 FTP 服务连接数据库(如 MySQL/PostgreSQL)。
ftpd_full_accessoff允许 FTP 服务 完全访问系统(读写所有标记为 public_content_rw_t 的目录)。
ftpd_use_cifsoff允许 FTP 服务访问 CIFS/Samba 共享 的文件。
ftpd_use_fusefsoff允许 FTP 服务访问 FUSE 文件系统(如 SSHFS、NTFS-3G)。
ftpd_use_nfsoff允许 FTP 服务访问 NFS 共享 的文件。
ftpd_use_passive_modeoff允许 FTP 服务使用 被动模式(PASV)
  • 可以看到与FTP上传服务相关的有ftpd_anon_writeftpd_full_access,如果我们需要本地用户上传文件的话,采用以下命令启动对应的布尔值:

语法:setsebool [-P] boolean value
# -P:表示修改是持久的,即使重启系统也会保持设置。
setsebool -P ftpd_full_access on

这样设置后,本地用户连接FTP服务器端时即可正常上传文件。

4、FTP命令与报错分析

(1)常用FTP命令

①登录FTP服务器
  • 语法:ftp ip地址

  • 功能:登录对应IP地址的FTP服务器,后续还需要输入用户名与密码,若匿名登录用户名填写ftpanonymous,密码为空。

②查看、访问文件目录
Ⅰ、显示文件列表
  • 语法:ls或者dir

  • 功能:列出FTP服务器当前文件路径下的文件列表;

  • 区别:dir可以查看的信息更详细,且后面可以使用通配符*。比如,显示当前目录中所有扩展名为jpg的文件,可使用命令 dir * .jpg

Ⅱ、访问目录
  • 语法:cd

  • 功能:进入服务器指定的目录,后面必须带目录名。

Ⅲ、查看当前目录
  • 语法:pwd

  • 功能:查看当前FTP服务器上的工作目录。

Ⅳ、切换本地工作目录
  • 语法:lcd 目标目录

  • 功能:切换到本地计算机的目标目录,可用于变更从FTP服务器下载的文件位置。

③下载文件
Ⅰ、下载单个文件
  • 语法:get filename [newname]

  • 选项:filename为下载的服务器端文件名,newname为下载至客户端时使用的名字,如果不指定newname,文件将以原名下载;

  • 功能:下载FTP服务器端的文件至客户端的当前工作目录。

Ⅱ、下载多个文件
  • 语法:wget filename [filename ...]

  • 功能:下载FTP服务器端的多个文件至客户端的当前工作目录。

Ⅲ、文件传输方式
  • 语法:

    • type:查看当前的传输方式;

    • ascii:设定传输方式为ASCII码方式;

    • binary:设定传输方式为二进制方式。

  • 这三个命令均不带参数,目前二进制方式较为通用。

④上传文件
  • 语法:put filename [newname]或者send filename [newname]

  • 选项:filename为上传的本地文件名,newname为上传至FTP服务器上时使用的名字,如果不指定newname,文件将以原名上传;

  • 功能:将指定文件上传到FTP服务器的当前工作目录中;

  • 区别:send的上传速度比put更快。

⑤结束并退出FTP
  • 语法:closebye或者quit

  • 功能:

    • close:仅结束与服务器的FTP会话,还未退出FTP环境;

    • bye或者quit:结束与服务器的FTP会话并退出FTP环境。

(2)FTP错误应答分析

此处列出部分连接FTP服务器时常见的报错应答以及解决方法,更多报错信息可参考以下链接: FTP协议命令 + 返回值 + 返回值解析 - 邃蓝星空 - 博客园

FTP错误代码列表(ftp状态码、ftp错误码)_ftp 230-CSDN博客

应答码报错信息可能原因解决方法
Could not connect to server服务器地址错误、端口错误或网络连接问题确认服务器地址和端口号是否正确;检查网络连接是否正常
Connection timed out/Connection refused网络超时或防火墙阻止了连接确保客户端和服务器之间的网络连接正常;检查防火墙设置是否允许FTP流量
530Login incorrect用户名或密码错误确认用户名和密码是否正确
530Login authentication failed用户认证失败确认用户名和密码是否正确
550Permission denied没有权限访问请求的文件或目录确认当前用户对目标文件或目录有足够的权限;联系管理员获取权限
553Requested file action not taken文件操作未被执行确认文件路径和名称正确;检查磁盘空间是否充足
426Connection closed; transfer aborted网络问题导致传输中断检查网络连接;尝试重新传输文件
421Service not available, remote server has closed connection服务器资源不足或配置问题稍后再试;联系管理员检查服务器配置
450Requested file action not taken对被请求文件的操作未被执行稍后再试;检查文件是否在使用中;检查空间是否不足

应答的数字含义如下图:

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐