Linux部署FTP服务器

Linux部署FTP服务器

1. FTP简介

FTPFile Transfer Protocol 的缩写,即文件传输协议,它通过网络在服务器和客户端之间传输文件,现在已经成为一种广泛使用的标准工具。

vsftpdvery secure ftp daemon 的缩写,它是 Linux 上使用最受欢迎、使用最广泛的 FTP 服务器之一,它具有安全,速度快,稳定的特点,很多重要的 FTP 站点比如 ftp.gnu.org、ftp.freebsd.org 都是使用 vsftpd 作为服务器的。

当前,FTP服务在日常工作中使用得也挺多,每次服务器版本更新都需要先打包,然后上传到线上的FTP服务器上,再从FTP服务器上下载服务器包到线上机器,进行MD5校验,然后就可以更新线上服务器了。

1.1 工作模式

服务器使用两个端口和客户端通信,一个是命令端口,也叫控制端口,默认是 21, 用于命令的传输 ;一个是数据端口,默认是 20 ,用于数据的传输。

1.1.1 主动模式 port

客户端向FTP服务器发送端口信息,由服务器主动连接该端口。

流程:客户端和FTP服务器的命令端口(21)建立TCP连接,当需要传输数据时,客户端新启动一个用于数据传输的端口,并在命令端口的连接上用 PORT 命令告诉服务器该端口号,服务器与该端口建立TCP连接,连接成功之后,客户端开始传输数据。

1.1.2 被动模式 pasv

FTP服务器开启并发送端口信息给客户端,由客户端连接该端口,服务器被动接受连接。

流程:客户端和FTP服务器的命令端口(21)建立TCP连接,当需要传输数据时,服务器侦听一个用于数据传输的端口,并在命令端口的连接上用 PASV 命令告诉客户端该端口号,客户端与该端口建立TCP连接,连接成功之后,客户端开始传输数据。

1.1.3 对比
  1. 在主动模式下:客户端给服务器端的21端口发命令说,我要下载什么什么,并且还会说我已经打开了自己的20端口,你就从这里把东西给我吧,服务器收到后就会连接客户端已打开的20端口把东西传给客户端,这就是主动模式,可以理解为服务端主动给客户端传输文件。

  2. 在被动模式下:客户端给服务器端的21端口发命令说,我要下载什么什么,服务器端知道后,就打开一个空闲的高端口,然后告诉客户端,我已经打开了某某端口,你自己进去拿吧,于是客户端就从那个高端口进去拿文件了,这就是被动模式,可以理解为服务端被客户端拿走了东西。

1.2 用户认证模式

1.2.1 匿名用户认证模式(Anonymous Access)

原理:

  • 无需身份验证:用户通过通用账户(如 anonymousftp)登录,无需密码或使用任意邮箱地址作为密码。
  • 默认权限限制:通常只能访问指定目录(如 /var/ftp/),禁止上传或删除文件(需手动配置权限)。

优缺点:

  • 优点:适合公共资源下载(如软件镜像站)。
  • 缺点:安全性极低,易遭恶意攻击或滥用。

适用场景:

  • 公开文件分发(只读访问)。
  • 临时共享无需身份验证的资源。
1.2.2 本地用户认证模式(Local System User)

原理

  • 系统用户登录:用户使用服务器操作系统的真实账户(如 /etc/passwd 中的用户)登录FTP。
  • 权限继承:用户可访问其系统家目录,并拥有与系统账号相同的文件权限。

优缺点

  • 优点:管理简单,适合内部团队使用。
  • 缺点:
    • 系统用户可能拥有SSH等额外权限,扩大攻击面。
    • 密码明文传输(未加密时)易被窃听。

适用场景

  • 内部团队文件共享(需严格控制用户权限)。
  • 需要直接使用现有系统账号的场景。
1.2.3 虚拟用户模式(Virtual User)

原理

  • 独立用户数据库:虚拟用户不与系统用户关联,仅用于FTP服务。
  • 权限隔离:可自定义每个虚拟用户的访问目录和操作权限(读/写/删除)。

优缺点:

  • 优点:
    • 安全性高:虚拟用户无系统权限。
    • 灵活管理:可针对不同用户设置不同权限。
  • 缺点:配置复杂,需维护独立的用户数据库。

适用场景:

  • 企业级FTP服务(需细粒度权限控制)。
  • 对外提供用户专属空间(如客户文件上传)。
