So leiten Sie den Verkehr über zwei verschiedene Netzwerkadapter basierend auf dem TCP-Port in OS X weiter

841
Luis Delgado

(Crossposting von ServerFault, da dieses Forum für diese Frage eher geeignet erscheint)

Ich habe ein Szenario, in dem wir einen Mac verwenden, um Videoinhalte auf einen RTMP-Server zu streamen. Dieser RMTP-Dienst stellt zwei Ingest-URLs zur Verfügung, sodass Sie denselben Videoinhalt zweimal hochladen können und Redundanz haben, falls Ihre Verbindung ein Problem aufweist. Beide RTMP-Ingest-URLs sind jedoch identisch. Der einzige Unterschied ist die TCP-Portnummer. Beispiel:

{ "rtmp1": "rtmp://xxx.xxx.com:1935/id1", "rtmp2": "rtmp://xxx.xxx.com:1936/id1" } 

Was ich tun möchte, ist folgendes:

  • Verfügen über zwei Netzwerkschnittstellen auf dem Mac (die jeweils unterschiedliche Netzwerkanbieter verwenden, um Redundanz zu erreichen).
  • Lassen Sie das OS X eine dieser Netzwerkschnittstellen verwenden, um Inhalte an die erste URL zu streamen, und verwenden Sie die zweite Netzwerkschnittstelle, um an die zweite URL zu streamen

Ich weiß nicht, wie ich den Verkehr über verschiedene Netzwerkschnittstellen in OS X auf denselben Host (aber einen anderen Port) aufteilen kann. Ich habe diese Links ( hier und hier ) gefunden, aber sie lösen unterschiedliche Probleme.

Weiß jemand, wie man iptables, nat, hosts oder eine beliebige Kombination von Diensten innerhalb von OS X verwendet, um diese gesuchte Aufteilung zu erreichen?

AKTUALISIEREN

Nach einigen Recherchen bin ich überzeugt, dass dies mit PF erreichbar sein sollte. Ich habe den folgenden Regelsatz erstellt und pf mit dieser geladenen Regel aktiviert. Der gesamte Datenverkehr wird jedoch blockiert, und der eigentliche RTMP-Verkehr, der ausgehend zugelassen und ordnungsgemäß geleitet werden sollte, wird ebenfalls blockiert. Anscheinend habe ich ein Syntaxproblem, wenn PF den RTMP-Verkehr mit der von mir konfigurierten Regel abgleichen lässt:

