如何在 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
有许多可调参数,使其具有多种用途。
希望这可以帮助。