1.2.4 三种模式对比
模式安全性管理复杂度适用场景
匿名用户简单公开只读资源下载
本地用户中等内部团队共享(需权限控制)
虚拟用户复杂企业级多用户安全访问

1.3 建议

  1. 大多数FTP客户端都在局域网中,没有独立的公网IP地址,且有防火墙阻拦,主动模式下FTP服务器成功连接到客户端比较困难。因此,如无特殊需求,都是将FTP服务器配置为被动模式,本文后面的FTP服务器配置也是以被动模式为例的。

  2. 被动模式下,命令端口和数据端口都是在FTP服务器端开启,也都可以通过启动配置来修改,由于默认的端口是公开的,安全性低,所以实际安装的时候都会修改默认端口。

2. VSFTPD安装步骤

2.1 安装前

安装前可以使用如下命令检测是否安装:

vsftpd -v #如未安装会出现如下提示: -bash: vsftpd: 未找到命令...

2.2 更新系统包(可选但推荐)

sudo yum update

2.3 安装vsftpd

sudo yum install vsftpd -y

安装完成后,可使用如下命令检测,如果输出版本号,代表安装成功。

vsftpd -v

2.4 创建用户

  1. 添加用户。
adduser -d /home/ftpuser ftpuser -s /sbin/nologin
  1. 修改ftpuser用户密码。
echo "123456" | passwd --stbin ftpuser #123456:ftpuser用户的密码

或者

passwd ftpuser

在这里插入图片描述

  1. 新建FTP目录,并且修改权限。

注意:/home/ftpuser/ftp 是 ftpuser用户的锁定目录,ftpuser登录之后,只能呆在此目录以及此目录的子目录中,不允许切换到其他目录。

sudo mkdir -p /home/ftpuser/ftp
sudo chown ftpuser:ftpuser /home/ftpuser/ftp
sudo chmod 750 /home/ftpuser/ftp  # 禁止其他用户访问

2.5 配置服务器

vsftpd文件与目录:

/usr/sbin/vsftp: vsftp的主程序 
/etc/rc.d/init.d/vsftp: vsftp的启动脚本 
/etc/vsftpd/vsftpd.conf: vsftp的配置文件 
/etc/pamd/vsftpd: PAM认证文件 
/etc/vsftpd/ftpusers: 禁止使用FTP的用户
/var/ftp: ftp匿名主目录 
/varftp/pub: ftp匿名上传主目录

安装完成之后,默认的配置位于 /etc/vsftpd/vsftpd.conf

在这里插入图片描述

修改vsftpd.conf配置文件。

vim /etc/vsftpd/vsftpd.conf
#是否允许匿名登录,默认允许,如果允许,用户名 ftp 和 anonymous 都会被当做匿名登录
#为了安全,一般不允许匿名登录
anonymous_enable=NO

#是否允许匿名上传,默认不允许,如果允许 write_enable 选项需要设置为 YES
#为了安全,一般不允许
anon_upload_enable=NO

#是否允许本地用户登录,默认不允许,如果允许,在 ```/etc/passwd```中的用户都可以登录 FTP 服务器
#如果不予许匿名登录的话,这个选项需要设置为允许
local_enable=YES

#是否允许在FTP服务器上写入, 默认不允许,如果有上传文件、删除文件等需求,一般都是开启的/全局写入权限开启
write_enable=YES

#设置写入服务器文件的权限掩码值,如果值是八进制需要以 0 开头,否则会当作十进制
#值为 022,能满足大部分FTP的需求
local_umask=022

#默认为 NO, 如果设置为 YES,表示用户通过FTP客户端登录之后
#只能在FTP服务器指定的目录中,不允许切出目录,
chroot_local_user=YES

#允许用户具有主目录写权限,对vsftpd有用,否则,因home目录权限为root权限而无法登录
allow_writeable_chroot=YES

#定义用户 FTP 主目录,用户登录成功之后,vsftpd 服务器会切换到此目录,
#此时 FTP 客户端会位于此目录中,后续的上传以及下载都是针对这个目录的
local_root=/home/ftpuser/ftp

#如果设置为 YES ,vsftpd 将会从 userlist_file 选项指定的文件读取用户列表
userlist_enable=YES

#设置用户列表配置文件, 如果 /etc/vsftpd/user_list 不存在需要手工创建
userlist_file=/etc/vsftpd/user_list

