Binden Sie die IP-Adresse an die Anwendung

8

Ich habe mehrere Netzwerkschnittstellen auf einem einzigen Computer. Ich frage mich, wie ich eine Netzwerkschnittstelle an eine Anwendung binden kann.

Beispiel: Netzwerkschnittstellen: eth0, eth1

Anwendung A benutze Dummy0 Anwendung B benutze Dummy1

Ist es möglich, eine Anwendung an eine solche Schnittstelle zu binden?

Anwendungsfall: 1 Maschine mit 2 Internetverbindungen; eth0 -> Internetverbindung 0 eth1 -> Internetverbindung 1

Anwendung verwenden eine vordefinierte Schnittstelle Firefox -> eth0 -> Internetverbindung 0 Chrome -> eth1 -> Internetverbindung 1

Betriebssystem: CentOS 5.9 32bit

Dooffas
quelle

Antworten:

4

Die Auswahl eines bestimmten Adapters für eine Anwendung ist eine anwendungsspezifische Einstellung. Sie müssen festlegen, wie dies in Ihrer spezifischen Anwendung durchgeführt wird. Dies ist auf Systemebene nicht möglich.

Windows

Sie können die Priorität von Adaptern jedoch auf globaler Systemebene anpassen. Verwenden Sie die Aufwärts- und Abwärtspfeile auf der Seite Erweiterte Eigenschaften für Netzwerkverbindungen.

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

Linux

Unter Linux ist der Prozess nicht so einfach. Sie müssen Linux mitteilen, dass ein Adapter weiter entfernt ist als der andere metric.

Um Adapter unter Linux zu priorisieren, müssen Sie den Befehl route verwenden , um die Route mit der gewünschten Metrik hinzuzufügen und den alten Eintrag zu löschen. Zum Beispiel:

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

In diesem Fall wird für beide Betriebssysteme für jede Anwendung dieselbe Reihenfolge verwendet.

Krowe
quelle
Gute Antwort, aber das OP erwähnt eth0und eth1so vermute ich, dass er nicht Windows verwendet.
Flup
Entschuldigung, ich habe das Betriebssystem nicht angegeben. Ich werde eine Bearbeitung vornehmen.
Dooffas
@dooffas Ich habe mit Informationen darüber aktualisiert, wie dies unter Linux gemacht wird. Es ist immer noch nicht genau das, wonach Sie ursprünglich gefragt haben.
Krowe
2

Es gibt eine einfache Lösung: Daniel Ryde hat zu diesem Zweck eine LD_PRELOAD "shim" -Bibliothek ( bind.c ) geschrieben, die das Bindungsverhalten ändert. Schauen Sie sich dieses Tutorial an:

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

Angesichts der Tatsache, dass es effektiv eine Standardbindungsadresse für Anwendungen gibt (siehe Ihre Routing-Tabelle), ist es meiner Meinung nach äußerst seltsam, dass es normalerweise keine Standardmethode (wie im "Distributionspaketcode") gibt, um diese Standardschnittstelle zu überschreiben, ja; auf Systemebene für einen bestimmten Satz von Anwendungen.

Einige Programme verfügen über Befehlszeilenoptionen, um die Benutzeroberfläche Ihrer Wahl anzuhören, was alles in Ordnung und gut ist.

Meine Standardroute führt über einen VPN-Proxy (sicherlich ein ziemlich häufiges Szenario). Dieser Tunnel ist eine gute Standardeinstellung für ausgehende Verbindungen und unterstützt eingehende Verbindungen aus dem Internet nicht sehr gut. Daher muss ich die serverorientierten Programme A, B und C zwingen, sich an eine andere IP-Adresse zu binden (vom Haupt-ISP bereitgestellte Adresse). Und kundenorientiertes Programm D, ich möchte meine öffentliche Schnittstelle aus verschiedenen Gründen verwenden.

Die obige Bibliothek funktioniert zu diesem Zweck gut!

Eine Lösung ist:

  1. Erstellen Sie einen neuen Benutzer
  2. Header-Mangle ALLE Pakete dieses bestimmten Benutzers
  3. Führen Sie die Programme als dieser Benutzer aus, NUR um "effektiv an die gewünschte Oberfläche zu binden", scheint im Vergleich ... ein hässlicher Hack zu sein.

