我的局域网由一台运行 Linux(Debian Wheezy)的台式计算机、一台装有 OS X Mavericks 的 MacBook 以及一个调制解调器路由器组成;Linux 主机和 OS X 客户端的 ssh 运行良好 - 从客户端连接到主机没有问题。
此外,我还尝试实现反向操作 - Linux 计算机也成为客户端,OS X 计算机也成为主机。但尝试从 Linux 客户端 ssh 到 OS X 主机会导致
ssh_exchange_identification: Connection closed by remote host
无论 Mac 防火墙是否打开或关闭,都会发生这种情况。
我尝试过谷歌搜索建议的多种解决方案,包括:
(系统不允许我发布更多链接。)
我非常确定文件所有权、权限和配置是正确的。
每台主机和客户端计算机上的 ssh 都配置了相同的端口(例如 1234);两台计算机上的 netstat 命令均表明端口 1234 已被监听。DenyHosts 和 fail2ban 均未安装。
在 Linux 客户端上,/var/log/auth.log 没有提供任何相关消息。
从客户端到主机的 Telnet 提供
Connection closed by foreign host.
在 OS X 主机上,尝试 ssh 连接时:
/var/log/appfirewall.log显示
MacBook.local socketfilterfw[636] <Info>: sshd-keygen-wrapper: Allow TCP CONNECT (in:1 out:0
)
/var/log/system.log显示
MacBook.local com.apple.preference.security.remoteservice[662]: nsc_smb XPC: handle_event error : < Connection invalid >
看起来问题出在 OS X 主机上,解决问题的关键可能就在这些消息中,但我一直无法找到有用的信息。
在 MacBook 上,系统偏好设置 > 安全和隐私 > 防火墙 > 防火墙选项,“远程登录(SSH)”和“sshd-keygen-wrapper”设置为“允许传入连接”。
在系统偏好设置 > 共享中启用“远程登录”。
什么原因可能导致 ssh 连接问题以及如何解决?
自初次发布以来的附加信息
感谢回复,但我已经完成了链接中列出的所有操作,使用我的用户名 (alex) 作为用户进行远程登录,并在每次更改 ssh 后在两台计算机上重新启动 ssh,然后重新启动两台计算机。还在 Linux 计算机上重新安装了 ssh 几次,并在两台计算机上生成了几次新密钥。
也许我应该在两个客户端的 ssh_config 中澄清一下
PasswordAuthentication no
PubkeyAuthentication yes
这是从 OS X 主机请求的输出:(不确定它有多大用处,因为我已将 ssh 端口从默认的 22 更改为 1234)
MacBook:~ alex$ ssh -vvv localhost
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug2: ssh_connect: needpriv 0
debug1: Connecting to localhost [::1] port 22.
debug1: connect to address ::1 port 22: Connection refused
debug1: Connecting to localhost [127.0.0.1] port 22.
debug1: connect to address 127.0.0.1 port 22: Connection refused
debug1: Connecting to localhost [fe80::1%lo0] port 22.
debug1: connect to address fe80::1%lo0 port 22: Connection refused
ssh: connect to host localhost port 22: Connection refused
其他澄清信息:
MacBook:~ alex$ ssh -vvv -p 1234 localhost
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug2: ssh_connect: needpriv 0
debug1: Connecting to localhost [::1] port 1234.
debug1: connect to address ::1 port 1234: Connection refused
debug1: Connecting to localhost [127.0.0.1] port 1234.
debug1: Connection established.
debug3: Incorrect RSA1 identifier
debug3: Could not load "/Users/alex/.ssh/id_rsa" as a RSA1 public key
debug1: identity file /Users/alex/.ssh/id_rsa type 1
debug1: identity file /Users/alex/.ssh/id_rsa-cert type -1
debug1: identity file /Users/alex/.ssh/id_dsa type -1
debug1: identity file /Users/alex/.ssh/id_dsa-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
ssh_exchange_identification: Connection closed by remote host
MacBook:~ alex$
Linux 客户端请求的输出:
alex@desktop:~$ ssh -v [email protected]
OpenSSH_6.0p1 Debian-4+deb7u2, OpenSSL 1.0.1e 11 Feb 2013
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 20: Applying options for *
debug1: /etc/ssh/ssh_config line 102: Applying options for *
debug1: Connecting to MacBook.local [192.168.0.3] port 1234.
debug1: Connection established.
debug1: identity file /home/alex/.ssh/id_rsa type 1
debug1: Checking blacklist file /usr/share/ssh/blacklist.RSA-2048
debug1: Checking blacklist file /etc/ssh/blacklist.RSA-2048
debug1: identity file /home/alex/.ssh/id_rsa-cert type -1
ssh_exchange_identification: Connection closed by remote host
alex@desktop:~$
在花费大量精力让 Linux 作为主机、OS X 作为客户端运行 ssh 之后,我发现反向操作相对简单。也许可以,但还远未可知!如能得到进一步帮助,我将不胜感激。
拉尔斯
MacBook:~ alex$ sudo sshd -t
Password:
/etc/sshd_config: No such file or directory
MacBook:~ alex$
sshd_config 文件位于 /private/etc/ssh 中,ssh_config 和 ssh_host 密钥文件也是如此。
问题解决了
我将 sshd_config 的副本放入 /private/etc 并执行了sudo sshd -t
。输出显示格式错误,提示样式错误,并引用了 rtf。字体是 Times。我从 Linux 计算机复制了该文件,在此过程中字体从纯文本变为了纯文本。
我将 /private/etc/ssh 中的 sshd_config 文件更改为纯文本,在 Mac 上的系统偏好设置 > 共享中切换“远程登录”,从 Linux 客户端发出 ssh 命令,并且能够首次连接到 OS X 主机。
我之前没有遇到过这个sshd -t
命令,所以感谢 Lars 提醒我并给我指明了正确的方向。解决方案确实很简单,但识别它却并不简单。
答案1
您可能需要在 Mac 上启用远程访问。请按照以下步骤操作。
- 在 Mac 上,打开“共享偏好设置”,然后选择“远程登录”
- 指定哪些用户可以登录:所有用户或“仅这些用户”。
然后您应该能够通过命令 ssh 进入它。
ssh -v user@macOSX-hostname
如果没有连接,请剪切/粘贴整个连接,以便我们可以看到失败的地方。-v 应该会给你一些信息。