在启动时进行自动反向SSH连接


9

我有一台位于NAT后面的PC,该PC与我的Digitalocean VPC建立了反向SSH连接。我在家中利用这种反向的SSH连接登录到我的办公室PC(我被授权这样做)并复制文件并做其他重要的事情。

尽管不是很经常,但我注意到我的办公室PC重新启动(由于电源故障等),并断开了与VPC建立的反向SSH连接。在这种情况下,我无法从家用PC连接到办公室PC。

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

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

重新启动后,由于我不在物理上,因此无法在办公室PC上再次运行该脚本。为了解决此问题,我安装了以下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

这些也没有执行。

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


我不太确定您在这里遇到什么问题。cron不开始工作吗?还是脚本不起作用?遇到这两个问题时,请查阅日志。Cron应该写信给/var/log/cron*。出于测试目的,您可以简单地编写类似内容*/2 * * * * /path/to/script-它每2分钟运行一次脚本。另外,请检查运行cron的用户的邮件。是根吗?使用mail命令。哦,可以看到您正在使用ssh键?我怀疑如果您在-i切换后不提供完整的路径,cron作业是否能够找到它。
Kalavan '16

Answers:


8

我不确定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

然后以超级用户身份运行以下命令:

systemctl enable autossh.service

1

您可以尝试以下几种方法:

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

抱歉,这是一个错误。我确实尝试过'24 12 * * * /home/user/rev.sh',但是它仍然可以工作。令我惊讶的是,“ 24 12 * * *重新启动”甚至都没有起作用。
丹尼斯

1
除非您以root身份调用,否则重启肯定不会起作用。
slowko

我尝试添加/ usr / bin / autossh。那没起效。
丹尼斯

我尝试在根crontab中重启24 12 8 * * *。那没起效。它对您有用吗?
丹尼斯

/usr/bin始终为默认值PATH,即使是cron
roaima

1

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

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

因此,您可以通过多种方式使其运行,但是我认为可以在crontab中以ubuntu-user身份运行脚本。

编辑:

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



0

由于问题中没有太多数据,因此我将从头开始做

我将所有配置都放在/ 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条目(更好的新贵/系统服务),如下所示:

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

0

在没有终端的情况下运行时,需要使用-f运行命令。所以这是一个例子:

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
user@www.hostname.com \
sleep 31536000

-f将其放置在后台,但是将其放置在后台意味着ssh将连接,然后在完成任务后立即断开连接。所以你需要一个任务。

睡眠31536000告诉ssh在连接后运行“睡眠”一年。在此期间,您的隧道将保持上行。

如果不运行命令,则ssh将连接并在端口2205上设置反向隧道,完成此操作后,它将退出。使用autossh,如果连接失败,它将重新连接并重新启动睡眠。即使互联网连接非常稳定,我怀疑一年是否会实现。

顺便说一句-与其他小丑不同,我知道此方法可行,因为我实际上进行了测试,因为我当然在做类似的事情,并且由于我现在可以使其工作非常可靠,所以我可以为您提供正确的答案。

-f和“命令”

那就是你所缺少的。


1
我认为我们不需要在这里给其他人起名字。
Jeff Schaller

1
我不叫别人名字。我要指出的是,以前提出的解决方案从未被提出过这些建议的人尝试过。不相信我吗?试试看
Jimminy Doe

1
我也不认为您已经解决了问题的要点-OP声称此方法有效100%。我相信他们的问题集中在PC重新启动后以自动方式运行脚本。
杰夫·谢勒

1
如果他在上班,他可以设置反向隧道到家,因为OP在终端中运行-这在100%的时间内都有效。如果ssh(和autossh)程序没有与该进程关联的终端,则它们的行为会有所不同。他在使crontab(不带终端运行)重新连接隧道时遇到问题,正是因为他没有使用-f,即使他使用了ssh,一旦建立了隧道 ssh也会退出,而不运行任何东西-就我而言,睡觉一年。在脚本中,-f必须与COMMAND一起使用,以防止SSH退出。那是他的问题。
Jimminy Doe

1
我想是杰夫·谢勒(Jeff Schaller)给予我的支持,给出正确的解决方案并进行实际测试的原因。除了要设置要通过防火墙的PI,启动rdesktop并将其提供给对Linux一无所知的办公室经理使用外,我基本上与他进行相同的设置。 。可以肯定的是,我有一个防弹解决方案,因为我现在正在使用它,并且我已经远程重启了pi和本地电缆调制解调器-为了安全起见。.但是,别让正确的答案进入过分的,自发的自我的方式。
吉米妮(Jimminy Doe),
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.