我有一个运行 vsftpd 的 Arch Linux 系统,该系统在过去一年中一直使用 FTPES 运行。在过去两天内,我注意到我的所有 FTP 客户端都无法通过 FTPES 连接。当我在 Windows 7 上使用 FileZilla 3.17.0 进行连接时,我注意到在发送目录列表时发生了 GnuTLS 错误 -15:
这是使用 WAN IP 指定主机的被动 FTPES:
Status: Connecting to ###.###.###.###:21...
Status: Connection established, waiting for welcome message...
Status: Initializing TLS...
Status: Verifying certificate...
Status: TLS connection established.
Status: Logged in
Status: Retrieving directory listing...
Command: PWD
Response: 257 "/" is the current directory
Command: TYPE I
Response: 200 Switching to Binary mode.
Command: PASV
Response: 227 Entering Passive Mode (###,###,###,###,27,163).
Command: LIST
Response: 150 Here comes the directory listing.
Error: GnuTLS error -15: An unexpected TLS packet was received.
Error: Disconnected from server: ECONNABORTED - Connection aborted
Error: Failed to retrieve directory listing
Status: Disconnected from server
FileZilla 随后重试连接,结果相同,然后停止尝试连接。FileZilla 的先前版本也显示 GnuTLS -110 错误,但我没有保存包含该错误的输出。
我读过一些帖子,它们表明此问题是由被动 FTP 配置问题引起的。被动 FTP 已在此服务器上运行了一段时间,我尚未对任何相关配置文件进行任何更改。为确保万无一失,我尝试使用主动模式进行连接。一切似乎都很正常,直到我收到非法 PORT 命令错误,此时 FileZilla 再次尝试使用被动模式。
这是使用 WAN IP 指定主机的“活动”FTPES:
Status: Connecting to ###.###.###.###:21...
Status: Connection established, waiting for welcome message...
Status: Initializing TLS...
Status: Verifying certificate...
Status: TLS connection established.
Status: Logged in
Status: Retrieving directory listing...
Command: PWD
Response: 257 "/" is the current directory
Command: TYPE I
Response: 200 Switching to Binary mode.
Command: PORT 192,168,0,7,240,98
Response: 500 Illegal PORT command.
Command: PASV
Response: 227 Entering Passive Mode (###,###,###,###,27,103).
Command: LIST
Response: 150 Here comes the directory listing.
Error: GnuTLS error -15: An unexpected TLS packet was received.
Error: Disconnected from server: ECONNABORTED - Connection aborted
Error: Failed to retrieve directory listing
Status: Disconnected from server
这里的问题似乎是,即使我输入了我的 WAN IP 地址,主动模式仍会尝试在该 PORT 命令中使用本地 IP 地址。另一个 FTP 客户端(iOS 上的 FTP Client Pro 版本 3.0.4)给出错误“服务器似乎不支持主动模式”。然后我尝试在本地连接到我的服务器,虽然这次客户端没有进入被动模式,但 TLS 错误仍然存在。
这是使用本地 IP 指定主机的活动 FTPES:
Status: Connecting to 192.168.0.2:21...
Status: Connection established, waiting for welcome message...
Status: Initializing TLS...
Status: Verifying certificate...
Status: TLS connection established.
Status: Logged in
Status: Retrieving directory listing...
Command: PWD
Response: 257 "/" is the current directory
Command: TYPE I
Response: 200 Switching to Binary mode.
Command: PORT 192,168,0,7,240,129
Response: 200 PORT command successful. Consider using PASV.
Command: LIST
Response: 150 Here comes the directory listing.
Error: GnuTLS error -15: An unexpected TLS packet was received.
Error: Disconnected from server: ECONNABORTED - Connection aborted
Error: Failed to retrieve directory listing
Status: Disconnected from server
最后,我尝试了不使用加密进行连接。尽管我尽可能避免这样做,但为了从某些受限制的网络进行连接,我必须支持未加密的连接。FileZilla 中的主动和被动设置都可以在禁用加密的情况下通过公共互联网工作,但这两种类型都显示相同的输出:
这是使用 WAN IP 指定主机的主动/被动普通 FTP:
Status: Connecting to 98.220.249.102:21...
Status: Connection established, waiting for welcome message...
Status: Logged in
Status: Retrieving directory listing...
Status: Calculating timezone offset of server...
Status: Timezone offset of server is 0 seconds.
Status: Directory listing of "/" successful
由于此服务器位于路由器后面,因此配置为被动 FTP 无法在本地工作;请参阅下面的 vsftpd.conf。为了尝试所有连接可能性,以下是 FileZilla 在本地建立主动、未加密连接的输出。它失败了,但我并不太担心,因为我从未使用过这种设置组合。
这是使用本地 IP 指定主机的主动普通 FTP:
Status: Connecting to 192.168.0.2:21...
Status: Connection established, waiting for welcome message...
Status: Logged in
Status: Retrieving directory listing...
Command: PWD
Response: 257 "/" is the current directory
Command: TYPE I
Response: 200 Switching to Binary mode.
Command: PORT 192,168,0,7,240,195
Response: 200 PORT command successful. Consider using PASV.
Command: LIST
Response: 150 Here comes the directory listing.
Response: 500 OOPS: priv_sock_get_cmd
Error: Failed to retrieve directory listing
Error: Connection closed by server
这是我的/etc/vsftpd.conf
,减去注释。这基本上是我过去一年一直成功使用的文件。
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
port_enable=YES
connect_from_port_20=YES
ftpd_banner=Welcome to HOSTNAME (vsftpd on ArchLinux).
chroot_local_user=YES
allow_writeable_chroot=YES
listen=YES
ssl_enable=YES
force_local_logins_ssl=NO
force_local_data_ssl=NO
ssl_tlsv1=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
rsa_private_key_file=/etc/ssl/certs/vsftpd.pem
pasv_min_port=7000
pasv_max_port=7100
pasv_address=###.###.###.###
在注意到此问题之前,我对 Arch 系统进行的最近一次完整升级是在 2016 年 4 月 17 日,其中包括upgraded gnutls (3.4.10-1 -> 3.4.11-1)
。vsftpd 的最近一次升级是在 2016 年 3 月 9 日(3.0.3-1 -> 3.0.3-2),因此,我没有只降级 gnutls,而是使用 Arch Linux Archive 将整个系统恢复到 2016 年 3 月 9 日的状态。这没有帮助,我随后升级了系统以匹配当前的存储库。此处提供的输出是使用截至本文发布之日(2016 年 4 月 23 日)的最新系统生成的。我不确定这个错误究竟是什么时候开始的,因为我使用 FTP 服务器的频率不够高,无法立即注意到它。
正如我之前所说,自从我的 FTP 服务器上次工作以来,我的相关配置没有改变,除了在这里发布信息时所做的更改之外。
我的目标是让被动 FTPES 再次在公共互联网上工作。如果我必须牺牲未加密的主动 FTP,这是可以接受的,但我仍然希望在需要它的少数情况下将其保留可用。我需要做什么来修复这个问题?
答案1
我遇到了和你一样的问题,在网上搜索了很长时间后,我似乎找到了解决办法这里:将该行添加
seccomp_sandbox=NO
到您的/etc/vsftpd.conf
。
我的用例是仅 LAN、启用 SSL 的 FTP 服务器,因此 YMMV。此问题的一个可能解释可能是由于 wifi 驱动程序不兼容,我没有安装存储库中可用的最新内核。
我希望这有帮助 :)