Linux下如何部署FTP服务器

Linux下如何部署FTP服务器

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

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

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

说明

在安装 vsftpd 之前,有几个重要的地方需要说明下

工作模式

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

  • 主动模式

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

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

  • 被动模式

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

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

建议:

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

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

用户认证模式
  • 匿名用户模式

任何人无需密码验证就可以直接登录到FTP服务器。这种模式最不安全,一般只用来保存不重要的公开文件,不推荐在生产环境中使用

  • 本地用户模式

通过Linux系统本地账号进行验证的模式,相较于匿名用户模式更安全。

  • 虚拟用户模式

FTP服务器的专有用户。虚拟用户只能访问Linux系统为其提供的FTP服务,而不能访问Linux系统的其它资源,进一步增强了FTP服务器的安全性。

匿名用户模式一般用于不重要的于公开文件,并且只提供下载服务,也就是说,用户只能下载,不能有其他操作,本地用户模式通过配置锁定目录、修改命令端口和数据端口 可以进一步增强安全性,本文后面的配置是以该模式为例的

安装

安装前可以使用下面的命令检查是否已安装

vsftpd -v

如果未安装会有如下提示

[root@localhost ~]$ vsftpd -v
-bash: vsftpd: 未找到命令

安装 vsftpd

yum install vsftpd

安装完成后,执行 vsftpd -v 命令,如果输出版本号,表示安装成功

[root@localhost ~]# vsftpd -v
vsftpd: version 3.0.2

配置服务器

安装完成之后,默认的配置位于 /etc/vsftpd/vsftpd.conf, 如果找不到默认配置在哪里,可以使用下面的命令查找下,其中 /etc/vsftpd 目录就是存放配置的地方

[root@localhost ~]# whereis vsftpd
vsftpd: /usr/sbin/vsftpd /etc/vsftpd /usr/share/man/man8/vsftpd.8.gz

配置的格式相对简单,每一行都是注释或者选项,注释以 # 号开头,选项的格式是 option=value 的形式,每个选项占一行, option= 以及 value 之间不允许出现空格

vsftpd 对每个配置的选项都设置了一个默认值,服务器启动之后,在 vsftpd.conf 中配置的选项会覆盖服务器中的默认值

vsftpd 可配置的选项很多,下面按照类别把常用的配置项分成了 访问权限、锁定访问目录、限定用户登录、修改端口、日志配置、其他配置 几组, 每个配置项前都增加了详细的说明

配置项分组主要是为了总结说明每一组配置项的作用,实际配置的过程中,把所有组的配置项添加到 vsftp.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

#用户名插入到本地 FTP 主目录中
user_sub_token=$USER

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

把登录的用户锁定在指定的目录中,避免用户访问不应该访问的目录,这里我们设置成只允许访问自己的 home 目录中的 ftp 目录,例如:新添加一个用户 testuser 专门用于上传下载, testuser 通过 FTP 客户端成功登录后,会自动切换到 /home/testuser/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 本身将负责侦听和处理传入的连接
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.70.20

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

#设置被动模式下,建立数据传输可使用的端口范围的最大值
pasv_max_port=50010
  • 日志配置
#是否记录上传下载日志,默认是不记录,如果设置为记录
#默认日志文件位于 /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

这两个配置使用默认生成的选项即可,不用做任何修改

设置防火墙

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

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

[root@localhost ~]# firewall-cmd --zone=public --add-port=48888/tcp --permanent
success
[root@localhost ~]# firewall-cmd --zone=public --add-port=50000-50010/tcp --permanent
success

防火墙设置好以后,执行下面的命令重启防火墙服务

[root@localhost ~]# systemctl restart firewalld

最后,查看下端口是否成功开放

[root@localhost ~]# firewall-cmd --list-port
50000-50010/tcp 48888/tcp

从结果可以看出,防火墙已经开放了 48888、50000-50099 端口

启动服务器

配置完 /etc/vsftpd/vsftpd.conf ,设置好防火墙之后,执行下面的命令启动服务器

systemctl start vsftpd

启动之后,查询服务器状态,确认服务器是否启动成功

[root@localhost ~]# systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-09-1 20:21:00 CST; 3 days ago
 Main PID: 94916 (vsftpd)
   CGroup: /system.slice/vsftpd.service
           └─94916 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

Sep 1 20:21:00 localhost systemd[1]: Starting Vsftpd ftp daemon...

