如何在 Linux 上使用 vsftpd 设置安全的 FTP 服务如何在 Linux 上使用 vsftpd 设置安全的 FTP 服务如何在 Linux 上使用 vsftpd 设置安全的 FTP 服务如何在 Linux 上使用 vsftpd 设置安全的 FTP 服务
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何在 Linux 上使用 vsftpd 设置安全的 FTP 服务

FTP或文件传输协议是Internet上广泛使用的服务之一,主要用于将文件从一台主机传输到另一台主机。 FTP 本身并不是一种安全协议,因此经典的 FTP 服务很容易受到中间人攻击和暴力攻击等常见攻击。

许多具有安全功能的应用程序可用于建立安全的 FTP 服务。例如,FTPS(FTP Secure)使用SSL/TLS证书来加密端到端数据。根据客户端要求,FTPS 可以配置为支持加密和/或未加密连接。 SFTP(SSH 文件传输协议)是确保传输数据安全的另一种方法。 SFTP 是作为 SSH 的扩展构建的,也可以与其他安全协议一起使用。

本教程将重点介绍如何在启用 SSL/TLS 的情况下使用 vsftpd 设置和保护 FTP 服务。

一点背景知识:典型的 FTP 服务器在 TCP 端口 20 上侦听数据,在 21 上侦听命令(也称为控制端口)。连接建立和命令参数交换是通过端口 21 完成的。 FTP 连接支持两种方式:主动模式和被动模式。在主动模式下建立连接期间,服务器启动从其端口 20(数据)到客户端的连接。在被动模式下,服务器为每个客户端会话分配一个随机数据端口,并通知客户端有关该端口的信息。然后客户端启动到服务器随机端口的连接。

根据 RFC 1635,FTP 支持通过没有任何密码的特殊用户 anonymous 和/或具有密码 ftp 的用户 ftp 进行公共访问。除了此类公共用户之外,vsftpd还支持本地Linux用户登录。 Linux 用户可以通过使用 FTP 连接到服务器并提供登录凭据来访问其主目录,即 /home/user。

在 Linux 上安装 vsftpd

在 Ubuntu、Debian 或 Linux Mint 上安装 vsftpd

要在基于 Debian 的系统上安装 vsftpd,请使用 apt-get 命令。 vsftpd 服务将在启动时自动启动。


$ sudo apt-get install vsftpd

在 CentOS、Fedora 或 RHEL 上安装 vsftpd

要在基于 Red Hat 的系统上安装 vsftpd,我们可以使用 yum 轻松完成。该服务已启动并添加到系统启动中。


# yum install vsftpd
# service vsftpd start
# chkconfig vsftpd on

使用 vsftpd 的最基本形式的 FTP 服务现在可以使用了。我们可以通过将浏览器指向 URL ftp://[ServerName/IP] 或使用 FTP 客户端(如 FileZilla)使用用户名 anonymous 且无密码或用户名 ftp 和密码 ftp 进行连接来访问 FTP 服务。

当安装vsftpd时,系统中会添加一个主目录为/var/ftp的系统用户ftp。每当建立匿名 FTP 连接时,会话始终默认为 /var/ftp 目录。所以,我们可以使用这个目录作为FTP公共用户的主目录。放置在 /var/ftp 下的任何文件/目录都可以通过 ftp://[ServerName/IP] 访问。

vsftpd 配置文件的位置可在以下位置找到:

  • Ubuntu、Debian 或 Linux Mint: /etc/vsftpd.conf

  • CentOS、Fedora 或 RHEL: /etc/vsftpd/vsftpd.conf

在本教程的其余部分中,使用 Linux 系统上相应位置中的 vsftpd.conf 文件。

调整 FTP 用户

为了禁用公共访问,我们在 vsftpd.conf 中显式禁用用户 anonymous。仅注释掉该行是行不通的,因为 vsftpd 已经使用默认值运行。您还需要重新启动 vsftpd。


anonymous_enable=NO

# service vsfptd restart

这样就启用了强制身份验证,只有现有的 Linux 用户才能使用其登录凭据进行连接。

要启用/禁用本地用户,我们可以修改 vsftpd.conf 文件。如果我们禁用本地用户,我们必须确保用户anonymous被授予访问权限。


local_enable=YES/NO

# service vsfptd restart

要使用特定用户连接到系统,我们只需将 URL 修改为 ftp://username@[ServerName/IP] 即可。使用此方法可以通过 FTP 访问各个用户的主目录。

将用户限制在他们的主目录中

当用户使用FTP访问远程服务器时,只要文件/目录可读,用户就可以导航整个系统。完全不建议这样做,因为任何用户都可以通过 FTP 会话读取和下载 /etc、/var、/usr 和其他位置下的系统文件。

要使本地用户在 FTP 会话期间仅限于其主目录,我们可以修改以下参数。


