我正在运行 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
以了解详细信息。