autossh、systemd、MySQL 的 ssh 隧道

autossh、systemd、MySQL 的 ssh 隧道

我想使用systemd创建一个 SSH 隧道以允许访问MySQL。我希望在我注销后其他用户可以使用此连接。我知道我遇到了问题,因为系统日志(Ubuntu 18.04LTS)充满了消息,告诉我它autossh不断重新启动 ssh(见下文)。因此,SSH 隧道的使用失败。

以下是我想做的事情。系统上有一个 MySQL 服务器Y.example.comMySQL文档建议 SSH 隧道是允许从另一台机器连接的最佳安全方式。我以前从未创建过隧道,但它看起来很有趣。

这部分有效

包含要从中拉取的应用程序的机器MySQL称为X。我发现我可以以交互方式运行以下命令(以用户 autossh 身份)来打开隧道:

$ ssh -L 3306:127.0.0.1:3306 [email protected] \
-i /home/autossh/.ssh/PJ-nopass -NnT

为了方便使用,我在两个系统上都创建了一个用户autossh。之后,在 X 上,我可以以任何用户身份访问 MySQL 服务器,就像在该系统上一样。为了验证从 X 访问 MySql,我运行

$ mysql -h 127.0.0.1 -u testacct -p testdb

哇。太神奇了。就 MySQL 而言,我已登录Y

然后我对自己说,“这还不够,因为当我注销时隧道会中断”。我一开始没有找到解决方案,但我发现 处理了相关问题autossh。也许将 SSH 纳入systemd配置就足够了。但是,我不明白这一点。当我找到这些autossh页面时,它们最初是关于将其包装成systemd服务。可能有一些很好的理由将它们包装在一起(https://unix.stackexchange.com/q/423795/73319

Autossh 基本上是一个脚本,当 ssh 连接失败时会重新启动。它不是守护进程,但看起来很像守护进程。以交互方式运行此脚本也会成功创建 SSH 隧道(就ssh我所知,与运行上述命令效果相同):

$ autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" \
-L 3306:127.0.0.1:3306 [email protected] -i \
/home/autossh/.ssh/PJ-nopass -NnT -f

现在,如何在我注销后运行它?这是一个价值百万美元的问题。建议是我应该将其包装到 systemd 服务中。以下是我找到该建议的来源:

https://dadhacks.org/2017/11/08/set-up-autossh-with-systemd/

http://logan.tw/posts/2015/11/15/autossh-and-systemd-service/

https://www.everythingcli.org/ssh-tunnelling-for-fun-and-profit-autossh/

为了尽可能简单,这是我的 /etc/systemd/system 中的服务文件:

[Unit]
Description=autossh
After=network-online.target

[Service]
Type=simple
User=autossh
ExecStart=/usr/bin/autossh -M 0 -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -L 3306:127.0.0.1:3306 [email protected] -l autossh -i /home/autossh/.ssh/PJ-nopass -NnT -f
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target

这是我想修复的问题的症状:SSH 隧道不断关闭和打开,并且保持打开状态的时间不够长。/var/log/syslog 充满了这种噪音(成千上万个):

Jun 15 21:05:23 X systemd[1]: autossh-mysql.service: Service hold-off time over, scheduling restart.
Jun 15 21:05:23 X systemd[1]: autossh-mysql.service: Scheduled restart job, restart counter is at 6765.
Jun 15 21:05:23 X systemd[1]: Stopped autossh.
Jun 15 21:05:23 X systemd[1]: Started autossh.
Jun 15 21:05:23 X autossh[38881]: port set to 0, monitoring disabled

这种情况每分钟都会出现。用户访问数据库的努力大多会失败。

我又在 Google 上搜索了一下(这很危险,你从我之前的供词中就可以看出来……)并得出了一个结论,我的 systemd 服务文件的问题在于子进程正在运行并结束,从而导致重新启动。我不明白这怎么可能autossh

一个修复方法(有效!)是将其添加到 systemd 服务文件中

RemainAfterExit=yes

显然,这不是很好,因为 systemd 没有注意到程序何时失败。哦,好吧。为什么它会“起作用”,我为什么需要它?

上周五一切似乎都运行良好,但我周一来的时候,日志里全是噪音。

版本信息:

autossh 1.4e-4
systemd 237-3ubuntu10.4 amd64 openssh 服务器 1:7.6p1-4ubuntu0.3

相关内容