Как маршрутизировать трафик через два разных сетевых адаптера на основе порта TCP в OS X

761
Luis Delgado

(кросс-пост от ServerFault, так как этот форум кажется более подходящим для этого вопроса)

У меня есть сценарий, в котором мы будем использовать Mac для потоковой передачи видео на сервер RTMP. Эта служба RMTP предоставляет 2 URL-адреса для загрузки, поэтому вы можете загружать один и тот же видеоконтент дважды и иметь избыточность в случае возникновения проблем с подключением. Тем не менее, оба URL-адреса RTMP-входа одинаковы, единственное отличие - это номер порта TCP, например:

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

Я хочу сделать следующее:

  • На Mac есть два сетевых интерфейса (каждый использует разных сетевых провайдеров для резервирования).
  • Пусть OS X использует 1 из этих сетевых интерфейсов для потоковой передачи контента на первый URL, а второй сетевой интерфейс использует для потоковой передачи на второй URL

Я не знаю, как разделить трафик на один и тот же хост (но другой порт) через разные сетевые интерфейсы в OS X. Я нашел эти ссылки ( здесь и здесь ), но они решают разные проблемы.

Кто-нибудь знает, как использовать iptables, nat, hosts или какую-либо комбинацию сервисов в OS X для достижения этого разрыва, который я ищу?

ОБНОВИТЬ

После некоторого исследования я убежден, что это может быть достигнуто с помощью PF. Я создал следующий набор правил и включил pf с этим загруженным правилом. Однако весь трафик блокируется, и фактический трафик rtmp, который должен быть разрешен для исходящих и правильно маршрутизируемых, также блокируется. Похоже, у меня есть проблема с синтаксисом, когда PF сопоставляет трафик RTMP с настроенным мною правилом:

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
Вы не говорите единственное, что действительно имеет значение: является ли хотя бы одна из машин, к которой вы хотите подключиться, в вашей локальной сети? Если это так, это может быть сделано, иначе это невозможно. MariusMatutiae 8 лет назад 0
@MariusMatutiae: $ rtmp_ip - это интернет-сервер. Я пытаюсь использовать конфигурацию route-to, чтобы настроить Mac для маршрутизации трафика на этот хост через один из двух интерфейсов, которые есть у mac, в зависимости от порта назначения. AFAIK, route-to должен поддерживать маршрутизацию к внешним хостам. Благодарю. Luis Delgado 8 лет назад 0
Это конечно делает. Что он не поддерживает, так это наличие двух шлюзов по умолчанию одновременно. Если у вас есть несколько маршрутов по умолчанию с одной и той же метрикой, ядро ​​просто выберет первый в списке, вот и все. MariusMatutiae 8 лет назад 0
@MariusMatutiae, да, это понятно. Правило, которое я хочу установить, простое: весь исходящий TCP-трафик для host1 через порт 1935, использует интерфейс 1 (шлюз 1). весь исходящий TCP-трафик для host1 на порту 1936, используйте интерфейс 2 (шлюз). Весь остальной исходящий трафик, используйте шлюз по умолчанию (в приведенных выше вопросах я блокирую все, но это просто для того, чтобы проверить, срабатывает ли pf или нет, правило запрета по умолчанию не требуется). У вас есть предложение о том, как написать такое правило (а)? Благодарю. Luis Delgado 8 лет назад 0
все будет работать некорректно, если у вас два шлюза, указывающих на один и тот же набор адресов. это означает, что, вообще говоря, весь трафик, проходящий по определенному IP-адресу, будет использовать один и тот же шлюз и, следовательно, будет выходить с одного и того же сетевого адаптера. Именно так IP-стек обрабатывает решения о маршрутизации. Я полагаю, что вы могли бы разместить обе сетевые карты в разных сетях и использовать два маршрутизатора и привязать экземпляры вашей программы к одному или другому сетевому адаптеру, но это кажется большой работой и дополнительными затратами, которые, кажется, не принесут вам большой пользы. , Frank Thomas 8 лет назад 0
@FrankThomas: привет, Фрэнк. Допустимая точка, в моем реальном сценарии, у каждого адаптера будет свой шлюз по умолчанию, каждый адаптер связан с другим сетевым провайдером. Я исправлю вопрос, чтобы отразить это условие. Итак, при таких обстоятельствах должна ли быть возможность маршрутизации трафика ОС к одному и тому же хосту через разные шлюзы на основе порта назначения TCP? Luis Delgado 8 лет назад 0
Что ж, это легко, если приложение поддерживает связывание, и вы можете запустить его два экземпляра. Вы должны проявить творческий подход, но это не так. Одним из способов может быть использование SOCKS Proxy. Frank Thomas 8 лет назад 0
@FrankThomas, нет, приложение не поддерживает привязку, поэтому я ищу решения на уровне ОС для разделения трафика. Благодарю. Luis Delgado 8 лет назад 0
Боюсь, что для вашего сценария не так много хороших вариантов. ОС определяет выходной интерфейс на основе маршрута к месту назначения на уровне 3 (уровень IP) без учета протокола уровня 4 (порт TCP). так что для места назначения www.example.com трафик из приложений ОС ВСЕГДА будет использовать тот же шлюз, выходной интерфейс и т. д. Так работает стек IP, будь то Unix, Linux, Mac, Windows или Android. Решения о маршрутизации обрабатываются на уровне 3. Возможно, вам удастся выработать комбинацию туннелей и прокси-серверов для этой работы, но это будет довольно сложное решение. Извините, это не так просто. Frank Thomas 8 лет назад 0

0 ответов на вопрос

Похожие вопросы