/etc/inittab 中的 autossh

/etc/inittab 中的 autossh

我已经设置了 ssh 隧道以便能够连接 NAT 后面的目标计算机。我已将以下内容放入计算机上的 /etc/inittab 中:

tu:2345:respawn:/usr/bin/autossh -M 20000 -f -n -N -T -R 6790:localhost:22 [email protected]

它有效,即我可以通过发出 ssh -p 6790 me@localhost 进行连接。但我时不时地在目标计算机上收到以下消息:

INIT: Id "tu" respawning too fast, disabled for 5 minutes

在服务器上的 /var/log/secure 中,我可以看到以下内容:

Oct 29 03:11:15 vm sshd[19725]: Accepted publickey for me from 90.179.155.74 port 37416 ssh2
Oct 29 03:11:15 vm sshd[19727]: Received disconnect from 90.179.155.74: 11: disconnected by user
Oct 29 03:17:04 vm sshd[20892]: Accepted publickey for me from 90.179.155.74 port 40116 ssh2
Oct 29 03:17:15 vm sshd[20896]: error: bind: Address already in use
Oct 29 03:17:19 vm sshd[20896]: error: channel_setup_fwd_listener: cannot listen to port: 20000

这样的情况还在继续。知道会出什么问题吗?

答案1

好的,找到答案了。如果使用 -f 选项调用 autossh,它会将自身分叉为守护进程,并且父进程退出。因此 init 再次重生它......一次又一次......

我认为我不应该使用 autossh,而只是 ssh,因为重生是由 init 完成的,我想,不需要由 autossh 进行另一次自动重生。我将行更改为 tu:2345:respawn:/usr/bin/ssh -n -N -T -R 6791:localhost:22 [email protected]

我还添加了

ServerAliveInterval 15
ServerAliveCountMax 2

进入 /etc/ssh/ssh_config 以保持连接处于活动状态。

我认为这个设置可能效果很好。

答案2

如果使用good oldssh而不是autossh像你自己的答案中所说的那样效果很好,那就太好了,你可以停止阅读。

我已经多次遇到这样的情况:无论进行多少 ssh/sshd 配置调整都无济于事,有时我值得信赖的隧道会悬挂而不是善意地崩溃,无论如何。在所有这些情况下,autossh它都发挥着魅力。

因此,如果您最终返回到autossh,这就是我如何使用它。inittab我不是在会话中运行它,而是在screen会话中运行它。创建一个简单的脚本,我们称之为autossh.sh

#!/bin/sh
tunnelsite=autossh-host1
if ! screen -ls | grep -F .$tunnelsite >/dev/null; then
    screen -d -m -S $tunnelsite autossh -N $tunnelsite
fi

该脚本只是检查是否有给定名称的屏幕会话已在运行,如果是则退出,否则创建它。

安排一个 cron 作业定期运行:

*/15 * * * * AUTOSSH_PORT=0 /path/to/autossh.sh

AUTOSSH_PORT=0只是为了解决我在 Mac OS X 上遇到的一个奇怪问题。您可以忽略它,但我也在 Linux 中使用此方法,没有任何问题。

最后,一个安全提示:除非您已经这样做,否则我使用专用的 ssh 密钥通过 autossh 验证隧道,并使用.ssh/authorized_keys以下选项限制密钥授权:

command="/bin/false",no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAA...

这样,即使您的密钥被泄露,它也只能用于创建隧道。

实际上我在 GitHub 上有一个脚本项目可以让这个设置变得更容易。https://github.com/janosgyerik/autossh-tunnel

相关内容