自動的に再接続するTCPトンネル


9

2台のマシン間に信頼性の低いネットワーク接続があります。制御できない理由でアクティブなTCP接続が切断されることがあります。2台のマシン間に信頼できるTCP接続を確立したい。

ネットワークが信頼できる場合はssh -L 1234:localhost:1234 remotehost、サーバーをポート1234でリッスンしてを実行し、remotehostクライアントをに向けlocalhost:1234ます。しかし、ssh接続が停止すると、転送された接続も停止します。クライアントとサーバー間の接続を自動的に復元するようにするにはどうすればよいですか?

非解決策:

  • これはインタラクティブアプリケーション用ではないため、画面は適用されません。
  • これは、SSHトンネルを自動的に再接続することだけではありません。 la autossh。新しいトンネル接続を開始するのではなく、同じトンネルTCP接続を引き続き使用したい。
  • 原則として、VPNが有効です。しかし、TCP接続が1つだけ必要な場合はやり過ぎに思われます。どちらの側にもroot権限がない場合でも機能する解決策が欲しいです。

私はrocksそれをやったというプログラムの薄暗い記憶を持っていますが、それはウェブの顔から落ちたようです。私は主に両側のLinuxに関心があります(ただし、このレベルのプログラムは他のuniceに移植できることを期待しています)が、QNXとVMSの間で動作するプログラムを知っている場合は、さらに良いでしょう。


Gilles、ssh接続でtcpキープアライブを使用していますか?そうでない場合は、まずこれを試してください...一部のNAT実装では接続がすぐにタイムアウトします
Mike Pennington

@マイク:先端をありがとう。私には緊急の必要はありませんが、中間ルートが行き来する状況(したがって、TCPキープアライブが悪影響を及ぼすよりも)と、NATが過負荷になって私を落とす状況(TCPキープアライブが役立つ可能性があります)の両方に直面しました。とにかく、TCPキープアライブは継続的なストリーム(例:scp)には関係ありません。いずれにせよ、私はこの一般的なことを守りたいと思います。次回、どのようなフレーバーのフレークネットワークにも直面した場合、どうすればよいですか?
Gilles 'SO-悪をやめる'

Gilles、のような一定のストリームではソリューションが異なりますscp。ポートフォワーディングの例に基づいて、sshキープアライブを使用して応答していました。Re:不安定なダウンストリームホップです。より耐性のあるキープアライブを使用してsshセッションを作成する以外に、できることは多くありません(つまり、ServerAliveInterval > 0およびでドロップされたキープアライブを許可しますServerAliveCountMax > 3)。NATでは、より低いキープアライブ間隔が必要です。重要な問題は、問題が何であるかを特定し、それに応じて調整することです。オプションを.ssh/config配置して、常に表示されるようにする
Mike Pennington

@マイク:私の使用例の1つには、アクティブな接続さえもランダムにドロップするのではなく、過負荷のNATからIPを取得するクライアントが含まれています(必要以上のP2Pを考えてください)。数秒後、クライアントはなんとか再接続しますが、別のIPアドレスを取得する可能性があります。その場合、TCP接続が存続する方法はありません。Rocksは対応しますが、今日のシステムではそのまま使用できるものが好まれます。
Gilles「SO-悪をやめる」

NATが新しいIPを提供する場合、NATを修正するか、別のrocks実装を期待するよりも多くのことはできません...これは明らかに本当の策略です
Mike Pennington

回答:


5

古いものは、メンテナンスされていないReliable Sockets(Rocks)を探していますか?


1
ありがとう、ロックスは確かに私が覚えているものです。もちろん、私は維持されているものを好みます。
Gilles「SO-邪悪なことをやめなさい」

@ Gilles'SO-stopbeingevil 'それは維持されていないだけでなく、インターネットの表面から完全に脱落したようです!
マイケル

1

この機能について知っている唯一の標準プロトコルはMPTCPです。これはアプリケーション層に対して透過的であるため、MPTCP上のSSHが機能するはずです。基になるTCP接続を異なるIPの異なるパスで実行できるため、原則として、VPN接続が稼働しているかどうかに応じて、SSH接続をVPN接続の内外に移行するために使用できます。

MPTCP実装の成熟度についてはあまり知りませんが、プロトコルの設計は非常に堅牢に見えます。

不安定なネットワーク接続が原因でSSH接続が失われるのを防ぎます。SSH接続を切断したいミットからあなたを守ることはできません。mitmは依然として破損したデータを注入する可能性があり、SSHは接続を検出して切断します。

SSHプロトコルに組み込まれたMPTCPのようなreconnectメソッドは、可能な限り長い時間接続を維持することを想像できる方法です。しかし、私はそのような機能がSSHプロトコル用に設計されたとは思いません。


0

を使用daemontoolsして、sshポートを前向きに保つことができます。(おそらくsshがローカルポートを切断すると、接続が拒否され始めると思われるため)接続が停止している間、接続に応じてプログラムを必ずしも維持するわけではありませんが、それは始まりです。

iptablesssh転送がなくなるとすぐにそのポートにDROPパケットを送信させるなど、いくつかのトリックがあると思います。接続プログラムは、パケットが拒否されずに消えていることを認識しているだけです。私はdaemontools(再び)自分自身を学習しているだけなので、サービスが停止したときにカスタムスクリプトを実行できるかどうかはわかりませんが、可能だと思います。


-2

TCPはこれを自動的に行います。瀕死のTCP接続を殺すために使用される一般的な実用的なクリーンアップハックを無効にするか弱めるだけで済みます。接続のTCPキープアライブを無効にし、過剰な再送信の制限を大幅に増やします。たとえば、Linuxの場合、に大量に書き込み/proc/sys/net/ipv4/tcp_retries2ます。

ただし、最新のネットワークでは、ステートフルパケットインスペクションファイアウォールは、定期的にパケットを交換できないTCP接続を忘れる可能性が高いため、パレードで雨が降るかもしれません。


1
各エンドポイントに静的IPアドレスがあり、ステートフルミドルボックスがない限り、TCPがこの状況を処理できることは事実です。質問はreasons beyond my control、私が動的IPまたはステートフルミドルボックスとして読んだに言及しています。このようなシナリオでは、TCPキープアライブが少し役立ちます。ただし、TCPキープアライブをどのように構成しても、再起動によってミドルボックスの状態が失われた場合でも、接続を維持するには十分ではありません。
kasperd 2014

@kasperd同意する。ただし、そのような場合にTCP接続を開いたままにしておくのは無駄です。したがって、質問者はこれらの特定の課題に直面していないと思いました。
aecolley 2014

両方のエンドポイントを制御し、MPTCPをサポートするスタックにそれらをアップグレードできる場合、それは無駄ではありません。さらに、アプリケーション層ソリューションは、MPTCPを必要とせずにTCPの上に実装できます。
kasperd 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.