chroot_local_user=YES

# service vsftpd restart 

现在,本地用户将只能访问其主目录,而无法访问系统中的其他文件或目录。

启用 SSL/TLS 加密

FTP 在设计上是一种明文协议,这意味着任何人都可以轻松窥探客户端和远程 FTP 服务器之间的文件传输流量。要加密 FTP 通信,您可以在 vsftpd 中启用 SSL/TLS。

第一步是创建 SSL/TLS 证书和私钥,如下所示。它将生成的证书/密钥存储在目标 .pem 文件中。

在 Debian/Ubuntu 上:


$ sudo openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout /etc/vsftpd.pem -out /etc/vsftpd.pem

在 CentOS/Fedora/RHEL 上:


$ sudo openssl req -x509 -days 365 -newkey rsa:2048 -nodes -keyout /etc/vsftpd/vsftpd.pem -out /etc/vsftpd/vsftpd.pem

然后在vsftpd.conf配置文件中添加以下参数。


# enable TLS/SSL
ssl_enable=YES

# force client to use TLS when logging in
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

# specify SSL certificate/private key (Debian/Ubuntu)
# For CentOS/Fedora/RHEL, replace it with /etc/vsftpd/vsftpd.pem
rsa_cert_file=/etc/vsftpd.pem
rsa_private_key_file=/etc/vsftpd.pem

# define port range for passive mode connections
pasv_max_port=65535
pasv_min_port=64000

最后重新启动vsftpd。


# service vsftpd restart

控制连接和带宽

vsftpd 提供了多种控制连接和用户带宽的方法。我们将使用其中的几个来调整我们的 FTP 服务器。


## bandwidth allocation per anonymous session is set to roughly 30 KB/s ##
anon_max_rate=30000

## each local user is granted roughly 30 KB/s bandwidth ##
local_max_rate=30000

## client session is terminated after being idle for 300 seconds ##
idle_session_timeout=300

## maximum number of connections per source IP, which can help secure against DoS and DDoS attacks ##
max_per_ip=50

调整防火墙

最后,如果您的系统(例如 CentOS)上运行 iptables 防火墙,请确保调整防火墙规则以允许 FTP 流量。以下规则应该可以帮助您入门。


# iptables -I INPUT -p tcp --dport 20 -j ACCEPT
# iptables -I INPUT -p tcp --dport 21 -j ACCEPT
# iptables -I INPUT -p tcp --dport 64000:65535 -j ACCEPT

前两条规则允许 FTP 数据/控制端口上的流量。最后一条规则允许被动模式连接,其端口范围已在 vsftpd.conf 中定义。

启用日志记录

如果您在本教程的设置过程中遇到任何问题,您可以通过修改 vsftpd.conf 中的以下参数来启用日志记录。


xferlog_enable=YES
xferlog_std_format=NO
xferlog_file=/var/log/vsftpd.log 
log_ftp_protocol=YES
debug_ssl=YES

# service vsftpd restart

使用 FileZilla 连接到 FTP 服务器

有多个支持 SSL/TLS 的 FTP 客户端,尤其是 FileZilla。要连接到 FileZilla 上启用 SSL/TLS 的 FTP 站点,请对 FTP 主机使用以下设置。

第一次连接到启用 SSL/TLS 的 FTP 服务器时,您将看到该站点的证书。继续并信任证书来登录。

sftpd 故障排除

1. 如果您在连接 FTP 服务器时遇到以下错误,可能是因为您的防火墙阻止了 FTP 流量。确保您按照上述方式打开了必要的 FTP 端口的防火墙。


ftp: connect: No route to host

2. 如果您在连接到在 CentOS/RHEL 上运行的 chroot-ed FTP 服务器时遇到以下错误,禁用 SELinux 是一种选择。


500 OOPS: cannot change directory:/home/dev
Login failed.

虽然关闭 SELinux 是一个快速解决方案,但在生产环境中这样做可能并不安全。因此,在 SELinux 中打开以下布尔值可以解决该问题。


$ sudo setsebool -P ftp_home_dir on

3. 如果您在 FileZilla 上访问启用 SSL/TLS 的 FTP 服务器时遇到以下错误,请确保在 vsftpd.conf 中添加 ssl_ciphers=HIGH。 FileZilla 不支持默认密码 (DES-CBC3-SHA)。


Trace: GnuTLS alert 40: Handshake failed
Error: GnuTLS error -12: A TLS fatal alert has been received.

"SSL_accept failed: error:1408A0C1:SSL routines:SSL3_GET_CLIENT_HELLO:no shared cipher"

综上所述,使用 vsftpd 设置 FTP 服务器并不困难。使用anonymous用户的默认安装应该能够支持小型经典FTP服务。 vsftpd 有许多可调参数,使其具有多种用途。

希望这可以帮助。

©2015-2025 艾丽卡 support@alaica.com