Alternative:

  1. Erstellen Sie einen neuen Benutzer SuperFluous
  2. Lassen Sie SuperFluous eine andere Routing-Tabelle verwenden
  3. Führen Sie A, B, C als Benutzer SuperFluous aus. Immer noch nicht gut genug! Ich möchte "meine" Server als "ich" ausführen (ich habe möglicherweise nicht einmal die Berechtigung, neue Benutzer und Routing-Richtlinien zu erstellen).

LISTEN_TO = $ THIS_INTERFACE Befehl; # <- So einfach sollte es sein.

Folie Triks
quelle
Dies ist die einzige Antwort, die für den allgemeinen Fall Sinn macht - danke, dass Sie darauf hingewiesen haben!
Paul Gear
1

Eigentlich ist das Thema der Frage etwas ungenau. Das Binden einer Anwendung an eine Schnittstelle gilt für eine Anwendung, die als Server fungiert.

In diesem Fall lautet der korrekte Begriff "Weiterleiten des Datenverkehrs für eine bestimmte Anwendung auf eine bestimmte Weise". Unter Linux kann dies mit Richtlinienrouting erreicht werden.

Der Trick besteht darin, dass einer den anderen Browser als einen anderen Benutzer startet und die Richtlinien-Routing-Regeln dann alle Pakete dieses Benutzers dazu bringen, das andere Standard-Gateway zu verwenden.

http://blog.sebastien.raveau.name/2009/04/per-process-routing.html enthält eine vollständige Beschreibung.

Tero Kilkanen
quelle
0

Wie Krowe bereits sagte, ist es anwendungsspezifisch. Wenn Ihre Anwendung die Bindung an eine bestimmte Schnittstelle / IP nicht unterstützt, können Sie iptables (Linux) oder ipfilter (* BSD) verwenden.

Das Ubuntu-Wiki bietet eine nette Einführung in iptables: https://help.ubuntu.com/community/IptablesHowTo

Denis Witt
quelle
Sind Iptables nicht für die Weiterleitung des Datenverkehrs nach Port geeignet, es sei denn, ich habe ein Missverständnis? Zum Beispiel der gesamte Verkehr auf Port 80 -> eth0
dooffas
Es scheint, dass Sie dies auf der Anwendungsschicht haben möchten (z. B. Firefox). Ich habe das zuerst missverstanden und dachte, Sie wollen dies auf Service-Level (zB Apache).
Denis Witt
@dooffas iptables macht viele Dinge, es ist eine Firewall oder hauptsächlich eine Firewall, ich habe es dafür verwendet. Es hat zum Beispiel auch Einstellungen für NAPT. Vielleicht kann es auch den Verkehr umleiten, aber wenn Man kann sagen, dass es eine primäre Funktion hat. Ich glaube nicht, dass das Umleiten des Datenverkehrs seine primäre Funktion wäre.
Barlop
@DenisWitt Sie erwähnen ipf mit BSD. BSD hat auch ipfw, und jetzt mit BSD verwenden die Leute oft das ziemlich mächtige pf (es kann Drittanbieter sein).
Barlop
0

Während Anwendungen an bestimmte IP-Adressen gebunden werden können, ist dies anwendungsspezifisch. In Ihrem speziellen Beispiel unterstützen sowohl Chrome als auch Firefox HTTP-Proxys.

Sie können Squid mit einer Konfiguration wie der folgenden verwenden, damit sie eine bestimmte Netzwerkkarte verwenden.

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

Jetzt würde Firefox so konfiguriert, dass unter 127.0.0.2 eine Verbindung zum Proxy hergestellt wird, der 192.168.1.99 als Netzwerkkarte für die Ausführung ausgehender TCP-Anforderungen verwendet.

Chrome wäre so konfiguriert, dass 127.0.0.3 als Proxy verwendet wird, wobei 197.6.0.1 als ausgehende Adresse verwendet wird.

Anders J.
quelle
0

Lösung

Unter Linux gibt es mehrere Lösungen, um eine Anwendung an eine bestimmte Schnittstelle zu binden. Jede hat ihre Vor- und Nachteile. Diese Unix-Stackexchange-Antwort erklärt die meisten verfügbaren Möglichkeiten mit Details

Intika
quelle