oli*_*ren 6 port-forwarding ssh-tunnel
我在 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)
不幸的是,这个“修复”有点不稳定,并且连接经常断开,因此浏览器每五个请求就会挂起。它有效,但远非完美,所以我想要一个更好的方法。也许可能有某种脚本进行长轮询之类的?有谁解决了这个问题?
siv*_*ann 13
使用autossh。它作为一个包存在,无需您编写脚本即可处理所有这些。还要在 ssh 配置文件中配置 Keepalive 和 ClientAliveInterval 和 ServerAliveInterval。选项类似于 ssh,但它会自动处理断开的连接。
例如,启动反向隧道(并保持运行):
server_behind_fw # autossh -M 20000 -f -N your_public_server -R 1234:localhost:22 -C
Run Code Online (Sandbox Code Playgroud)
进而:
your_public_seerver # ssh -p 1234 localhost
Run Code Online (Sandbox Code Playgroud)
将您通过 ssh 连接到 server_behind_fw。
在这里添加我自己的答案,因为实际上没有人为我的情况提供明确的解决方案。但这基本上是@sivann 的答案根据我的具体情况进行了修改。所以如果对你有帮助,就给他点个赞吧!
# This forwards all requests to my local 39000 port to port 8080 on the server
LOCAL_PORT=39000
REMOTE_PORT=8080
SERVER=myapp.cloudapp.net
autossh -M20000 -N -L $LOCAL_PORT:$SERVER:$REMOTE_PORT myuser@$SERVER
Run Code Online (Sandbox Code Playgroud)
到目前为止,与我在上面拼凑起来的黑客脚本相比,这已经证明是稳定的。
如果你想将配置保存在每个服务器的文件中,它看起来像这样
Host myapp.cloudapp.net
User myuser
LocalForward 127.0.0.1:39000 localhost:8080
ServerAliveInterval 5
Run Code Online (Sandbox Code Playgroud)
autossh -M 12345 -N -F $HOME/.ssh/config_myapp.cloudapp.net 192.168.10.2
| 归档时间: |
|
| 查看次数: |
22965 次 |
| 最近记录: |