如何在 Linux 中设置和配置 FTP 服务器?
FTP(文件传输协议)是一种互联网协议,用于通过互联网或计算机网络在客户端和服务器之间传输文件。它类似于其他互联网协议,例如用于电子邮件的 SMTP 和用于网站的 HTTP。 FTP 服务器启用在服务器和客户端之间传输文件的功能。客户端使用凭据连接到服务器,并且根据其拥有的权限,它也可以读取文件或将文件上传到服务器。在本文中,我们将了解如何设置 FTP 服务器、配置用户权限、配置防火墙,最后使用 SSL 加密我们的 FTP 流量。
FTP 服务器是如何工作的?
FTP 服务器方便了客户端和服务器之间的文件传输。您可以将文件上传到服务器或从服务器下载文件。客户端与服务器建立两种类型的连接,一种用于发出命令,一种用于传输数据。客户端在端口 21 上向 FTP 服务器发出命令,该端口是 FTP 的命令端口。为了传输数据,使用数据端口。传输数据有两种连接模式:
- 主动模式:在主动模式下,客户端打开一个端口并等待服务器连接到它以传输数据。服务器使用其端口 20 连接到客户端进行数据传输。大多数 FTP 客户端默认没有设置主动模式,因为大多数防火墙会阻止从外部发起的连接,在这种情况下,是由我们的 FTP 服务器发起的连接。要使用它,您必须配置防火墙。
- 被动模式:在这种模式下,当客户端向服务器请求文件时,服务器会打开一个随机端口并告诉客户端连接到该端口。在这种情况下,连接由客户端发起,这也解决了防火墙问题。大多数 FTP 客户端默认使用被动模式。
逐步实施
首先使用具有 sudo 权限的用户通过 SSH 连接到您的 Linux 虚拟机,并按照以下步骤操作:
第一步:安装FTP服务器
有许多 FTP 服务器可供选择,例如 ProFTPD、vsftpd 等。我们将使用 vsftpd。
vsftpd FTP服务器的特点
vsftpd 具有许多功能,使其成为 FTP 服务器的绝佳选择。它
- 支持 SSL/TLS 集成
- 可以使用名为 chroot 的功能将用户监禁到其主目录。我们将在本文后面进行设置。
- 可以限制带宽。
- 支持虚拟用户
- 支持虚拟IP配置
- 支持 IPv6
输入以下命令安装 vsftpd
sudo apt install vsftpd
现在我们将检查 vsftpd 服务是否处于活动状态。输入
sudo systemctl status vsftpd
您可以在 Active 标题下看到它处于活动状态并正在运行。 systemctl命令用于在 Linux 上管理和检查服务。我们还可以使用此命令来启用和禁用 Linux 上的服务。如果您的 vsftpd 未激活,请输入
sudo systemctl enable --now vsftpd
–now 标志确保 enable 命令立即影响我们的服务,而不是在重新启动后。
步骤 2:配置防火墙
FTP 将端口 20 用于主动模式,将端口 21 用于命令,将一系列端口用于被动模式。我们需要从防火墙打开这些端口。如果您不使用任何防火墙,则可以跳过此步骤。大多数 Linux 系统使用 ufw 来管理防火墙,但是,一些云服务提供商(如 Microsoft Azure)在虚拟机之外有防火墙,您必须从他们的门户网站进行配置。无论如何,只需为 TCP 连接打开端口 20 和 21,并为被动 FTP 连接打开一系列端口。被动端口的范围取决于您希望拥有多少并发用户客户端。此外,单个客户端可以使用多个端口来传输多个文件或大文件。我们还需要指定我们的 FTP 服务器来使用这些端口,我们将在本教程后面看到如何做到这一点。直到 1024 的端口都是保留的,我们的被动 FTP 端口范围应该比这更高。我将打开 5000-10000 的端口。我们还将为稍后配置的 TLS 打开端口 990。让我们为ufw做这件事。输入
sudo ufw allow 20/tcp
sudo ufw allow 21/tcp
sudo ufw allow 990/tcp
sudo ufw allow 5000:10000/tcp
步骤 3:配置用户
FTP 服务器最常见的两个用例是:
- 您想要托管一个公共 FTP 服务器,并且许多公共用户将连接到您的 FTP 服务器以下载文件。
- 您想将文件上传到您的 Linux 服务器以供个人使用,并且您不会有公共用户。
在第一种情况下,您需要创建一个额外的用户并与您的客户共享其用户名和密码才能访问这些文件。对于第二种情况,其他一切都相同。
基本思想是管理员用户应该能够将文件上传到机器的任何文件夹,而公共用户应该只能从特定目录查看和下载文件。要做到这一点,您应该对用户权限有一个基本的了解。 root 用户有权将文件写入服务器的任何文件夹,任何其他用户都可以访问其主目录中的每个文件夹,即/home/username并且大多数其他目录不能被其他用户写入。因此,如果您想将文件上传到管理员用户主目录之外的其他目录,例如/var/www ,那么您需要使用chown命令将此目录的所有者更改为管理员用户,或者使用更改目录修改权限chmod命令。
让我们从创建我们的公共用户帐户开始。输入
sudo adduser ftpuser
输入您的密码,其他值留空,最后输入 Y 保存更改。
现在,为了安全起见,我们将禁用该用户的 ssh 权限。输入
sudo nano /etc/ssh/sshd_config
在此文件中添加以下行
DenyUsers ftpuser
按Ctrl + x然后按y然后输入。现在,重新启动 SSH 服务,使这些新设置生效。
sudo systemctl restart sshd
第 4 步:创建 FTP 文件夹并设置权限
我们将创建我们的 FTP 文件夹。输入
sudo mkdir /ftp
现在,我们将此目录的所有者更改为我们的管理员用户。输入
sudo chown adminuser /ftp
如果要将文件上传到不属于管理员用户的任何文件夹,则必须使用上述命令更改该文件夹的所有者。
第 5 步:配置和保护 vsftpd
打开 vsftpd 配置文件。输入
sudo nano /etc/vsftpd.conf
确保以下行未注释
...
anonymous_enable=NO
local_enable=YES
write_enable=YES
...
另外,我们在步骤 2 中为被动模式打开了端口 5000 到 10000,所以现在我们将让 vsftpd 知道哪些端口用于被动 FTP 连接。在 vsftpd.conf 文件中添加以下行
pasv_min_port=5000
pasv_max_port=10000
现在,我们将为 FTP 连接指定默认目录,当有人连接到我们的 FTP 服务器时,该目录将打开。添加以下行
local_root=/ftp
请记住,不要在此配置文件中的 = 前后放置任何空格。
将用户锁定到主目录
现在,出于安全原因,我们将 ftpuser 锁定到默认目录,因为默认情况下,用户可以浏览整个 Linux 服务器。为此,vsftpd 使用 chroot。为此,请取消注释以下行
...
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
...
另外,添加以下行,因为它默认不在配置文件中
allow_writeable_chroot=YES
第一行为本地用户启用 chroot 功能,包括我们的管理员用户和我们的 ftpuser。第二行和第三行让我们选择应用 chroot 的用户。
设置文件权限
local_umask=0002
此行会将创建的每个新文件的修改权限设置为 664(-rw-rw-r-),并将每个新文件夹的修改权限设置为 775(rwxrwxr-x)。这样,ftpuser 只能从我们的 FTP 目录的每个子目录读取和下载文件,但它没有权限将任何内容上传到我们的 FTP 目录,因为它不是所有者。
按Ctrl + x然后按y然后输入。现在,我们需要创建该列表文件。输入
sudo touch /etc/vsftpd.chroot_list
sudo nano /etc/vsftpd.chroot_list
无论您在此文件中指定什么用户,都不会被 chroot-ed。因此,在此文件中添加您的管理员用户名,因为我们不想锁定它。按Ctrl + x然后按y然后输入。现在我们需要重新启动我们的 vsftpd 服务器,以便立即应用所有这些设置。输入
sudo systemctl restart --now vsftpd
第 6 步:使用 SSL/TLS 保护 vsftpd
如果您想通过 Internet 使用 FTP 流量,建议对它进行加密。我们将使用 FTPS(基于 SSL 的文件传输协议)加密我们的流量。让我们从生成自签名证书开始。输入
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem
输入所有必需的信息,您的证书将生成。如果要设置默认值,也可以按 Enter。现在,打开 vsftpd 配置文件。类型
sudo nano /etc/vsftpd.conf
转到文件末尾并删除以下行
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
并且,粘贴以下行
rsa_cert_file=/etc/ssl/private/vsftpd.pem
rsa_private_key_file=/etc/ssl/private/vsftpd.pem
ssl_enable=YES
allow_anon_ssl=NO
force_local_data_ssl=YES
force_local_logins_ssl=YES
ssl_tlsv1=YES
ssl_sslv2=NO
ssl_sslv3=NO
require_ssl_reuse=NO
ssl_ciphers=HIGH
保存更改,最后,通过键入重新启动 vsftpd 服务
sudo systemctl restart --now vsftpd
第 7 步:连接到我们的 FTP 服务器
为此,您需要一个 FTP 客户端。同样,有很多可供选择。我建议您使用 Filezilla。下载并安装它,然后打开它。在主机字段中输入服务器的 IP 地址、用户名和密码,然后单击连接,一切顺利。
在左侧,您将看到 PC 的目录,在右侧,您将看到 FTP 服务器的目录。您可以拖放文件以在 FTP 服务器和您的设备(客户端)之间上传和下载文件。
FTP 服务器命令
您还可以在终端上连接到您的 FTP 服务器,并使用 FTP 命令对其进行操作。下面给出了其中一些的列表。Command Function pwd print the current working directory cwd change working directory dele delete the specified file cdup change to the parent directory help displays help information cd change the working directory get filename download the specified file put filename uploads the specified file bye end FTP session