Arch Linux(GUIなし)を実行するRaspberry Piが複数あり、すべてアクセスする必要があります。これらのパイは、各固有の場所のファイアウォールの背後にあります。現在、私はopenvpnを使用してそれに接続していますが、システムのライセンスあたりの費用は高価です。私は彼らのアクセスサーバーを使用します。
だから私はVPNサーバー(vps)にログインし、特定の名前(OfficeDevice1991)を取得するコマンドを実行できるシステムを設計して設定しようとしています。たとえば、次のようcustomcommandsearch "OfficeDevice1991"
にシステムのIPアドレスを返します。またはSSH経由で接続するために使用できるものです。また、接続されているすべてのアクティブデバイスを一覧表示するコマンドを実行する機能も探しています。 IP、名前、および有効時間が一覧表示されます。
この目的のために、もちろん、デバイス名(この場合はOfficeDevice1991)を含むエントリを作成する必要があります。これにより、piは私のvpsパブリックサーバーに接続できます。パブリックサーバーからログインして、接続されているすべてのデバイスを検索し、SSHに必要な情報を再取得できます。
私はリバースSSHを調べてきましたが、これまでテストパイを接続し、以下を使用してvpsからアクセスしました。
PI:
ssh -fN -R 12345:localhost:22 -i /publickeyfile useraccount@ip //Pi's command to connect to vpn
仮想プライベートサーバー:
ssh -p 12345 useraccount@localhost //command for vpn to connect to pi
これはうまく機能しますが、このアプローチを使用して実装するにはいくつかの問題があります。
- 未使用の一意のポートを設定する必要があります。
- これらのポート/トンネルを開いたままにする方法
- 各デバイスを識別できるシステムを用意する必要があります。各ポートをローカルテキストファイルの名前で記録できますか?可能であれば、各デバイスのSSH設定にそれを含めることをお勧めします。私が使用しているポートが他のプログラムまたはすでに持っているデバイスで使用されていないことを確認する必要があります。
私がしたくないこと
各RPIで利用可能なポートを確認してください。
.ssh/config
上記のパート1でRPIに割り当てられている各ポートを表す名前を追加するには、手動で編集する必要があります。
私は私の目標を達成する方法についての情報/助けを得るためにこの記事を書いています。
誰でも私に適したソリューションを提供できますか?
ベストアンサー1
OpenSSH >= 6.7+ を使用するソリューションは次のとおりです。ソカット:
OpenSSH> = 6.7を使用できます。Unixドメインソケットの転送
これは、リバーストンネルエンドポイントが次のようになることを意味します。UNIXリスニングソケット伝統的なTCPリスニングソケットの代わりに。その後、簡単な命名スキームを使用してRPIグループをより簡単に管理できます。ソケット名は、RPIで選択された(および固定された)名前になります(例:)
OfficeDevice1991
。有効なファイル名であれば、これはRPIの唯一の属性である可能性があります(Unixソケット名はファイル名の規則に従うためです)。たとえば、ホスト名、イーサネット、またはWi-FiカードのMACアドレス...SSHは、接続自体ではなくトンネリングのためにUnixソケットを処理できます。
ProxyCommand
Unixソケットクライアントとして機能するには、aの助けが必要です。ソカットUnixソケットを含むさまざまな接続を処理できます。更新:
処理する必要があるもう1つの具体的な問題:Unixソケットファイルは、完全にシャットダウンすると削除されず、競合後も削除されません。これにはオプションが必要ですStreamLocalBindUnlink=yes
。最初は名前が示すように、このオプションはUnixソケットが作成されるノードに設定する必要があるという事実を見つけませんでした。したがって、最終的にクライアントにローカル転送(-L
)が設定されました。そうでなければsshd_config
サーバー()でリモート転送()を使用します-R
。 OPが見つかりました。そこ。このソリューションはリモート転送を使用します。VPS構成:
mkdir /rpi-access
ファイルを編集します(root)
sshd_config
(/etc/ssh/sshd_config
)。次の追加オプションが必要です。StreamLocalBindUnlink yes
デフォルトのオプションによっては、以下が必要になる場合があります。
AllowStreamLocalForwarding yes
アップデート2:パラメータに
も設定し、合理的な時間内に切断が検出されるようにします。例:sshd_config
ClientAliveInterval
ClientAliveCountMax
ClientAliveInterval 300 ClientAliveCountMax 2
これにより、古いSSH接続ができるだけ早くVPSで検出され(例では約1,000万)、対応するSSHDプロセスが終了します。
RPIの使用法:
ssh -fN -R /rpi-access/OfficeDevice1991:localhost:22 -i /privatekeyfile useraccount@ip
構成ファイルでは、これは次のようになります。
Host ip User useraccount RemoteForward /rpi-access/OfficeDevice1991:localhost:22 IdentityFile /privatekeyfile
もう一度繰り返します。
StreamLocalBindUnlink yes
sshd
VPS側で設定オプションが重要です。正常に終了しても、作成したソケットは削除されません。このオプションを使用すると、ソケットがある場合は使用前に削除され、追加の再接続に再利用できます。これは、単にソケットが存在するだけではRPI接続と見なすことができないことを意味します(ただし、以下を参照)。これで、VPSで次のことができます。
ssh -o 'ProxyCommand=socat UNIX:/rpi-access/%h -' rpiuseraccount@OfficeDevice1991
設定ファイルとして、たとえば、RPI名が次から始まるとします。事務機器:
Host OfficeDevice* User rpiuseraccount ProxyCommand socat UNIX:/rpi-access/%h -
リンクを維持するにはループを使用してください。
接続が終了するたびに、RPIはループを実行してsshをVPSに再接続できます。これにはバックグラウンドモード(no
-f
)を使用できません。接続保持メカニズムも使用する必要があります。 TCPKeepAlive(システムレベル)またはServerAliveInterval(アプリケーションレベル)として使用できます。私の考えでは、TCPKeepAliveはサーバー(接続を受ける側)でのみ役に立つと思うので、ServerAliveIntervalを使用することをお勧めします。その値(ServerAliveCountMaxも含む)は、さまざまな基準に従って調整する必要があります。特定の時間が経過すると、ファイアウォールは非アクティブ接続を破棄し、所望の回復遅延を引き起こし、不要なトラフィックを生成しません。ここでは300秒を想定しています。
OfficeDevice1991 RPI:
#!/bin/sh while : ; do ssh -N -o ConnectTimeout=30 -o ServerAliveInterval=300 -R /rpi-access/OfficeDevice1991:localhost:22 -i /privatekeyfile useraccount@ip sleep 5 # avoid flood/DDoS in case of really unexpected issues done
リモート側で古い接続障害を検出できず、古いSSH接続がしばらく実行されていても、
StreamLocalBindUnlink yes
とにかくUnixソケットは強制的に新しい接続にフラッシュされます。1. すでに処理済みです。
customcommandsearch
1.で正しい設定を行った後、ssh OfficeDevice1991
OfficeDevice1991に接続する必要はありません。を使用してください。VPSを使用する必要がある場合は、
root
ユーザーとして次のコマンドを実行します。fuser /rpi-access/*
現在接続されているRPIを表示できます(もちろん、最近検出された前に切断されたRPIを除く)。古いUnixソケットファイルは、バインドされたプロセスがないため表示されません。