コマンドを実行する前に、SSHトンネル(ssh -w)が確立されるのを待ちます。

コマンドを実行する前に、SSHトンネル(ssh -w)が確立されるのを待ちます。

SSH VPNトンネル(-wオプション)を使用するときにトンネルが実際にいつ開始されるのかを知る方法はありますか? ssh -wを実行してからifup [1]を実行してトンネルを自動的に設定するスクリプトでこれを使用したいと思います。

-fオプションは、サーバーに接続してトンネルが確立される前に返されるため、役に立ちません。数秒間寝ると役に立ちますが、あまりにも深刻に感じます。

LocalCommandオプションが機能しているようです。たとえば、次のようになります。

ssh -w 0:1 "-oLocalCommand=ifup tun0" "-oPermitLocalCommand=yes" myserver.example.org true

ただし、マニュアルページには、「コマンドは同期的に実行され、それを作成したssh(1)セッションへのアクセス権はありません」と記載されています。上記の呼び出しが正しく機能するのか、それともLocalCommandが実行された後に運が続いていますか?トンネルが建設されましたか?

さらに重要なのは、スクリプトでssh -wを使用する標準的な方法はありますか?

[1]私はFedoraを使用しており、ifupが動作します /etc/sysconfig/network-scripts/ifcfg-tun0/etc/sysconfig/network-scripts/route-tun0

答え1

したがって、ここには2つの質問があります。 1)トンネルが実際に始まるのを待つ方法、またはトンネルが実際に始まったことを知る方法。 2)FedoraでSSHトンネルを設定する標準的な方法はありますか?

1)について:個人的に私は次のようなものを使用したいと思います:

timeout=2 # Wait for two seconds for a reply.
ip=192.168.0.1 # Use IP address assigned to tunnel endpoint.
while ! ping -W "$timeout" -c 1 "$ip" &>/dev/null; do
  echo "Waiting for tunnel to be up..."
  sleep 0.5
done
echo "Tunnel is up."

for試行回数が設定されているループを使用するか、-I tun0トンデバイスを強制的に使用するようにpingコマンドにこのような内容を渡すと、より高度な効果が得られます。

私がこのアプローチを好む理由の1つは、トンネル自体を設定しても必ずしも通信が行われることを意味するわけではありません。パケット損失、iptablesルール、ルーティング設定エラーなどがあります。スクリプトが中断されると、スクリプトが終了するか、トンネリングが必要なすべてのコマンドにタイムアウト/再試行ポリシーがあるかどうかを慎重に確認します。

2)関連:すべてのディストリビューションでSSHトンネルを設定するための基本的なメカニズムはわかりません。それは彼らが存在しないという意味ではありません。過去に私が使っていた自動SSH

関連情報