トンネルを介して特定のアドレスをルーティングする方法は?


14

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

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

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

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

回答:


6

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

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

ここで、host.comはインターフェイスを介してアクセスするホスト名またはIP、ppp0はifconfigコマンドで表示されるvpnのリンク識別子です。


2
注:少なくともubuntu -interfaceではオプションではないrouteため、上記の提案では使用方法のエラーが発生します。また、OPが求めるように、これによりsshトンネル経由のルーティングがどのように行われますか?
アリエル

3

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


これには、ラップトップとゲートウェイホストの両方でルート権限が必要であることに注意してください。
リッカルドムリ

1

免責事項:説明する内容を実際にテストしたことはありません。実際、完全に間違っている可能性がありますが、あなたの質問は非常に興味をそそるので、回答を作成する誘惑に抵抗することはできません。:-)また、ここでのセットアップiptablesは、Linuxにのみ存在する可能性のあるいくつかの機能に依存しています。

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

  1. 使用されていないローカルポートL1(10000など)、L2(10001など)を選択します。ポートL1、L2、...はすべて別個であり、その数は別個の(Xn、Pn)サーバー+ポートのペア。

  2. iptablesXn:Pnに向けられたパケットをlocalhost:Lnにリダイレクトするために使用します

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

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

    ssh gateway.server -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をセットアップする方が手間がかかりません

  • SSH -Dオプションを使用してSOCKSプロキシをシミュレートし、それを介してすべてのトラフィックをトンネリングする方が簡単な場合があります。


実際に動作します!(残念ながら、ローカルホストではなく仮想マシンからのトラフィックをルーティングしたいという特定の状況に適合しません。)
pvgoran

1

XとYのサブネットがこのトンネルを通過し、サーバーを介してすべてのトラフィックを送信するVPNソリューション全体を実行する必要はありませんか?

必要なのは、VPNの定義です。

VPNはすべきではありません

すべての[あなたの]トラフィックをサーバー経由で送信しますか?

そうである場合、正しくセットアップされていません。

定義上、トンネルまたはVPN経由でアクセスしようとしているマシンは、インターネット経由ではアクセスできないと想定されています。そのため、必要なインターネット以外のルーティング可能なアドレスのみをVPNにルーティングする必要があります。

マシンXとYのみがあり、他に何もないような、より複雑な状況がある場合。ITスタッフがそれらをサブネットに配置できます。次に、クライアントコンピューターで、そのサブネットのみをVPNにルーティングします。


0

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

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

つまり、他のサブネットに向かうトラフィックはすべて、サーバーを通過せずに(トンネルを使用して)ラップトップから直接送信される必要があります。

繰り返しますが、VPNがそれを処理します。

安全なVPNトラフィックを得るための「ヘビーウェイト」ソリューションが心配な場合(つまり、あまりにも複雑すぎるため、それを使いたくない場合)、OpenVPNを実際に見てください。。すべてのトラフィックをカプセル化するだけでなく、それらのサブネット宛のトラフィックのみがVPNパイプを介してトリップするように実行できます。ローカルおよびリモートマシンでテキストファイルを編集する必要があることを警告しますが、実行するのはかなり簡単です。

目的のために、中間のパーティ(サーバー)にトラフィックを見せたくないので、マシンからリモートマシンに直接接続するようにVPNをセットアップします。ルーティングされたパケットはラップトップを離れる前に暗号化されるため、エンドツーエンドのカバレッジが100%になります。


0

他の人が言ったように、「すべてのトラフィックをサブネットにカプセル化する」必要がある場合は、おそらくVPNを使用する必要があります。

ただし、ごく一部のサービスにアクセスするには、SSHのローカルポートフォワーディング機能を使用することをお勧めします。これは本当に簡単です。たとえば、(ラップトップから)入力した場合:

ssh -N -L 3333:localhost:2222 jump_box

その後に接続するlocalhost:2222だけに接続するようになりますlocalhost:2222からjump_box。複数の-Lオプションを一度にjump_box使用でき、ssd_config onで許可されている場合は、他のホスト上のサービスに接続できます。

autosshwith systemdなどを使用して、トンネルを稼働状態に保つことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.