在启动时自动建立反向 SSH 连接

在启动时自动建立反向 SSH 连接

我有一台位于 NAT 后面的 PC,它与我的 Digitalocean VPC 建立反向 SSH 连接。我利用这种反向 SSH 连接从家里登录到我的办公室 PC(我有权这样做)并复制文件并执行其他重要操作。

虽然不常见,但我注意到我的办公室 PC 重新启动(由于电源故障等)并中断了它与我的 VPC 建立的反向 SSH 连接。在这种情况下,我无法从家庭电脑连接到办公室电脑。

我运行以下脚本来进行反向连接+动态代理,以匿名化我在办公室电脑上生成的流量(因为我不需要共享浏览信息)。

autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC

我无法在重新启动后在我的办公室电脑上再次运行该脚本,因为我实际上并不在那里。为了解决这个问题我安装了以下crontab。

注意:rev.sh文件包含以上行。证书“digitalOcean”和 rev.sh 位于Ubuntu home.因此,当我./rev.sh在 Ubuntu 终端中执行时,我获得了一个动态代理,并且还可以访问 ym DigitalOcean 服务器。这个方法100%有效。

但是,当我按照以下方法安装 chrontab 时,我的 ubuntu PC 永远不会创建动态代理。我可以看到这一点,因为当我从 Google Chrome 检查此代理时,它说代理拒绝连接。

以下是我作为根 cronejobs 尝试过的 cronejobs。我也以普通用户的身份尝试过这些,但仍然不起作用。

@reboot bash /home/user/rev.sh 
@reboot /home/user/rev.sh 
@reboot cd /home/user && ./rev.sh

然后我在当前时间前几分钟安装了一个 chrontab 并等待它执行。

24 12 8 * * * bash /home/user/rev.sh
24 12 8 * * * /home/user/rev.sh

这些也没有执行。

请好心帮助我发现我的错误。这个网站上有很多关于我的问题的类似问题。因此我提到了很多答案,但似乎没有一个有帮助。

答案1

我不确定cron在启动时运行脚本是否是一个好主意。我认为更合适的另一种选择是创建 SystemD 服务,如下所述这里. 创建一个名为的文件/etc/systemd/system/autossh.service

[Unit]
Description=Auto Reverse SSH
Requires=systemd-networkd-wait-online.service
After=systemd-networkd-wait-online.service
[Service]
ExecStart=/full/path/to/autossh -CD 8080 -i digitalOcean -R 8081:localhost:22 root@IPofDigitalOceanPC
[Install]
WantedBy=multi-user.target

然后以 root 身份运行以下命令:

systemctl enable autossh.service

答案2

您可以尝试以下几件事:

chmod +x rev.sh

有时您的路径在启动时或通过 cronjobs 未完全设置,因此在我的系统上将 autossh 替换为完整路径

/usr/bin/autossh

@reboot 主题取决于 cron 守护进程的启动时间,因此它可能会在其他子系统(网络?)启动并运行之前被调用

还有你的 crontab 示例:

24 12 8 * * * bash /home/user/rev.sh

只会在每个月的8号调用。它有一个额外的字段。尝试

24 12 * * * /home/user/rev.sh

答案3

看来,当通过 crontab 执行脚本时,它找不到您的证书。

当您作为用户执行脚本时,它使用 /home/ubuntu-user/.ssh/... 中的证书。但是,当从 crontab 执行脚本时,它会以 root 身份运行。 root 从 /root/.ssh 获取证书

所以你有多种方法可以让它工作,但我认为运行脚本crontab 中的 ubuntu 用户可以。

编辑:

确保提供证书的完整合格路径

答案4

由于问题中没有太多数据,我将从头开始我会做什么

我会将所有配置放在 /etc/ssh/ssh_config 中:

 Host mytunnel
    HostName      IPofDigitalOcean
    User          root     # Are you sure about this??
    IdentityFile  /etc/ssh/mytunnel_key
    RemoteForward 8081 localhost:22
    DynamicForward 8080

我会把钥匙放进去/etc/ssh/mytunnel_key

然后我会尝试使用 cron 条目(一个新贵/systemd 服务会更好),如下所示:

@reboot /usr/bin/autossh -f -M 0 -T -N mytunnel

相关内容