特定のアドレスをトンネル経由でルーティングするにはどうすればよいですか?

特定のアドレスをトンネル経由でルーティングするにはどうすればよいですか?

サーバーが配置されているサブネットからのみアクセスできる特定の Web サイト/サービスがあります (一般的なイントラネットのシナリオを考えてみてください)。これらのアドレスに送信されるトラフィックを SSH トンネル経由で透過的にルーティングする方法はありますか?

次の設定を検討してください。

私のラップトップはホーム ネットワークに接続されています。ips X および Y のサービスに直接アクセスすることはできません。これらのサービスに実際にアクセスできるサブネット上のサーバーへの SSH トンネルがあります。

すべてのトラフィックをサーバー経由で送信する VPN ソリューション全体を実行することなく、X と Y のサブネットへのすべてのトラフィックをこのトンネルを経由するように自動的にカプセル化することはできますか? 言い換えると、他のサブネットに送信されるすべてのトラフィックは、サーバーを経由せずに (トンネルを使用して) ラップトップから直接送信される必要があります。

答え1

ルーティング テーブルでトラフィックをルーティングするインターフェイスを指定できます。

sudo route add <host.com> -interface <ppp0>

ここで、host.com はインターフェイス経由でアクセスするホスト名または IP であり、ppp0 はコマンドで表示される VPN のリンク識別子ですifconfig

答え2

OpenSSHの最新バージョンは、真のVPNサポートのためにtun/tapネットワークデバイスをサポートしています。https://help.ubuntu.com/community/SSH_VPN基本的なドキュメントについては、こちらを参照してください (明らかに Ubuntu 向けですが、基本的な原則は他の場所でも適用されます)。

答え3

免責事項: これから説明する内容は実際にテストしたわけではなく、完全に間違っている可能性もありますが、質問が非常に興味深いので、回答を草稿にまとめたいという誘惑に抗うことができません。:-) また、ここでの設定は、iptablesLinux にのみ存在する可能性のあるいくつかの機能に依存しています。

ラップトップからサーバー X1 の特定のポート P1、サーバー X2 のポート P2 などに接続したいと仮定します。ここでは、SSH トンネルを介して TCP トラフィックをこれらの特定のサーバー + ポートのペアにルーティングする方法について説明します。 注記:IP アドレス X1、X2 などは、ゲートウェイ ホスト (SSH で接続するホスト) から見たサーバーの IP アドレスです。

  1. 未使用のローカル ポート L1 (例: 10000)、L2 (例: 10001) などを選択します。ポート L1、L2、... はすべて異なるポートである必要があり、その数は異なる (Xn、Pn) サーバー + ポート ペアの数と等しくする必要があります。

  2. iptablesXn:Pn宛のパケットをlocalhost:Lnにリダイレクトするために使用します。

    iptables -t nat -A 出力 -p tcp -d X1 --dport P1 -j DNAT --to-destination localhost:L1 iptables -t nat -A 出力 -p tcp -d X2 --dport P2 -j DNAT --to-destination localhost:L2

  3. -L次に、localhost:Ln から (Xn, Pn) へのトラフィックをトンネリングするオプションを使用して、ゲートウェイに SSH 接続します。

    ssh ゲートウェイ.サーバー -L localhost:L1:X1:P1 -L localhost:L2:X2:P2 ...

例:

# access webserver.intranet (port 80) through localhost:10080
iptables -t nat -A OUTPUT -p tcp -d webserver.intranet --dport 80 -j DNAT --to-destination localhost:10080
ssh gateway.server -L locahost:10080:webserver.intranet:80

注意:

  • 動作するとしても、TCP に対してのみ動作します...

  • 複数のサーバーにアクセスしたい場合は、VPNをセットアップする方が手間がかからないでしょう。

  • -DSSHオプションを使用して SOCKS プロキシをシミュレートし、すべてのトラフィックをそれを介してトンネリングする方が簡単かもしれません。

答え4

すべてのトラフィックをサーバー経由で送信する VPN ソリューション全体を実行しなくても、X と Y のサブネットへのすべてのトラフィックをこのトンネルを経由するように自動的にカプセル化することはできますか?

一見すると、これは少し奇妙に思えます。なぜなら、それが VPN が行うことだからです。SSH はポイントツーポイントの関係になる傾向があり、ローカル マシンの 1 つのポートを別の場所にあるリモート マシンのポートに接続するという考え方です。SSH は、想定されるタイプのトラフィック向けに設計されたものではありません。

言い換えると、他のサブネットに送信されるすべてのトラフィックは、サーバーを経由せずに (トンネルを使用して) ラップトップから直接送信される必要があります。

繰り返しになりますが、VPN を使えばその問題は解決します。

安全なVPNトラフィックを実現するための「重い」ソリューションに関心がある場合(つまり、複雑すぎるため、いじりたくない場合)、次の点を検討する必要があります。オープンVPNは、まさにあなたが説明していることを実行します。すべてのトラフィックをカプセル化するだけでなく、それらのサブネット宛のトラフィックのみが VPN パイプを通過するようにすることができます。ローカル マシンとリモート マシンでテキスト ファイルを編集する必要があることに注意してください。ただし、実行するのはかなり簡単です。

中間のパーティ (サーバー) にトラフィックを見られたくない場合は、VPN を設定して、自分のマシンからリモート マシンに直接接続します。ルーティングされたパケットは、ラップトップから送信される前に暗号化されるため、エンドツーエンドで 100% のカバレッジが得られます。

関連情報