ngrok kex_exchange_identification:读取:对等方重置连接

ngrok kex_exchange_identification:读取:对等方重置连接

我有一个 raspi(在我的机器人船项目中),使用带有 SIM 卡的加密狗通过 3G 连接连接到互联网。然后我使用恩格罗克将 ssh 公开到静态地址,以便我可以始终使用以下命令通过 ssh 进入该地址:

ssh -p 29xxx [email protected]

这对我来说一直都很有用。今天我想用我的机器人再做一次测试,但我不能再通过 ngrok ssh 进入机器了。它只是给我kex_exchange_identification: Connection closed by remote host

这就是我调试它所做的事情:

  1. 我可以通过本地网络顺利地 ssh 进入它,所以我猜测 pi 本身上的 sshd 不是问题。
  2. 我查看了 ngrok 网站,看看 pi 是否连接到了 ngrok 网络。它列出了连接,表明该连接是在几分钟前建立的。
  3. 我通过本地网络 ssh 进入 pi,停止隧道,然后手动启动它来查看日志。它显示了以下内容:
pi@myrobot:~$ ngrok tcp -remote-addr=1.tcp.ngrok.io:29xxx --log=stdout 22
INFO[09-11|09:39:33] no configuration paths supplied
INFO[09-11|09:39:33] using configuration at default config path path=/home/pi/.ngrok2/ngrok.yml                                                                             
INFO[09-11|09:39:33] open config file                         path=/home/pi/.ngrok2/ngrok.yml err=nil                                                                       
t=2020-09-11T09:39:33+0000 lvl=info msg="starting web service" obj=web addr=127.0.0.1:4040                                                                                  
t=2020-09-11T09:39:34+0000 lvl=info msg="tunnel session started" obj=tunnels.session
t=2020-09-11T09:39:34+0000 lvl=info msg="client session established" obj=csess id=1b6463ec0724                                                                              
t=2020-09-11T09:39:34+0000 lvl=info msg="started tunnel" obj=tunnels name=command_line addr=//localhost:22 url=tcp://1.tcp.ngrok.io:29xxx                                   
t=2020-09-11T09:39:38+0000 lvl=warn msg="failed to check for update" obj=updater err="Post https://update.equinox.io/check: context deadline exceeded"                      
  1. 然后我再次尝试使用详细输出 () 通过互联网 ssh 进入 pi ,得到以下输出:ssh -v -p 29xxx [email protected]
$ ssh -v -p 29xxx [email protected]
OpenSSH_8.2p1 Ubuntu-4ubuntu0.1, OpenSSL 1.1.1f  31 Mar 2020
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/*.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for *
debug1: Connecting to 1.tcp.ngrok.io [3.13.191.xxx] port 29xxx.
debug1: Connection established.
debug1: identity file /home/kramer65/.ssh/id_rsa type 0
debug1: identity file /home/kramer65/.ssh/id_rsa-cert type -1
debug1: identity file /home/kramer65/.ssh/id_dsa type -1
debug1: identity file /home/kramer65/.ssh/id_dsa-cert type -1
debug1: identity file /home/kramer65/.ssh/id_ecdsa type -1
debug1: identity file /home/kramer65/.ssh/id_ecdsa-cert type -1
debug1: identity file /home/kramer65/.ssh/id_ecdsa_sk type -1
debug1: identity file /home/kramer65/.ssh/id_ecdsa_sk-cert type -1
debug1: identity file /home/kramer65/.ssh/id_ed25519 type -1
debug1: identity file /home/kramer65/.ssh/id_ed25519-cert type -1
debug1: identity file /home/kramer65/.ssh/id_ed25519_sk type -1
debug1: identity file /home/kramer65/.ssh/id_ed25519_sk-cert type -1
debug1: identity file /home/kramer65/.ssh/id_xmss type -1
debug1: identity file /home/kramer65/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.1
kex_exchange_identification: Connection closed by remote host

在 pi 的终端上,我看不到任何反应。但上面的输出也表明它实际上从未到达 pi。

可能是 ngrok 没有正确传递连接?问题出在 pi 上吗?还是在我本地的笔记本电脑上?欢迎提供所有提示!

[编辑]

经过进一步的调试,我发现问题出在移动连接上。当我移除 3G 加密狗并通过 wifi 将 pi 连接到互联网时,我可以使用 ngrok 地址完美地 ssh 到它。但是当我通过 3G 连接时却不能。我通过 wifi 网络 ssh 到 pi 来检查 3G 上的互联网是否正常工作,并用它来curl ip.me检查当我通过 3G 连接时公共 IP 是否发生变化(此外,ping 时间8.8.8.8从 10ms 增加到大约 40ms)。

我还检查了系统日志,它没有提到任何有关传入消息的信息(我期望是Started Session c7 of user pi)。此外,当我通过 3G 启动 ngrok 隧道时,它会将下面的行添加到输出中。其余部分(包括"client session established")都是一样的

lvl=warn msg="failed to check for update" obj=updater err="Post https://update.equinox.io/check: context deadline exceeded"

那么为什么隧道会在 3G 上失败?可能是我的电信公司关闭了所有类型的端口或阻止了流量?有没有办法进一步调试?

[编辑]

好吧,这很奇怪,但问题不知怎么就解决了。今天我又试了一次,用了各种组合。都失败了。然后我摇摆了一段时间。回来后,我出于绝望又试了一次,它突然就成功了。我简直不知所措。我重新启动,再次断开 3G 网络,现在它每次都能正常工作。这让我有点害怕。一周左右的时间里,我失败了很多次,用了上百万种组合,但都没有成功。我把它弄好了,它失败了,没有做任何改变,它突然又能正常工作了。

这确实让我有点害怕。我不明白它为什么会失败,这意味着当我的机器人船在北海上时,它会突然再次失败,无法到达。

但无论如何。它有效,所以现在我不会再担心它了。

答案1

这个问题显然存在于每个 Arch Linux 全新安装中。我通过取消注释此行找到了解决方法:

auth     required  pam_securetty.so

里面的/etc/pam.d/sshd文件然后重新启动sshd服务。

编辑:我刚刚测试了 2 个树莓派,一个使用 Manjaro,另一个使用 Raspbian OS。Manjaro 遇到了这个问题,可以用这种方式修复。但是,Raspbian OS 无需任何修复即可正常工作。因此,您的树莓派不需要修复,但每个使用基于 Arch 的操作系统的人肯定都需要这个。

相关内容