我正在尝试通过大学的计算机从家里使用 SSH 隧道,以便我可以访问一些文章。
两台机器都运行 Ubuntu 11.04。大学的机器运转起来openssh-server
。
在家里我遵循以下指示:
打开 ssh 会话:
ssh -D 9999 -C user@my_addr.com
然后我将 Firefox 配置为在 端口上使用 SOCKS5
9999
连接localhost
。
这在一段时间内有效。然后,它突然挂起连接,终端就冻结了。
我在这里缺少什么?
答案1
您可以尝试设置客户端活动间隔和最大客户端存活数将 sshd 配置文件中的变量更改为适合您的值。
从手册中:
ClientAliveInterval
Sets a timeout interval in seconds after which if no data has been received
from the client, secshd will send a message through the encrypted channel
to request a response from the client.
The default is 0, indicating that these messages will not be sent to the
client. This option applies to protocol version 2 only.
答案2
尝试autossh
。它检测挂起的连接并自动重新连接。我过去在类似的情况下使用过它,它对我来说效果很好。
编辑
我曾经在 中运行它
screen
,这有两个好处:在后台运行(某种程度上),并且可以稍后返回到会话以检查其状态并在必要时进行调试,如下所示:screen -d -m -S my-autossh-tunnel autossh your_autossh_args
这将在后台启动屏幕。如果您想检查进程
autossh
,可以screen
使用以下命令重新连接到此会话screen -R my-autossh-tunnel
为了方便起见,我使用了空密码,但为了增加安全性,我在远程端的authorized_keys中使用了以下选项:
command="/bin/false",no-agent-forwarding,no-X11-forwarding,no-pty`
这样就可以用密钥建立隧道,并且外壳不能被滥用于其他用途。
答案3
我还建议将 autossh 与 while 脚本一起使用,例如:
我在 crontab 中有这个:
@reboot while true; do sleep 10; autossh -i /some/location_not_default.pem -D 9999 -L 1028:localhost:3128; done
while会一直尝试连接,并建立连接,创建socks端口,并转发squid端口。事实证明这对我来说非常稳定。
答案4
我在通过 SSH 隧道使用 VNC 时遇到了同样的问题。对于 putty (windows) 和 openssh (linux) 来说,冻结现象经常发生。
使用腻子,我复制了连接配置文件并更改了一些选项,只是为了看看发生了什么,并且不再冻结! putty的变化是:
连接:取消选中“禁用 Nagle 算法”(我选中“启用 TCP keepalives”并将“keepalives 之间的秒数”设置为 30)选择“互联网协议版本”IPv4(而不是“自动”)
连接 - SSH:选中“启用压缩”
我不确定什么选择可以解决这个问题,但我现在是一个快乐的露营者。我无法让它冻结,但是当我切换回旧配置文件进行检查时,它在几秒钟内就冻结了。
冻结主要发生在通过 VNC 发送大型更新时,例如滚动窗口。也许禁用的 Nagle 算法会用太多小数据包淹没服务器,或者可能是因为在远程 VNC 服务器上禁用了 ipv6,但在其他主机上未禁用。需要对各个选项进行更多测试才能弄清楚这一点。