我在 Azure 上运行的 Ubuntu 虚拟机上运行各种服务,我想远程访问某些服务,即使端口没有公开开放。为此,我设置了一个脚本来使用 SSH进行本地端口转发。
通常这是通过启动到远程主机的连接,执行sleep 10,并在 sleep 命令完成之前在转发的端口上建立连接来工作的。这在使用保持连接活动的服务时很有效,例如远程 SMB 共享。
但是我在访问 Web 服务时遇到问题,因为连接在一段时间后关闭 - 建立连接后 10-90 秒。
为了在它关闭时重新连接连接,我根据这个SO 线程编写了这个小脚本。
while true; do { \
while true; do \
echo echo ping; sleep 10; \
done } | ssh -f myapp.cloudapp.net -F .ssh/myapp.cloudapp.net_config \
-o ExitOnForwardFailure=yes sleep 10; echo "$(date) I died";
sleep 1;
done
Run Code Online (Sandbox Code Playgroud)
不幸的是,这个“修复”有点不稳定,并且连接经常断开,因此浏览器每五个请求就会挂起。它有效,但远非完美,所以我想要一个更好的方法。也许可能有某种脚本进行长轮询之类的?有谁解决了这个问题?
我已经设置了几个 100 个嵌入式盒子,通过打开反向 ssh 隧道来联系总部,每个盒子都在一个新端口下。这基本上工作正常,但今天我遇到了通过低带宽(或低质量?)GPRS 连接使用隧道的问题。
打开隧道的远程机器通过(目前未知的)3G 路由器连接到互联网,该路由器可能只有 GPRS,最多是 EDGE 连接。
登录到我的计算机,我可以看到ssh端口 1234 上的传入连接:
me@machine:~$ sudo nmap -sS -p 1234 --open localhost
Starting Nmap 5.21 ( http://nmap.org ) at 2014-11-27 15:27 CET
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000070s latency).
Hostname localhost resolves to 2 IPs. Only scanned 127.0.0.1
PORT STATE SERVICE
1234/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds
me@machine:~$
Run Code Online (Sandbox Code Playgroud)
现在,尝试打开 ssh 连接时出现错误Connection timed out: …
注意:这篇文章不是SSH 远程端口转发失败的重复。这里的问题不是导致端口转发(暂时)失败的原因,我们知道它是什么。问题是如何删除损坏的 sshd 端口绑定。谢谢。
我有一台具有动态 IP 的服务器 A,运行 autossh,以维护到具有静态 IP 的计算机 B 的反向隧道。下面的代码工作正常:
autossh -M 0 -q -N -R2222:localhost:22 -o ServerAliveInterval 60 -o ServerAliveCountMax 3 -o ExitOnForwardFailure yes USER@B -p PORT
Run Code Online (Sandbox Code Playgroud)
然而,当由于 A 的 IP 更改而导致连接崩溃时,需要“很长”的时间(比如一个小时)才能恢复连接。这是因为来自机器 B 的 sshd 仍然监听端口 2222,从而阻止了 ssh(来自机器 A)在崩溃后绑定端口 2222。
B 的 auth.log 包含数十条:
Accepted publickey for USER from A port SOMEPORT ssh2: ED25519 XXXXXXXX
error: bind: Address already in use
error: channel_setup_fwd_listener_tcpip: cannot listen to port: 2222 …Run Code Online (Sandbox Code Playgroud)