Sep 1 20:21:00 localhost systemd[1]: Started Vsftpd ftp daemon.

将服务器设置成开机启动

systemctl enable vsftpd

下面的命令可以确认服务器的命令端口是否开启( 配置的是 : 48888 )

[root@localhost ~]# netstat -antup | grep vsftpd
tcp6       0      0 :::48888                :::*                    LISTEN      20501/vsftpd
[root@localhost ~]#

新建FTP用户

新建用户 mytest, 并设置密码

[root@localhost ~]# useradd mytest
[root@localhost ~]# passwd mytest

新建 FTP 目录,并修改目录权限

[root@cghost21 home]# mkdir -p /home/mytest/ftp/files
[root@cghost21 home]# chmod -R 500 /home/mytest/
[root@cghost21 home]# chmod -R 700 /home/mytest/ftp/files

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

锁定目录必须要去掉可写权限,不然用户会无法登录,这一点在FTP服务器端做了强制的校验,所以 “chmod 500 /home/mytest/” 命令是设置 /home/mytest 以及 /home/mytest/ftp 两个目录可读可执行权限,无可写权限

“/home/mytest/ftp/files” 目录是实际的上传下载的目录,所以需要有可读写和可执行权限

最后,还需要把用户名加入到FTP服务器允许登录的用户列表中,也即 /etc/vsftpd/vsftpd.confuserlist_file 选项对应的文件 /etc/vsftpd/user_list 中,如果 user_list 不存在,需要手工创建并把 mytest添加进去

测试

服务器全部搭建好之后,需要进行测试,这里我准备的 FTP服务器的IP是 192.168.70.20, FTP客户端机器的IP是 192.168.70.11

进入FTP服务器的 /home/mytest/ftp/files 目录, 新建一个 a.txt 测试文件

[root@localhost files]# pwd
/home/mytest/ftp/files
[root@localhost files]# echo "ftp server..." >> a.txt
[root@localhost files]#

进入FTP客户端机器的 /home/wl/temp目录,新建一个 test.txt 测试文件

[root@localhost temp]# echo "ftp test..." >> test.txt
[root@localhost temp]# cat test.txt
ftp test...

测试上传下载需在FTP客户端机器上安装 FTP 客户端, 执行以下命令进行安装,如已安装,可忽略

yum install ftp

执行下面一系列的命令,进行测试

Linux下如何部署FTP服务器
1、登录FTP服务器命令,格式:ftp 服务器ID 命令端口

2、输入登录用户名

3、输入登录密码

4、登录成功之后,此时位于FTP服务器的 /home/mytest/ftp 目录中,执行 ls 命令之后,

   结果显示当前目录还有一个 files 的子目录

5、执行 pwd 命令查看当前所在目录,FTP服务器上的 /home/mytest/ftp 目录就是 FTP 的根目录

6、执行 cd files 命令进入 files 目录,也即FTP服务器上的 /home/mytest/ftp/files  目录,

   然后执行 ls 命令查看当前目录的文件,可以看到 FTP服务器上的测试文件 a.txt

7、执行 put test.txt  命令,把FTP客户端机器上当前目录( /home/wl/temp ) 中的 test.txt 文件

   上传到服务器的 /home/mytest/ftp/files 目录中

8、执行  get a.txt  命令,把FTP服务器上的 /home/mytest/ftp/files/a.txt 文件下载到 FTP客户端机器的当前目录( /home/wl/temp ) 中

9、上传下载测试完成之后,执行 exit 命令,退出 FTP 命令行

10、最后执行 cat a.txt 命令查看从 FTP服务器上下载的测试文件的内容,从结果可以看出,和服务器上的测试文件内容是一样的

小结

本文介绍了 Linux 下FTP服务器 vsftpd 的安装、配置、测试等整个步骤以及注意事项,文中只是对 vsftpd 的常用配置项做了说明,更多的配置项请参考官网文档

