我正在使用autossh
私钥打开反向 SSH 隧道。隧道用户的 shell 已经rssh
并被验证为工作正常。
我遇到的问题是这样的,无论 ClientAliveInterval ( 15
) 和 ClientAliveCountMax ( 3
) (sshd
默认值)如何,在客户端,隧道是通过以下方式打开的:
exec autossh -N \
-o "ServerAliveInterval 60" \
-o "ServerAliveCountMax 3" \
-o "StrictHostKeyChecking no" \
-R ${tunnel_port}:localhost:22 \
-i ./tunnel \
-v \
tunnel@directory.mytunnelhost.com
Run Code Online (Sandbox Code Playgroud)
在${tunnel_port}
来自一个小curl
的呼叫看起来隧道主机上的空闲端口,该端口不会改变(它是基于请求对话框的MAC地址分配)
问题是在TERM
启动隧道客户端时,端口在主机上一直被占用,而 sshd 进程继续运行:
我也无法通过隧道登录机器:
ubuntu@ip-10-252-138-233:~$ ssh -p 39777 pi@localhost
ssh: connect to host localhost port 39777: Connection refused
Run Code Online (Sandbox Code Playgroud)
我想知道我能做些什么来使隧道更可靠,以确保当任一端发生故障时,它已经完全死机,被拆除并且不能进入“损坏”状态。
如果我通过端口 80 或类似端口建立隧道,我可以编写一个check
脚本(这个守护进程runit
以,我不知道客户如何知道隧道是否真的在运行而不是在运行?
我想你在这里有两个问题。
首先是如何确保一旦客户端断开连接,服务器 sshd 进程就会终止,从而释放端口。如果客户端断开连接,那么我不知道为什么服务器进程会挂起,除非它们可能有子进程,但您的屏幕截图显示它们没有。如果客户端没有断开连接,只是停止响应,则服务器进程应在大约 ClientAliveInterval*ClientAliveCountMax 秒后终止。
其次是客户端如何判断隧道是否工作。这就是 autossh 的端口监控功能的作用。如果您将eg添加-M 20000
到对autossh的调用中,它将设置端口转发以将流量发送到端口20000上的远程主机,并在端口20001上接收它。它将尝试每隔AUTOSSH_POLL秒(默认600秒)围绕环路发送流量),如果检测到连接已停止工作,则终止它并启动新的 ssh 连接。
-M
如果 ssh 未正确终止,则将开关添加到 autossh 调用中,并可能将 AUTOSSH_POLL 设置得较低(例如 30)可能会有所帮助。
归档时间: |
|
查看次数: |
3942 次 |
最近记录: |