使用 cygwin,如何重新启动 ssh 反向隧道而不会出现转发问题“警告:远程端口转发失败”消息?

使用 cygwin,如何重新启动 ssh 反向隧道而不会出现转发问题“警告:远程端口转发失败”消息?

使用 cygwin,如何重新启动 ssh 反向隧道而不会出现转发问题“警告:远程端口转发失败”消息?

我有这个命令ssh -R 50500:127.0.0.1:5900 user@myip 并且它将我登录到我的 ssh 服务器。

这个想法是,我有一台想要查看的计算机和一台作为查看者的计算机。计算机 myip 是中介,即托管的 VPS。

因此被查看者运行命令 viewed$ ssh -R 50500:127.0.0.1:5900 user@myip<ENTER>

观众运行命令viewer$ ssh -L 1234:127.0.0.1:50500 user@myip<ENTER>

然后从查看器计算机,我将 VNC 查看器连接到 127.0.0.1:1234

一切进展顺利。

直到发生某些事情,VNC 无法连接。我已经把查看过的电脑开走了,所以我看不到屏幕,但我猜想可能的原因是什么。查看过的机器的互联网连接很差,没有固定电话,所以我有一个带移动 SIM 卡的路由器。我有一种感觉,连接可能不时会中断。

所以我尝试的是这个

$ while true; do ssh -R 50500:127.0.0.1:5900 user@myip; done

如果我尝试一下,它能工作,然后我回家,它可能仍然能工作。但最终,它不起作用。。所以那行可能有点帮助,但我仍然面临类似的问题,即 VNC 连接一段时间,然后无法连接。

于是我开车来到被查看的计算机的位置,查看了被查看的计算机。我看到了一些这样的消息

user@vps:~# client_loop: send disconnect: Connection reset by peer
Warning: remote port forwarding failed for listen port 50500
Welcome to Ubuntu 20.04.4 LTS (GNU/Linux 5.4.0-113-generic x86_64)
...
*** System restart required ***
Last Login...

“client_loop: send disconnect: Connection reset by peer” 中的“loop”一词并不神秘。Tight VNC Viewer 正在执行 127.0.0.1:1234 以最终连接到 TightVNC 服务器,这很好。

但现在我知道了为什么 VNC 无法连接。它无法工作,因为被查看的计算机上的命令需要在没有该“警告”错误/导致该“警告”错误的原因的情况下运行!

当 VNC 连接不通时,这是因为“被查看”端的转发功能不起作用。这是一个严重的问题!

我想知道是否是因为连接不稳定,并且当连接暂时中断时没有完全断开。

我该怎么做才能解决导致该“警告”错误并进行连接的原因?

我不确定是 SSH -L 失败了还是 SSH -R 失败了,或者两者都失败了。不过我认为可能是 SSH -R 失败了,因为有关转发错误的消息出现在所查看的计算机上(在 cygwin 窗口/控制台中)。

答案1

我认为如果我能终止一个不需要的已建立连接它可能会有所帮助。

这可以在这里完成,因为我知道每个连接都有自己的 SSHD 进程。

我看不到哪些连接是 SSH -L 或 SSH -R。

SSH -R 命令创建的连接让我遇到了问题。

我想要结束该连接的进程 ssh 和 sshd。

该命令netstat -atnp显示连接、PID 和进程名称。

SSH -R 命令在 netstat, -atnp 上创建两个列表,一个是端口 22,另一个是监听端口 50500。我可能在端口 22 上还有其他连接。但是,如果我杀死与监听端口 50500 相关的 PID,它会通过杀死与其相关的 sshd 进程来断开与 SSH -R 相关的连接。

从 SSH 服务器。

user@comp:~# netstat -atpn
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:50500         0.0.0.0:*               LISTEN      199414/sshd: root
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      592/systemd-resolve
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      196970/sshd: /usr/s
tcp        0      0 164.....:22        213.....:52504   ESTABLISHED 199414/sshd: root
tcp        0      0 164.....:22        213......:43830   ESTABLISHED 198992/sshd: root@p
..
user@server:~#

该命令$kill -9 199414将中断 SSH -R 连接。(不需要终止更多进程,因此之后不需要列出其他 PID)

为了确保该连接的 sshd 和 ssh 都被终止..

/etc/sshd/sshd_config我的文件中有这些行

user@server:~# grep -i client /etc/ssh/sshd_config
#ClientAliveInterval 0
#ClientAliveCountMax 3
ClientAliveInterval 10
ClientAliveCountMax 1
# Allow client to pass locale environment variables
user@server:~#

因此,每 10 秒 sshd 会检查客户端是否存在,如果不存在,则会断开连接。这应该可以很好地处理客户端 IP 发生变化的可能性!

我在客户端有这些行,`/etc/ssh_config,计算机正在执行 SSH -R

$cat /etc/ssh_config ...

ServerAliveInterval 10
ServerAliveCountMax 1

因此每 10 秒它就会向服务器发送一个信号,如果服务器关闭,则 ssh 客户端应该退出。

我在客户端上也有这个 SSH -R 命令

$ while true; do echo abc && date && python logtheip.py && ssh -N -R 50500:127.0.0.1:5900 root@164.... ;done

logtheip.py 的代码类似于此人所拥有的https://gist.github.com/giammin/d174c0db2b39dcf2ba68f8b3df02f4f9 我从https://unix.stackexchange.com/questions/277703/how-to-track-my-public-ip-address-in-a-log-file 它将 IP 与日期/时间一起写入日志文件。

ssh -R 之前的回显显示 ssh 可执行文件已退出并且循环已迭代。

相关内容