使用 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 可执行文件已退出并且循环已迭代。