在服务器启动时启动 ssh 隧道

在服务器启动时启动 ssh 隧道

我正在运行 Centos stream,每次启动服务器后我都必须运行此命令行:

ssh -L 0.0.0.0:9944:localhost:9922 localhost -N

运行此命令后,操作系统将要求我以 root 身份登录(即使我已经以 root 身份登录),之后一切都正常。

我的问题:我想在重启时将此代码添加到 cronjob 中,例如:

@reboot root ssh -L 0.0.0.0:9944:localhost:9922 本地主机 -N

但是它不起作用。我认为它要求输入密码,但没有人输入密码(当然)。那么我该如何解决这个问题?

答案1

不要使用 cron 执行此操作。最好添加一个系统服务。例如,对于类似的问题,我使用如下所示的单元文件:

[Unit]
Description=forward public port 9944 to local 9922 with SSH
After=network-online.target
Wants=network-online.target

[Service]
ExecStart=ssh -i /root/.ssh/forwarder -g -L 0.0.0.0:9944:localhost:9922 localhost -o ExitOnForwardFailure=yes -N
Restart=always
RestartSec=60

[Install]
WantedBy=multi-user.target

将其保存为/etc/systemd/system/ssh-forward-9944-to-9922.service并执行

systemctl enable ssh-forward-9944-to-9922.service
systemctl start ssh-forward-9944-to-9922.service

注意我添加了转发失败时退出选项,因此如果有东西声称移植 systemd 将正确识别该单元失败。还请注意全局绑定选项,实际上接受来自其他主机的连接,因为尽管您尝试将其绑定到0.0.0.0,但除非您使用启用它,否则它将不起作用-g

最后,您必须正确设置密钥。上面的单元文件构造为 ssh 客户端将以 root 身份运行,并以 root 身份连接到 localhost,这意味着您需要在 中拥有PermitRootLogin yes或更好PermitRootLogin prohibit-password(默认,与旧拼写相同without-password/etc/ssh/sshd_config。必须将私钥存储在未加密/root/.ssh/forwarder公钥应该放入/root/.ssh/authorized_keys

最好使用专用密钥,使用以下方式生成

ssh-keygen -t ed25519 -f /root/.ssh/forwarder

(点击<Enter>两次则无需密码)。然后将公共副本的内容附加authorized_keys

cat /root/.ssh/forwarder.pub >> /root/.ssh/authorized_keys

编辑/root/.ssh/authorized_keys以严格限制此键(最后一行),类似于以下内容:

restrict,port-forwarding,command="/bin/false" ssh-ed25519 AA[key contents follows]7b localhost port forwarder

只需在最后一行之前添加这个restrict,...魔法咒语ssh-ed25519 ...即可。您可以进一步增强它,例如,添加from="127.0.0.1,::1",permitopen="127.0.0.1:9922",permitopen="[::1]:9922"到限制列表中(尽管我不确定此文件中 IPv6 地址的拼写是否正确);请阅读man authorized_keys以了解详细信息。

相关内容