我在工作时使用 SSH 隧道绕过各种愚蠢的防火墙(我的老板对此表示同意 :))。问题是,一段时间后 ssh 连接通常会挂起,隧道也会断开。
如果我至少可以自动监控隧道,我可以在隧道挂起时重新启动它,但我还没有想出办法来做到这一点。
当然,如果有人能告诉我如何防止我的 ssh 连接挂起,我将获得加分!
答案1
答案2
Systemd 非常适合这种情况。
创建包含以下内容的服务文件/etc/systemd/system/sshtunnel.service
:
[Unit]
Description=SSH Tunnel
After=network.target
[Service]
Restart=always
RestartSec=20
User=sshtunnel
ExecStart=/bin/ssh -NT -o ServerAliveInterval=60 -L 5900:localhost:5900 user@otherserver
[Install]
WantedBy=multi-user.target
(修改 ssh 命令以适应)
- 这将以用户身份运行
sshtunnel
,因此首先确保该用户存在 systemctl enable sshtunnel
将其设置为在启动时启动的问题systemctl start sshtunnel
立即开始发行
2018 年 1 月更新:一些发行版(例如 Fedora 27)可能使用 SELinux 策略来阻止 systemd init 使用 SSH,在这种情况下需要创建自定义策略来提供必要的豁免。
答案3
所有状态防火墙在一段时间内未看到该连接的数据包后都会忘记该连接(以防止状态表充满两端未关闭连接而断开的连接)。大多数 TCP 实现会在很长时间未收到来自另一端的消息后发送一个保持活动数据包(通常为 2 小时)。但是,如果状态防火墙在发送保持活动数据包之前忘记了该连接,则长期存在但空闲的连接将会断开。
如果是这种情况,解决方案是防止连接空闲。OpenSSH 有一个名为服务器存活间隔它可用于防止连接空闲时间过长(作为额外好处,即使连接处于空闲状态,它也会尽早检测到对等方何时死亡)。
答案4
在您自己的 Mac 或 Linux 机器上配置您的 ssh,使服务器 ssh 每 3 分钟保持活动状态。打开终端并进入您家中不可见的 .ssh:
cd ~/.ssh/
然后创建一个只有一行的配置文件:
echo "ServerAliveInterval 180" >> config
您还应该添加:
ServerAliveCountMax xxxx (high number)
默认值为 3,因此 ServerAliveInterval 180 将在 9 分钟后停止发送(ServerAliveInterval 指定的 3 分钟间隔中的 3 分钟)。