web-dev-qa-db-ja.com

IPアドレスをアプリケーションにバインドする

1台のマシンに複数のネットワークインターフェイスがあります。ネットワークインターフェイスをアプリケーションにバインドするにはどうすればよいのでしょうか。

例:ネットワークインターフェイス:eth0、eth1

アプリケーションAはdummy0を使用しますアプリケーションBはdummy1を使用します

このようなインターフェイスにアプリケーションをバインドすることは可能ですか?

ユースケース:2つのインターネット接続を備えた1台のマシン。 eth0->インターネット接続0 eth1->インターネット接続1

アプリケーションは事前定義されたインターフェースを使用しますFirefox-> eth0->インターネット接続0 Chrome-> eth1->インターネット接続1

OS:CentOS 5.932ビット

8
dooffas

アプリケーションに特定のアダプターを選択することは、アプリケーション固有の設定です。特定のアプリケーションでこれがどのように行われるかを決定する必要があります。システムレベルでは実行できません。

Windows

ただし、グローバルシステムレベルでアダプタの優先度を調整できます。 [ネットワーク接続の詳細プロパティ]ページで上下の矢印を使用します。

http://levynewsnetwork.wordpress.com/2011/12/01/windows-7-default-internet-connection-choice/

Linux

Linuxでは、プロセスはそれほど単純ではありません。 metricを使用して、一方のアダプタがもう一方のアダプタよりも離れていることをLinuxに通知する必要があります。

Linuxでアダプターに優先順位を付けるには、routeコマンドを使用して、目的のメトリックでルートを追加し、古いエントリを削除する必要があります。例えば:

Sudo route add -net default gw 10.10.0.1 netmask 0.0.0.0 dev wlan0 metric 1
Sudo route del -net default gw 10.10.0.1 netmask 0.0.0.0 dev wlan0 metric 0

両方のOSで、これが実行されると、すべてのアプリケーションで同じ順序が使用されます。

4
krowe

簡単な解決策があります-DanielRydeは、この目的のために、バインドの動作を変更するLD_PRELOAD "shim"ライブラリ( bind.c )を作成しました。このチュートリアルをチェックしてください:

https://www.x4b.net/kb/BindProcessToIPonLinux

アプリケーションのデフォルトのバインドアドレスが事実上存在することを考えると(ルーティングテーブルを参照)、私の考えではsuperbly通常は標準的な方法がない( 「配布パッケージコード」のように)そのデフォルトのインターフェースをオーバーライドするには、yes;特定のアプリケーションセットについて、システムレベルで。

一部のプログラムには、選択したインターフェイスをリッスンするコマンドラインオプションがありますが、これはすべて問題なく動作します。

私のデフォルトルートはVPNプロキシを経由します(確かにかなり一般的なシナリオです)。発信接続の適切なデフォルトであるこのトンネルは、インターネットからの着信接続を十分にサポートしていません。したがって、サーバー指向のプログラムA、B、およびCを他のIP(メインISPが提供するアドレス)にバインドするように強制する必要があります。そして、クライアント指向のプログラムD、私はさまざまな理由でパブリックインターフェイスを使用したいと思います。

上記のライブラリは、この目的のためにうまく機能します!

解決策は次のとおりです。

  1. 新しいユーザーを作成する
  2. その特定のユーザーのすべてのパケットをヘッダーマングル
  3. そのユーザーとしてプログラムを実行し、目的のインターフェイスに「効果的にバインドする」ためだけに実行すると、...醜いハックと比較すると、.

または:

  1. 新しいユーザーSuperFluousを作成する
  2. SuperFluousに異なるルーティングテーブルを使用させる
  3. ユーザーSuperFluousとしてA、B、Cを実行します。まだ十分ではありません! 「my」サーバーを「me」として実行したい(新しいユーザーとルーティングポリシーを作成する権限さえ持っていない可能性があります)。

LISTEN_TO = $ THIS_INTERFACEコマンド; #<-それはそのように単純でなければなりません。

2
Folie Triks

実際、質問の主題は少し不正確です。アプリケーションをインターフェースにバインドすることは、サーバーとして機能するアプリケーションに適用されます。

この場合、正しい用語は「特定のアプリケーションのトラフィックを特定の方法でルーティングする」です。 Linuxでは、これはポリシールーティングで実現できます。

秘訣は、一方が他方のブラウザを別のユーザーとして起動し、ポリシールーティングルールがそのユーザーからのすべてのパケットにもう一方のデフォルトゲートウェイを使用させることです。

http://blog.sebastien.raveau.name/2009/04/per-process-routing.html には完全な説明があります。

1
Tero Kilkanen

アプリケーションは特定のIPアドレスにバインドできますが、アプリケーション固有です。特定の例では、ChromeとFirefoxの両方がHTTPプロキシをサポートしています。

次のような構成でSquidを使用して、特定のNICを使用させることができます。

acl browser1 localip 127.0.0.2
acl browser2 localip 127.0.0.3
tcp_outgoing_address 192.168.1.99 browser1
tcp_outgoing_address 197.6.0.1 browser2

これで、Firefoxは127.0.0.2でプロキシに接続するように構成され、192.168.1.99はNIC発信TCP=要求の実行に使用されます。

Chromeは、プロキシとして127.0.0.3を使用するように構成され、送信アドレスとして197.6.0.1を使用します。

0
Anders J

解決

Linuxでは、アプリケーションを特定のインターフェイスにバインドするためのいくつかのソリューションがあり、それぞれに長所と短所があります nix stackexchange answer 利用可能な可能性のほとんどを詳細に説明します

0
intika

Kroweがすでに言ったように、それはアプリケーション固有です。アプリケーションが特定のインターフェース/ IPへのバインディングをサポートしていない場合は、iptables(Linux)またはipfilter(* BSD)を使用できます。

Ubuntu-Wikiにはiptablesのかなり良い紹介があります: https://help.ubuntu.com/community/IptablesHowTo

0
Denis Witt