web-dev-qa-db-ja.com

iptablesとstunnelを使用したピアツーピアアプリケーションの暗号化

ソースコードにアクセスできないレガシーアプリケーションを実行しています。これらのコンポーネントは、特定のポートでプレーンテキストを使用して相互に通信します。 OpenVPNなどの従来の(集中型の)VPNパッケージを使用するのではなく、stunnelなどを使用して2つ以上のノード間の通信を保護し、ピアツーピア通信を容易にできるようにしたいと考えています。

理想的には、トラフィックフローは次のようになります。

  1. app @ hostA:1234は、app @ hostB:1234へのTCP接続を開こうとします。
  2. iptablesは、ポート1234のトラフィックをキャプチャして、ポート5678のhostAで実行されているstunnelにリダイレクトします。
  3. stunnel @ hostAは、stunnel @ hostB:4567との接続をネゴシエートして確立します。
  4. stunnel @ hostBは、復号化されたトラフィックをapp @ hostB:1234に転送します。

基本的に、ポートNへの(ローカルマシンで生成された)アウトバウンドトラフィックがstunnelを介してポートN + 1に転送され、受信側がポートN + 1で受信し、復号化して転送するようにこれを設定しようとしています。ポートNのローカルアプリケーションに接続します。

通信ペイロードには識別情報が含まれているため、stunnel @hostBがapp @ hostBに転送するときに、hostAオリジンのIPアドレス/マシンIDが失われることについては特に心配していません。

これの他のトリックは、通常、stunnelではクライアント/サーバーアーキテクチャを使用していることです。ただし、ノードは動的に出入りする可能性があり、stunnel構成で何らかの「connection = hostN:port」をハードコーディングできないため、このアプリケーションははるかにP2Pです。

編集:もう1つの可能性は、ポートNへのアウトバウンドトラフィックがゲートウェイとして構成されたstunnelを介して転送されるように、ある種のデフォルトルートを構成することです。

2
Jonathan Oliver

ここではiptablesはやや不必要に思えます。

appAはhostA(外部IP A.A.A.A)上のアプリのインスタンスですappBはhostB(外部IP B.B.B.B)上のアプリのインスタンスです

  1. appAはhostAで127.0.0.1:1234をリッスンしています
  2. 暗号化された接続をA.A.A.A:1234から127.0.0.1:1234に転送するように構成されたhostAのstunnel

    [appA]

    受け入れる= A.A.A.A:1234

    接続= 127.0.0.1:1234

    クライアント=いいえ

  3. 暗号化されたトンネルを作成し、127.0.0.1:4321からA.A.A.A:1234への転送接続を作成するように構成されたhostB上のstunnel

    / usr/bin/stunnel -d 127.0.0.1:4321 -r A.A.A.A:1234

  4. appBは127.0.0.1:4321との接続を確立します

hostBの場合はその逆です。

1
hostmaster