起動時に自動リバースSSH接続を行う


9

Digitalocean VPCへのリバースSSH接続を行うNATの背後にPCがあります。私はこの逆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.shUbuntuターミナルで実行すると、動的プロキシを取得し、ym DigitalOceanサーバーにアクセスします。この方法は100%機能します。

ただし、次の方法でchrontabをインストールすると、ubuntu PCが動的プロキシを作成しません。Google Chromeからこのプロキシを確認すると、プロキシが接続を拒否していると表示されているので、これを確認できます。

これが私がルーツのクローンジョブとして試したクローンジョブです。私もこれらを通常のユーザーとして試しましたが、それでも機能しませんでした。

@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

これらも実行されませんでした。

私が間違いを見つけられるように親切にしてください。私の問題について、このWebサイトには同様の質問がたくさんあります。私はそれゆえ多くの答えを参照してきましたが、それらのどれも役に立たないようでした。


ここで何が問題なのかよくわかりません。cronはジョブを開始していませんか?またはスクリプトが機能していませんか?両方の問題が発生した場合は、ログを参照してください。Cronはどこかにを書き込む必要があります/var/log/cron*。テスト目的の場合は、次のように単純に記述できます*/2 * * * * /path/to/script。2分ごとにスクリプトが実行されます。また、cronを実行しているユーザーのメールを確認してください。それは根ですか?mailコマンドを使用します。ああ、sshキーを使用していることがわかりますか?-i切り替え後に完全なパスを指定しないと、cronジョブがそれを見つけることができないと思います。
カラバン2016年

回答:


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 * * *リブート」すらうまくいきませんでした。
Denis

1
rootとして起動しない限り、リブートは確実に機能しません。
slowko 2016年

/ usr / bin / autosshを追加してみました。それは動かなかった。
Denis

24 12 8 * * *ルートのcrontabで再起動してみました。それは動かなかった。それはあなたのもので動作しますか?
Denis

/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エントリを試してみます(upstart / systemdサービスの方が適しています)。

@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が接続し、タスクが完了するとすぐに切断されます。したがって、タスクが必要です。

sleep 31536000は、sshに接続後1年間「スリープ」するように指示します。この間、トンネルは稼働し続けます。

コマンドを実行しない場合、sshが接続し、ポート2205にリバーストンネルをセットアップします。これが完了すると、終了します。autosshを使用して、接続が失敗した場合、再接続してスリープを再開します。本当に安定したインターネット接続があったとしても、1年は可能だと思います。

ところで、これらの他のジョーカーとは異なり、私はこれが機能することを知っています。もちろん、私は実際にそれをテストしたので、もちろん同じようなことをしています。

-fと「コマンド」

それはあなたが見逃しているものです。


1
ここでは他の人の名前を呼ぶ必要はないと思います。
ジェフシャラー

1
私は他の人の名前を呼んではいない。以前に提案されたソリューションは、それらを提案した人々によって試みられたことがないことを指摘しています。信じられない?それらを試してください。
Jimminy Doe

1
私もあなたが質問のポイントに対処したとは思いません-OPはこの方法は100%機能すると主張しています。彼らの質問は、PCの再起動後に自動化された方法でスクリプトを実行することに集中していると思います。
ジェフシャラー

1
OPがターミナルで実行されているので、彼が仕事中であれば、ホームへのリバーストンネルをセットアップできます。これは、100%の時間で機能します。プロセスに関連付けられた端末がない場合、ssh(およびautossh)プログラムは異なる動作をします。-fを使用していないために、crontab(ターミナルなしで実行されます)がトンネルを再接続するのに問題があり、トンネルがセットアップされると、sshは何かを実行せずに終了します-私の場合、私は行きます一年間寝る。スクリプトで-fは、SSHの終了を防ぐコマンドとともに使用する必要があります。それが彼の問題です。
Jimminy Doe

1
私は、私に反対票を与え、正しい解決策を与え、実際にテストしてくれたあなた、ジェフ・シャラーだと思います。ファイアウォールを通過するようにPIを設定してrdesktopを起動し、Linuxについて何も知らないオフィスマネージャーにそれを使用するように指示することを除いて、私は基本的に彼とまったく同じ設定を行っています。 。私は今それを使用しているので、私が防弾ソリューションを持っていることはかなり確かです、そして私はリモートで私のpiと私のローカルケーブルモデムの両方を再起動しました-ただ安全のために。誇張された未熟な自我の道。
Jimminy Doe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.