Wie kann man verschiedene Apps dazu bringen, WLAN vs. Ethernet zu verwenden?

Ich möchte einige Apps über WLAN und andere Apps über Ethernet leiten. Angesichts der Tatsache, dass OSX über eine breite Palette von Systemtools und Dienstprogrammen sowie eine reichhaltige Ökosphäre von Apps verfügt, wie kann ich das erreichen?*

Im Grunde suche ich nach etwas wie der App-Suite von Rogue Ameba, die sich jedoch mit Netzwerken anstelle von Audio befasst

Antworten (3)

Ich möchte einige Apps über WLAN und andere Apps über Ethernet leiten.

Leider funktioniert dies (Vernetzung) nicht so. Sie können nicht sagen, dass Sie möchten, dass Safari durch einen Netzwerkanschluss geht und iTunes durch einen anderen. Das Problem dabei liegt in der Tatsache, dass die Anwendungen selbst keine Netzwerkverbindung herstellen – sie rufen die Netzwerk-API ( Berkeley-Sockets ) auf, die die Verbindung herstellt und den Prozess an den Socket selbst bindet.

Vereinfacht ausgedrückt sieht der Ablauf so aus

Geben Sie hier die Bildbeschreibung ein

Wenn Ihr lokaler Prozess (die fragliche Anwendung) eine Verbindung herstellen möchte, fordert er die Erstellung eines Sockets an. Ein Teil dieser Anfrage enthält die IP-Adresse, die Verbindung wird dann hergestellt und die App daran gebunden. Die App sendet und empfängt dann Daten über diesen Socket.

Der Schlüssel, den Sie sich hier merken sollten, ist, dass die Anwendung basierend auf der Netzwerkadresse nach einem Socket fragt. Abgesehen davon (vorausgesetzt, Sie befinden sich in einem Netzwerk mit einem einzigen Segment), haben Sie nur zwei Routen:

  • Ihr lokales Netzwerk
  • alles andere (zB Internet)

Wenn Sie zwei Schnittstellen mit diesem einzigen Netzwerk verbunden haben, überschneiden sich Ihre Routen und die Schnittstelle mit Priorität ist die primäre.

Was auch immer Ihre Anwendung ausführt, es wird sagen: "Ich möchte gehen zu foo.bar.com", was in eine IP-Adresse übersetzt wird, und ein Socket wird über die Route erstellt, die Sie dorthin bringt. Der Punkt ist, dass Ihre App keine Kontrolle über die Angelegenheit hat.

Angenommen, Sie sind mit zwei verschiedenen Netzwerken verbunden:

  • Ethernet (en0) -> 1.2.3.0
  • WiFi (en1) -> 5.6.7.0

Wenn es einen Dateiserver mit der IP-Adresse 1.2.3.4 gibt, wird der gesamte Datenverkehr für diese Adresse über das Ethernet geleitet. Wenn Ihr WLAN für den Internetzugang konfiguriert ist, gehen alle Anrufe an 1.2.3.0 und alle anderen Adressen über en1. Auch hier hat Ihre App kein Mitspracherecht und der Socket wird basierend auf dem Ziel erstellt.

Kann eine Anwendung eine bestimmte Netzwerkschnittstelle verwenden?

Ja, natürlich kann es, aber dies geschieht auf der Quellebene der Anwendung, da sie die API aufruft. Wenn Sie es so programmieren, dass es eine bestimmte Schnittstelle verwendet, wird es dies tun (es ist in keiner Weise praktisch, aber Sie haben die Möglichkeit).

Fazit: Damit eine externe Anwendung den Datenverkehr basierend auf der von Ihnen verwendeten Anwendung umleitet, müsste sie sich zwischen die Anwendung und den Protokollstapel des Betriebssystems einfügen, und das wird einfach nicht passieren.

Es hängt davon ab, über welche Apps wir sprechen und was genau Sie erreichen möchten. In einigen Fällen können Sie mit pf und richtlinienbasiertem Routing (Quell-Routing) basierend auf dem Quellport oder den Zielports Ihrer Apps auskommen. Dies ist jedoch normalerweise nur mit Apps möglich, die netzwerktechnisch "einfach" sind (dh beispielsweise nur eine Verbindung zu einem einzelnen Server herstellen).

Eine generische Lösung scheint es noch nicht in einer ordentlich verpackten Form zu geben, die Sie einfach herunterladen und ohne spezielle Fachkenntnisse verwenden können.

Wenn Sie eine solche Lösung implementieren möchten, sollten Sie beim Starten Ihrer Apps die Umgebungsvariable DYLD_INSERT_LIBRARIES verwenden, um Ihre eigene gemeinsam genutzte Bibliothek in den Prozess einzufügen. Diese gemeinsam genutzte Bibliothek sollte dann den bind()-Aufruf überschreiben, um sicherzustellen, dass der Prozess je nach App an die IP Ihrer WLAN- oder Ethernet-Schnittstelle gebunden wird.

Das, was mir am nächsten kommt, heißt Paketpriorisierung (damit sich Apps nicht auf derselben Ethernet-Verbindung gegenseitig stören). Sie ist im Motherboard „Fatal1ty Z370 Professional Gaming i7“ verfügbar, aber es ist ein 200-Dollar-Board und es ist eine Hardwarelösung, ich glaube nicht, dass es eine Software gibt, die dazu in der Lage ist, aber ich könnte mich irren, ich hoffe, das hat geholfen.