#此选项检查 userlist_enable 选项,当 userlist_enable 为 YES 时
#如果 userlist_deny 设置为 NO , 表示只允许 userlist_file 中的用户登录
#如果 userlist_deny 设置为 YES, 表示禁止 userlist_file 中的用户登录,允许其他用户登录
userlist_deny=NO

#如果启用,vsftpd 将在独立模式下运行,vsftpd 本身将负责侦听和处理传入的连接
#设置vsftpd服务器是否以standalone模式运行。以standalone模式运行是一种较好的方式,此时listen必须设置为YES,此为默 认值。建议不要更改,有很多与服务器运行相关的配置命令,需要在此模式下才有效。若设置为NO,则vsftpd不是以独立的服务运行,要受到xinetd 服务的管控,功能上会受到限制。
# 是否监听ipv4 
listen=NO

# 跟 listen 选型类似,但是此选项是侦听在 IPV6 上的 socket
# 而 listen 是 IPV4, 此选项和 listen 是互斥的,不能同时设置为 YES
listen_ipv6=YES

#服务器侦听端口,也是命令端口, 默认是21,修改之后, 防火墙需要做相应的调整
#同时 FTP 客户端登录的时候需要指定端口号
#为了增强安全性,配置的时候一般都会修改
listen_port=48888

#开启被动模式/二选一
pasv_enable=YES
#被动模式下,服务器的地址,默认是内网地址
#如果在云服务器上部署,需要修改成公网IP
#pasv_address=192.168.186.100

#设置被动模式下,建立数据传输可使用的端口范围的最小值。
#建议把端口范围设置在一段比较高的范围内,例如50000~50010,有助于提高访问FTP服务器的安全性
pasv_min_port=50000
#设置被动模式下,建立数据传输可使用的端口范围的最大值
pasv_max_port=50010

#开启主动模式/二选一
port_enable=YES
#当主动模式开启的时候 是否启用默认的20端口监听
Connect_from_port_20=YES
#上一选项使用NO参数是 指定数据传输端口
#Ftp_date_port=%portnumber%

#是否记录上传下载日志,默认是不记录,如果设置为记录
#默认日志文件位于 /var/log/vsftpd.log, 如果配置了 vsftpd_log_file 选项,会覆盖默认日志文件
xferlog_enable=YES

#记录上传下载的日志
xferlog_file=/var/log/xferlog

#是否按照标准格式记录日志
xferlog_std_format=YES

# vsftpd 使用的 PAM 服务名字
pam_service_name=vsftpd
#
tcp_wrappers=YES

2.6 设置防火墙

如果你部署的FTP服务器的机器上防火墙是关闭状态的话,可以跳过此步骤,或者你不想设置防火墙的话,可以通过 systemctl stop firewalld命令关闭防火墙,这样也可以忽略此步骤。

上面配置中服务器侦听端口(也叫命令端口) listen_port 选项设置的是 48888,数据端口的范围是 50000-50010, 所以防火墙需要开放这些端口,执行以下命令即可设置。

firewall-cmd --add-port=48888/tcp --permanent
firewall-cmd --add-port=50000-50010/tcp --permanent
firewall-cmd --reload 
firewall-cmd --zone=public --list-ports #查看端口是否开放

在这里插入图片描述

2.6 启动服务器

执行以下命令启动vsftpd服务器:

systemctl start vsftpd
systemctl status vsftpd

在这里插入图片描述

查看vsftpd占用的端口:

netstat -tunlp | grep vsftpd
2.7 测试(登录、上传、下载)

注:在测试前,记得把ftpuser用户添加到user_list文件中。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3. 常见的错误

3.1 530 Login incorrect

该错误通常由 认证失败 导致,可能涉及配置错误、权限问题或用户设置不当。

  1. 检查登录用户的账号密码是否正确。
  2. 检查 /etc/vsftpd/user_list文件中是否添加登录用户。
  3. PAM认证配置错误。
  • 问题/etc/pam.d/vsftpd 中的 pam_shells.so 模块要求用户的登录 Shell 必须在 /etc/shells 文件中,而 FTP 用户通常被设置为 /sbin/nologin/bin/false,导致认证失败。

  • 解决步骤

    1. 编辑 PAM 配置文件:

      sudo vi /etc/pam.d/vsftpd
      
    2. 注释或替换 pam_shells.so

      # 注释此行
      # auth required pam_shells.so
      
      # 或替换为:
      auth required pam_nologin.so
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A_dewen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值