web-dev-qa-db-ja.com

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

NATの背後に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にあります。したがって、Ubuntuターミナルで./rev.shを実行すると、動的プロキシを取得し、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サイトには多くの同様の質問があります。それゆえ、私は多くの回答を参照してきましたが、どれも役に立たなかったようです。

9
Denis

cronを使用して起動時にスクリプトを実行するのが良い方法かどうかはわかりません。 here で説明されているように、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
8

Crontabを介してスクリプトを実行すると、証明書が見つからないようです。

ユーザーがスクリプトを実行すると、スクリプトは/home/ubuntu-user/.ssh/...からの証明書を使用します。ただし、スクリプトがcrontabから実行されると、rootとして実行されます。 rootは/root/.sshから証明書を取得します

だからあなたはそれを動作させるために複数の方法がありますが、私はスクリプトを crontabのubuntu-user として実行すると思います。

編集:

証明書の完全修飾パスを提供してください

1
syss

suを使用してみてください:

su -l user -c /home/user/rev.sh

それはあなたの問題に役立ちますか?

1
Fedor Dikarev

あなたが試すことができるいくつかのこと:

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
1
slowko

端末なしで実行する場合は、-fおよびコマンドの実行を使用する必要があります。だからここに例があります:

autossh -M 12374 \
-R 2205:127.0.0.1:22 \
-p 2200 \
-f \
[email protected] \
sleep 31536000

-fはバックグラウンドに配置しますが、バックグラウンドに配置すると、sshが接続し、タスクが完了するとすぐに切断されます。したがって、タスクが必要です。

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

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

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

-fおよび "コマンド"

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

0
Jimminy Doe

質問にはそれほど多くのデータが含まれていないので、私は何をするかからゼロから始めます

すべての構成を/ 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
Diego Roccia