Original: https://www.cnblogs.com/wanng/p/how-to-install-ftp-server.html
Author: Linux开发那些事儿
Title: Linux下如何部署FTP服务器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606808/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 梦幻西游H5游戏超详细图文架设教程

    前言 想体验经典Q版西游霸服快乐吗?想体验满级VIP的尊贵吗?想体验一招秒杀的爽快吗?各种极品装备、翅膀、宠物通通给你,就在梦幻西游! 本文讲解梦幻西游H5游戏的架设教程,想研究H…

    Linux 2023年6月7日
    0112
  • Linux at命令详解

    大家好,我是良许。 生活中,我们有太多场景需要使用到闹钟,比如早上 7 点起床,下午 4 点开会,晚上 8 点购物,等等。 在 Linux 系统里,我们同样也有类似的需求。比如我们…

    Linux 2023年6月14日
    081
  • 剑指offer计划27(栈与队列困难)—java

    1.1、题目1 剑指 Offer 59 – I. 滑动窗口的最大值 1.2、解法 解题思路:(来自作者bigbeats) 相当于维护一个最大队列(队头元素最大,向队尾非…

    Linux 2023年6月11日
    086
  • Redis之事务

    一.是什么 可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞二.能干嘛 一个队列中,一次性、顺序性、排他…

    Linux 2023年5月28日
    0102
  • Timeout connecting to [localhost/127.0.0.1:9200]

    空服务启动时(或者压根没引入es相关jar包)报Timeout connecting to [localhost/127.0.0.1:9200]错误时,查看pom.xml中是否引用…

    Linux 2023年6月7日
    0152
  • linux常用指令记录

    给目标文件夹执行权限:chmod -R 777 html du -sh . [对当前目录下所有的目录和文件的大小进行汇总,-s表示汇总,-h表示以KB, MB, GB, TB格式进…

    Linux 2023年6月6日
    0124
  • 零成本搭建个人博客搭建篇

    为什么要搭建个人博客 尽管已经有很多成型的在线博客平台供大家使用(csdn,博客园,掘金等),但是它们都有一些很明显的弊端,例如账号以及博客内容受到监管,所有权不属于作者本人,对于…

    Linux 2023年6月7日
    072
  • 超好用的UnixLinux 命令技巧 大神为你详细解读

    1、删除一个大文件 我在生产服务器上有一个很大的200GB的日志文件需要删除。我的rm和ls命令已经崩溃,我担心这是由于巨大的磁盘IO造成的,要删除这个大文件,输入: > /…

    Linux 2023年6月14日
    0110
  • Beyond Compare文件对比神器,快来给文件找茬!

    在工作中很多场景下都需要比对两个文件之间的差异,你是否还傻傻的同时打开两个文件,用眼睛一行一行的核对? 赶紧来试试这个神器Beyond Compare!!它可以快速的帮你找出两个文…

    Linux 2023年6月7日
    0109
  • LeetCode-443. 压缩字符串

    题目来源 题目详情 给你一个字符数组 chars ,请使用下述算法压缩: 从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 : 如果这一组长度为 1 ,则将字符追…

    Linux 2023年6月7日
    0116
  • zabbix监控配置流程

    zabbix监控配置流程 管理层次: 开发人员要加监控,需要让其提供监控指标运营人员要加监控,让其找开发要监控指标运维人员要加监控,让运营人员去找开发要监控指标。 配置层次: 1….

    Linux 2023年6月6日
    0110
  • JavaScript快速入门-05-基本语句

    5 基本语句 5.1 if 语句 if 语句常用语法如下所示: if (condition) { statement1; } else { statement2; } 或 if (…

    Linux 2023年6月7日
    0155
  • 同一台电脑生成多份ssh私钥和公钥,映射多个GitHub账号

    当我们使用 Git 进行代码版本控制时,经常出现一台电脑需要连接多个Git 账号的情况,此时需要在一台电脑上生成多份 ssh 私钥和密钥,同时映射多个 Git 账号;这里我们需要同…

    Linux 2023年6月14日
    084
  • 免外围电路ESP32/ESP8266系列单片机串口一键下载方案

    一、概述 CH340X、CH343、CH342等USB转串口芯片支持免外围电路ESP32/ESP8266等单片机串口一键下载功能,对此类支持多模式启动的单片机,无需外围三极管等逻辑…

    Linux 2023年6月7日
    0138
  • Linux——防火墙、SELinux规则

    防火墙的功能:简单地释放或阻止某些服务和端口 [En] The function of firewall: simply to release or block certain s…

    Linux 2023年5月27日
    098
  • markdown插入代码块导致列表缩进异常的解决方法

    前言 一、问题描述 总结 前言 最近正在用markdown写博客,发现插入代码块后,代码块和代码块后的内容会产生缩进异常,翻了翻网页,发现又是经典的一模一样的文章一大把,尝试了之后…

    Linux 2023年6月7日
    0198
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球