我的服务器通过路由器(NAT)连接到互联网,我已经设置了端口转发。
当通过 LAN IP 连接时,SSH 工作正常,但通过 WAN IP 连接时则不工作。
我尝试过
- 重新启动服务/计算机
- 更改端口(路由器和 ssh 端口上)
- 重置 ssh 密钥(那些是
/etc/ssh
) - 检查
/etc/hosts.allow
并/etc/hosts.deny
- 添加
sshd: ALL
hosts.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
并从中学到很多东西!
汤姆汤姆汤姆