ext_if1 = "en0" ext_if1_gwt = "192.168.1.1" ext_if2 = "en5" ext_if2_gwt = "172.168.1.1"  rtmp_ip = "104.46.55.96" rtmp_port1 = "1935" rtmp_port2 = "1936"  pass in on $ext-if1 route-to ($ext_if1 $ext_if1_gwt) proto tcp from any to $rtmp_ip port $rtmp_port1 pass in on $ext-if1 route-to ($ext_if2 $ext_if2_gwt) proto tcp from any to $rtmp_ip port $rtmp_port2  pass in on $ext-if2 route-to ($ext_if1 $ext_if1_gwt) proto tcp from any to $rtmp_ip port $rtmp_port1 pass in on $ext-if2 route-to ($ext_if2 $ext_if2_gwt) proto tcp from any to $rtmp_ip port $rtmp_port2  block out 
1
Sie sagen nicht das Einzige, was wirklich wichtig ist: Ist mindestens eine der Maschinen, mit denen Sie sich in Ihrem LAN verbinden möchten? Wenn ja, kann es gemacht werden, sonst nicht. MariusMatutiae vor 8 Jahren 0
@MariusMatutiae: $ rtmp_ip ist ein mit dem Internet verbundener Server. Ich versuche, die Route-to-Konfiguration zu verwenden, um den Mac anzuweisen, Datenverkehr an diesen Host über eine der beiden Schnittstellen des Mac zu leiten, basierend auf dem Zielport. AFAIK, route-to sollte das Routing an externe Hosts unterstützen. Vielen Dank. Luis Delgado vor 8 Jahren 0
Das tut es auf jeden Fall. Was es nicht unterstützt, ist, zwei Standardgateways gleichzeitig zu haben. Wenn Sie mehrere Standardrouten mit derselben Metrik haben, wählt der Kernel einfach die erste in der Liste aus, das ist alles. MariusMatutiae vor 8 Jahren 0
@MariusMatutiae, ja, das ist klar. Die Regel, die ich festlegen möchte, ist einfach: Der gesamte ausgehende TCP-Datenverkehr für Host1 auf Port 1935 wird mit Schnittstelle 1 (Gateway 1) verwendet. Den gesamten ausgehenden TCP-Datenverkehr für host1 an Port 1936 verwenden Sie die Schnittstelle 2 (Gateway). Für den gesamten anderen ausgehenden Datenverkehr verwenden Sie das Standardgateway (in den obigen Fragen blockiere ich alles aus. Dies ist jedoch nur zum Testen, ob pf in Kraft tritt oder nicht. Diese Standardverweigerungsregel ist nicht erforderlich). Haben Sie einen Vorschlag, wie Sie solche Regeln schreiben sollen? Vielen Dank. Luis Delgado vor 8 Jahren 0
Wenn zwei Gateways auf denselben Satz von Adressen verweisen, funktionieren die Dinge nicht ordnungsgemäß. Das bedeutet, dass im Allgemeinen der gesamte Verkehr, der zu einer bestimmten IP-Adresse geleitet wird, dasselbe Gateway verwendet und somit dieselbe NIC verwendet. Genau so erledigt der IP-Stack Routing-Entscheidungen. Ich nehme an, Sie könnten beide NICs in unterschiedliche Netzwerke einbinden und zwei Router verwenden und Instanzen Ihres Programms an die eine oder andere NIC binden, aber das scheint viel Arbeit und zusätzliche Kosten zu sein, und das scheint Ihnen nicht viel zu bringen . Frank Thomas vor 8 Jahren 0
@ FrankThomas: Hallo Frank. Gültiger Punkt, in meinem realen Szenario hat jeder Adapter ein anderes Standardgateway, wobei jeder Adapter an einen anderen Netzwerkanbieter gebunden ist. Ich werde die Frage korrigieren, um diese Bedingung wiederzugeben. Sollte es unter diesen Umständen möglich sein, dass das Betriebssystem den Verkehr über verschiedene Gateways an denselben Host routen kann, basierend auf dem TCP-Zielport? Luis Delgado vor 8 Jahren 0
Nun, es ist einfach, wenn die Anwendung Nic-Bindung unterstützt und Sie zwei Instanzen davon ausführen können. Man muss kreativ werden, das ist jedoch nicht der Fall. Ein Weg könnte mit einem SOCKS-Proxy sein. Frank Thomas vor 8 Jahren 0
@FrankThomas, nein, die App unterstützt keine Nic-Bindung, deshalb suche ich auf Betriebssystemebene nach Lösungen, um den Datenverkehr aufzuteilen. Vielen Dank. Luis Delgado vor 8 Jahren 0
Ich fürchte, es gibt nicht viele gute Optionen für Ihr Szenario. Das Betriebssystem bestimmt die Exit-Schnittstelle basierend auf der Route zum Ziel auf Schicht 3 (der IP-Schicht) ohne Rücksicht auf das Protokoll der Schicht 4 (TCP-Port). Für das Ziel www.example.com verwendet der Verkehr von den Apps des Betriebssystems IMMER das gleiche Gateway, die Ausgangsschnittstelle usw. Dies ist genau die Art und Weise, in der der IP-Stack funktioniert, sei es Unix, Linux, Mac, Windows oder Android. Routingentscheidungen werden von Layer 3 gehandhabt. Möglicherweise können Sie eine Kombination aus Tunneln und Proxys erarbeiten, um dies zu erreichen. Dies ist jedoch eine recht aufwendige Lösung. Entschuldigung, es ist nicht leicht. Frank Thomas vor 8 Jahren 0

0 Antworten auf die Frage