サーバーが配置されているサブネットからのみアクセスできる特定のWebサイト/サービスがあります(一般的なイントラネットシナリオを考えてみてください)。 SSHトンネルを介してこれらのアドレスに向かうトラフィックを透過的にルーティングする方法はありますか?
次の設定を検討してください。
私のラップトップはホームネットワークに接続されています。 ips XおよびYのサービスに直接アクセスすることはできません。これらのサービスに実際にアクセスできるサブネット上にあるサーバーへのSSHトンネルがあります。
サーバーを介してすべてのトラフィックを送信するVPNソリューション全体を実行しなくても、XとYのサブネットへのすべてのトラフィックをこのトンネルを通過するように自動的にカプセル化できますか?言い換えると、他のサブネットに向かうすべてのトラフィックは、サーバーを通過せずに(トンネルを使用して)ラップトップから直接進む必要があります。
ルーティングテーブルでトラフィックをルーティングするインターフェイスを指定できます。
Sudo route add <Host.com> -interface <ppp0>
ここで、Host.comはインターフェースを介してアクセスするホスト名またはIPであり、ppp0はifconfig
コマンドで表示されるvpnのリンク識別子です。
OpenSSHの最近のバージョンは、真のVPNサポートのためにtun/tapネットワークデバイスをサポートしています。基本的なドキュメントについては https://help.ubuntu.com/community/SSH_VPN を参照してください(明らかにUbuntuを対象としていますが、基本的な原則は他の場所にも適用されます)。
免責事項:私が説明する内容は実際にはテストしていません。実際、それは完全に間違っている可能性がありますが、あなたの質問は非常に興味深く、答えを作成する誘惑に抵抗できません。 :-)また、ここでの設定は、Linuxにのみ存在する一部のiptables
機能に依存します。
ラップトップからサーバーX1の特定のポートP1に接続し、サーバーX2のポートP2に接続したい場合など-これらの特定のポートにトラフィックをルーティングする方法を説明しますTCPトラフィックSSHトンネルを介したサーバー+ポートのペア注: IPアドレスX1、X2などは、ゲートウェイホスト(SSHを実行するホスト)から見たサーバーのIPアドレスです。
未使用のローカルポートL1(例:10000)、L2(例:10001)などを選択します。ポートL1、L2、...はすべて個別である必要があり、それらの番号は個別の(Xn、Pn)サーバー+の数と等しくなければなりません。ポートのペア。
iptables
を使用して、Xn: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
次に、-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プロキシをシミュレートし、すべてのトラフィックをトンネルする方が簡単な場合があります。
xとYのサブネットがこのトンネルを通過し、サーバーを介してすべてのトラフィックを送信するVPNソリューション全体を実行する必要はありませんか?
必要なのは、VPNの定義です。
VPNは
すべての[あなたの]トラフィックをサーバー経由で送信しますか?
正しく設定されていません。
トンネルまたはVPNを介してアクセスしようとするマシンは、定義上、インターネットを介してアクセスできないと想定されています。したがって、必要なインターネット以外のルーティング可能なアドレスのみをVPNにルーティングする必要があります。
マシンXとYだけで、他に何もないような、より複雑な状況がある場合。 ITスタッフはこれらをサブネットに配置できます。次に、クライアントコンピュータで、そのサブネットのみをVPNにルーティングします。
サーバーを介してすべてのトラフィックを送信するVPNソリューション全体を実行する必要なく、XとYのサブネットへのすべてのトラフィックをこのトンネルを通過するように自動的にカプセル化できますか?
これはVPNがあなたのために行うことなので、一見すると少し奇妙です。 SSHはポイントツーポイントの問題になる傾向があり、ローカルマシンの1つのポートを他の場所にあるリモートマシンのポートに接続するという考えです。それは本当にあなたが想像する種類のトラフィックのために設計されたのではありません。
言い換えると、他のサブネットに向かうすべてのトラフィックは、サーバーを通過せずに(トンネルを使用して)、ラップトップから直接進む必要があります。
繰り返しになりますが、VPNがそれを処理します。
安全なVPNトラフィックを取得するための「重い」解決策が心配な場合(つまり、複雑すぎるためにそれを使用したくない)場合は、実際に OpenVPN を確認する必要があります。まさにあなたが説明していること。すべてのトラフィックをカプセル化するだけでなく、それらのサブネットを宛先とするトラフィックのみがVPNパイプを経由するようにすることもできます。ローカルマシンとリモートマシンのテキストファイルを編集する必要があることを警告しますが、実行するのはかなり簡単です。
目的のために、途中のサーバー(サーバー)にトラフィックを見せたくないので、マシンからリモートマシンに直接接続するようにVPNを設定します。ルーティングされたパケットはすべて、ラップトップを離れる前に暗号化されるため、エンドツーエンドのカバレッジが100%になります。
他の人が言ったように、「サブネットへのすべてのトラフィックをカプセル化する」必要がある場合は、おそらくVPNを使用する必要があります。
ただし、いくつかのサービスにアクセスするには、SSHのローカルポート転送機能を使用することをお勧めします。これは非常に簡単です。たとえば、次のように入力した場合(ラップトップから):
ssh -N -L 3333:localhost:2222 jump_box
次にlocalhost:2222
に接続すると、localhost:2222
からjump_box
に接続するのと同じようになります。一度に複数の-Lオプションを使用でき、jump_box
のssd_configで許可されていれば、他のホストのサービスに接続できます。
autossh
をsystemd
などと一緒に使用して、トンネルを稼働させ続けることができます。