我已经建立了一个 SFTP 服务器,但似乎唯一能够连接到它的方式是通过环回从本地机器本身,这相当令人困惑。
SFTP 服务器不是标准的 Linux SFTP 服务器。它是一个在 Spring Boot 应用程序内运行的 Apache SFTP 服务器,该应用程序还具有常见的 FTP 和 https 端点。Ubuntu 的 SSH 还在系统的端口 22 上运行。该应用程序的 SFTP 端点当前映射到端口 2222,但这很容易更改。
运行该应用程序的机器是 AWS EC2 实例,但在意识到问题后,我意识到我可以在我的开发机器上重现它。所有 IP 都允许在端口 2222 上进行入站流量。服务器有一个密钥对,但仅用于向客户端确认其身份。客户端通过密码进行身份验证。
如果我从服务器通过环回运行的机器连接到 SFTP 端点,一切都运行正常:
sftp -oPort=22222 -vvv [email protected]
OpenSSH_7.2p2 Ubuntu-4ubuntu2.8, OpenSSL 1.0.2g 1 Mar 2016
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: resolving "domainname.net" port 22222
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to domainname.net [127.0.0.1] port 22222.
debug1: Connection established.
接下来是一些日志记录,然后是密码提示,一切都很正常。但是,如果我尝试从另一台机器连接,或者从同一台机器连接,但使用公共 IP 而不是域名,这样它就不会被解析为 127.0.0.1,我得到的只是:
sftp -oPort=12 -vvv user@<pu.bl.ic.ip>
OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n 7 Dec 2017
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: resolving "domainname.net" port 2222
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to domainname.net [<pu.bl.ic.ip>] port 12.
debug1: connect to address <pu.bl.ic.ip> port 2222: Connection refused
ssh: connect to host domainname.net port 2222: Connection refused
前面提到过,端口的防火墙是打开的。当防火墙关闭时,端口根本无法访问,情况就不同了,所以我很确定这不是问题所在。
apache sshd 服务器没有记录任何有关交互的信息,甚至没有在 TRACE 上记录,这让我怀疑它实际上从未收到请求,而是事先被其他东西击落了。我尝试进行端口转发,以便我从外部连接到端口 12,然后将其路由到 2222,这是我们处理正常 FTP 连接的方式,但其行为方式完全相同。
有人知道是什么原因导致连接中断吗?或者有人知道我该如何进一步诊断该问题吗?
答案1
所以,谜团解开了。它与我无意中从示例中复制过来的 apache sshd 配置有关。简而言之,SshServer.host 属性不配置有关主机的任何信息服务器而是配置另一个主机作为有效客户,因此只有该主机能够连接。一旦我删除该配置,从任何地方的连接都可以正常工作。