SSH over NAT 错误:ssh_exchange_identification:读取:对端重置连接

SSH over NAT 错误:ssh_exchange_identification:读取:对端重置连接

我的服务器通过路由器(NAT)连接到互联网,我已经设置了端口转发。

当通过 LAN IP 连接时,SSH 工作正常,但通过 WAN IP 连接时则不工作。

我尝试过

  • 重新启动服务/计算机
  • 更改端口(路由器和 ssh 端口上)
  • 重置 ssh 密钥(那些是/etc/ssh)
  • 检查/etc/hosts.allow/etc/hosts.deny
  • 添加sshd: ALLhosts.allow
  • 检查iptables -L(其中没有任何内容)
  • ProxyCommand nc %h %p 从这里的答案

服务器端日志(注:xxx.xxx.xxx.xxx是我的公网IP)

debug1: sshd version OpenSSH_6.6.1, OpenSSL 1.0.1f 6 Jan 2014
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type RSA
debug1: private host key: #0 type 1 RSA
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type DSA
debug1: private host key: #1 type 2 DSA
debug1: key_parse_private2: missing begin marker
debug1: read PEM private key done: type ECDSA
debug1: private host key: #2 type 3 ECDSA
debug1: private host key: #3 type 4 ED25519
debug1: rexec_argv[0]='/usr/sbin/sshd'
debug1: rexec_argv[1]='-d'
Set /proc/self/oom_score_adj from 0 to -1000
debug1: Bind to port 222 on 0.0.0.0.
Server listening on 0.0.0.0 port 222.
debug1: Bind to port 222 on ::.
Server listening on :: port 222.
debug1: Server will not fork when running in debugging mode.
debug1: rexec start in 5 out 5 newsock 5 pipe -1 sock 8
debug1: inetd sockets after dupping: 3, 3
Connection from xxx.xxx.xxx.xxx port 58644 on 192.168.0.101 port 222

客户端日志

ssh -vvv -C -A -X -p 2222 [email protected]
OpenSSH_7.2p2 Ubuntu-4ubuntu2.1, 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 "xxx.xxx.xxx.xxx" port 2222
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to xxx.xxx.xxx.xxx [xxx.xxx.xxx.xxx] port 2222.
debug1: Connection established.
debug1: key_load_public: No such file or directory
debug1: identity file /home/yan/.ssh/id_rsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/yan/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/yan/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/yan/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/yan/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/yan/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/yan/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/yan/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1
ssh_exchange_identification: read: Connection reset by peer

任何建议都非常感谢。谢谢!

答案1

ssh_exchange_identification: read: Connection reset by peer

经过一番努力,我通过简单地运行以下命令修复了 ssh 连接被拒绝的问题。

sudo dhclient

答案2

感谢您提供日志。所以我们可以看到,服务器上的 sshd 看到了连接,但仅此而已。

我的第一个猜测是你的 NAT 路由器;也许它不能很好地完成工作。你的描述在某个方面不够清楚:如果你从服务器连接到 NAT 路由器的互联网端,并且这不起作用,你可以尝试从互联网连接。

您可以尝试其他服务,例如 Web 服务器或您了解的任何其他服务,然后调整 NAT 路由器以使其也可以访问。这样有效吗?

您可以使用 tcpdump 或 wireshark 等嗅探工具收集非常准确的信息。理想情况下,您可以在连接的两端使用它;然后您将看到数据包是如何进行 NAT 的。

假设您的 ssh 客户端位于 IP 1.1.1.1 上,而您的服务器的互联网连接位于 3.3.3.3。因此,输入 ssh 3.3.3.3 ENTER 应将 tcp syn 数据包从 1.1.1.1 和随机端口(例如 55555)发送到 3.3.3.3。您应该使用 sniffe4r 在其网络接口上看到此数据包。此数据包通过互联网传输到 3.3.3.3 上的 NAT 路由器,在那里它被 NAT 到 LAN IP,例如 192.168.1.11。您服务器上的嗅探器应该会看到从 1.1.1.1 到 192.168.1.11 端口 22 的 tcp syn 数据包。

当 sshd 接受连接时,您应该在本地嗅探器上看到应答数据包:一个从 192.168.1.11 端口 22 到 1.1.1.1 端口 55555 的 tcp ack/syn 数据包。它穿过您的 NAT 路由器,应该被修改为“从 3.3.3.3 端口 22 到 1.1.1.1 端口 55555”。您通常看不到传出的数据包,因为您此时无法嗅探。但如果到目前为止一切正常,它将传输到您的客户端,嗅探器可以在那里捕获它。此时您的客户端将看到连接已建立,并使用一个从 1.1.1.1 端口 55555 到 3.3.3.3 端口 22 的数据包进行应答,其中包含一个 tcp ack 数据包以确认连接已建立。这个数据包将会传输并进行 NAT 并且...您的服务器也将看到双向握手完成。

但是正如我们看到的“对端重置连接”,很可能您的问题会在此之前出现。

提示tcpdump:如果您通过 ssh 连接到客户端计算机(可能是 Internet 上的根服务器)并在那里启动 tcpdum,您可能会看到一个不连续的数据包流 - 它将对传输 tcpdump 输出的数据包进行 tcpdump,然后再次进行 tcpdump,依此类推。为了轻松管理这一点,您可以将 ssh 服务器的端口(或至少路由器上的 NAT 配置)更改为另一个端口,例如 2222。

然后你的 ssh 命令将是:ssh 3.3.3.3 -p 2222,你可以像这样过滤你的 tcpdump

tcpdump port 2222

或者,如果你想查看除工作中的客户端 ssh 连接之外的所有连接:

tcpdump not port 22

观看互联网流量并享受乐趣tcpdump并从中学到很多东西!

汤姆汤姆汤姆

相关内容