Как направить IP-маршрут через определенный интерфейс в OS X?

40

Я на Mac и пытаюсь маршрутизировать определенный адрес через определенный шлюз на моем Wi-Fi-соединении.

Я использую:

route add -host 54.81.143.201 192.168.15.1

Иногда это будет работать, а иногда - нет. Я обнаружил, что интерфейс, который он выбирает, каждый раз отличается. Это не должно быть en0работать

netstat -nr вывод, когда он не работает:

54.81.143.201      192.168.15.1       UGHS            1       89     en5

Это когда это работает: (примечание en0)

54.81.143.201      192.168.15.1       UGHS            0        1     en

Почему я это делаю? Потому что у нашей компании есть прокси, на котором HipChat не работает. Таким образом, я маршрутизирую трафик hipchat через открытую сеть Wi-Fi, все еще находясь в моей сети Ethernet.

РЕДАКТИРОВАТЬ:

Я также попытался добавить запись, используя только интерфейс

route add -host 54.81.143.201 -interface en0

54.81.143.201      78:31:c1:c7:52:74  UHS             0        2     en0

HipChat не может подключиться.

РЕДАКТИРОВАТЬ 2: Кто-то попросил всю мою таблицу маршрутизации, вот она сегодня. Обратите внимание, что 54.81.143.201 теперь связан с en3, а не en0

Internet:
Destination        Gateway            Flags        Refs      Use   Netif Expire
default            10.7.90.1          UGSc           31        6     en3
10.7.90/24         link#4             UCS             4        0     en3
10.7.90.1          0:23:ac:3d:db:c2   UHLWIir        16        0     en3   1200
10.7.90.44         40:6c:8f:19:4a:bb  UHLWI           0        3     en3    946
10.7.90.63         127.0.0.1          UHS             0        0     lo0
54.81.143.201      192.168.15.1       UGHS            0        0     en3
127                127.0.0.1          UCS             0        0     lo0
127.0.0.1          127.0.0.1          UH              3      209     lo0
169.254            link#4             UCS             1        0     en3
169.254.255.255    0:23:ac:3d:db:c2   UHLSW           0        0     en3
Sean256
источник
Разместите полную таблицу маршрутизации для случая, когда она не работает. Доступен ли 192.168.15.1 через en5? Если так, то почему это не работает? Если нет, то трудно понять, как этот маршрут был добавлен.
Дэвид Шварц
@DavidSchwartz, вот что мне интересно. 192.168.15.1 недоступен через en5. Эта вещь работает, когда она правильно назначена en0.
Sean256
Покажите нам таблицу маршрутизации или конфигурацию en5. Должна быть какая-то причина, по которой маршрут устанавливается таким образом, и это, вероятно, реальная проблема.
Дэвид Шварц
@DavidSchwartz Это не всегда en5, иногда это en3. Я публикую всю свою таблицу маршрутизации сейчас.
Sean256
В таблице маршрутизации, которую вы показали, en3это правильно. 192.168.15.1 не доступен через любой другой интерфейс. Единственный способ достичь 192.168.15.1 в этой таблице маршрутизации - это маршрут по умолчанию, верно? (Откровенно говоря, звучит так, будто вы понятия не имеете, что делаете. Похоже, вы удивлены, что система не делает невозможного.)
Дэвид Шварц,

Ответы:

35

Пытаться:

route add -host 54.81.143.201 -interface en0
drk.com.ar
источник
2
Это то, что я получаю, когда пытаюсь это: route: bad address: en0
Sean256
Извините, у меня нет Mac, чтобы проверить это. Похоже, синтаксис был неверным. Я изменил ответ. Пожалуйста, попробуйте еще раз.
drk.com.ar
1
печально то же самое -> route: bad address: en0
Sean256
Попробуйте еще раз. На этот раз я удалил шлюз. Кроме того, не могли бы вы добавить вывод ifconfig к вашему вопросу, чтобы увидеть, как работает конфигурация IP?
drk.com.ar
Я только что попробовал это (на самом деле я тоже раньше), и это добавляет запись в мою таблицу, это не решает проблему. HipChat не может подключиться. Вот запись в таблице маршрутизации, когда вы делаете это таким образом -> 54.81.143.201 78: 31: c1: c7: 52: 74 UHS 0 2 en0
Sean256
3

Как указали другие, это на самом деле 3 проблемы.

  1. Ваш беспроводной интерфейс, кажется, меняется между en0, en3 и en5.

    На моем MacBook Air en0 всегда беспроводная; Thunderbolt-to-Ethernet всегда en3, а USB-to-Ethernet всегда en5. Но если вы подключите адаптер к другому порту на вашем Mac, то имя его сетевой карты изменится. Вы должны решить это в первую очередь. Убедитесь, что ваше беспроводное устройство всегда имеет одно и то же имя. В противном случае, когда вы вводите команду статического маршрута, если к этому en0местоположению не подключен сетевой адаптер , команда (очевидно) завершится с ошибкой адреса (физический адрес не имеет связи).

    Также убедитесь, что адаптер всегда подключается к одному и тому же SSID. Очевидно, адрес шлюза должен быть действительным для подсети, и разные сети WiFi будут иметь разные подсети. Это может вызвать другой тип ошибки.

    Вы не указали, является ли беспроводное соединение единственным сетевым подключением. Учитывая вышесказанное, я думаю, нет ...? Это и виртуальные сети из-за VMware или Parallels могут вызвать дополнительные сложности. (Например, если обе подключенные сети используют одно и то же пространство IP-адресов ... Виртуальные машины часто имеют мосты и имеют свои собственные IP-адреса / маршруты / ссылки ...) Поможет размещение топологии сети.

  2. Как только это будет сделано, попробуйте либо sudo route add -host 54.81.143.201 -iface en0или sudo ipfw. Если вы не уверены в названии адаптера, вы можете указать его MAC-адрес, например:sudo route add -host 54.81.143.201 -link 14:10:9f:e7:fd:0a

    Связанный: https://discussions.apple.com/thread/5049994?searchText=policy%20route

  3. Если вы перезагрузитесь, это может не сохраняться. Вам нужно будет справиться с этим отдельно.

Кортни Шварц
источник
2
sudo route -n add -net 54.81.143.201/32 192.168.15.1
Мутукумар Анбалаган
источник
@mnciitbhu спасибо ... это сработало и для меня: P
Muthukumar Anbalagan
2

Я смог добавить маршрут через интерфейс, используя -linkопцию для указания MAC-адреса.

route add -host 54.81.143.201 -link [mac addr of 192.168.15.1 on en0]

Это отправит трафик на 54.81.143.201соответствующий интерфейс.

У вас есть два отдельных 192.168.15.*адреса хоста, по одному для каждого интерфейса, верно? Иначе, вы можете отправлять трафик из любого интерфейса, но трафик будет возвращаться на тот IP-адрес источника, который есть у пакетов.

Невин Уильямс
источник
Поэтому я попробовал то, что вы предложили, используя mac addr, и, как ни странно, моя таблица маршрутизации показывает запись для en3, а не en0 -> 54.81.143.201 00: 1d.88.4a.21.da UGHS 0 0 en3
Sean256
Когда вы делаете 'arp -an', какие записи у вас есть ...?
Невин Уильямс
2

Это решение работает на последней версии MacOS 10.12 (Sierra). Вот суть .

#!/bin/bash

# NOTE: wifi network interface is: en1
wifi_router=192.168.200.1
wifi_address=en1:ec.35.86.4f.00.cc
TOADDR=`ifconfig en1 inet | sed -nl 's/\w*inet \([^ ]*\).*/\1/p'`
TO=`echo -n ${TOADDR//[[:space:]]}`

echo "ADDING ROUTE TO $1 VIA en1 (wi-fi): $TO"
route -n add -host $1 $wifi_router -ifp $wifi_address -ifa $TO -static

echo ""
echo "ROUTE ADDED:"
route get $1

Используйте как это:

> sudo ./route_wifi.sh IP_ADDRESS

Предполагается, что интерфейс Wi-Fi: en1 .

Не забудьте поставить правильные значения для переменных wifi_router и wifi_address . Обратите внимание на формат wifi_address , а именно: имя сетевого интерфейса ' : ' интерфейс mac адрес с ' . " Разделители . Конечно, большая часть необходимой информации может быть проанализирована из вывода команды ifconfig , но я просто слишком ленив для этого =)

Александр Малкофф
источник
Добро пожаловать в Superuser. Пожалуйста, постарайтесь содержать наиболее актуальную информацию по ссылке в вашем сообщении. Подробнее об этом читайте здесь .
пенополистирол летать
1

Команда OS X routeзадокументирована здесь . -ifscopeПараметр и его значение позволяет указать интерфейс, связанный маршрут.

Это, однако, не то, что вы хотите. Вы должны исправить свои сети так, чтобы их диапазоны IP были уникальными. Помимо этого, метрики интерфейса (или приоритеты) влияют на то, какой интерфейс выбирается из других в равной степени подходящих вариантов.

Даниэль Б
источник
0

Вот как можно перевести пользовательское имя «Wi-Fi» в любое имя устройства (например, en0, en1, en9, ...), которое MacOS назначило в то время.

Вы можете поместить эти функции в определенный скрипт или просто оставить их в своем .bash_profile.

function get_srvc_name ()
{
  cat <<EOF | scutil | \
    grep 'UserDefinedName' | \
    awk -F': ' '{print $2}'
show Setup:/Network/Service/$1
EOF
}

function get_srvc_ids ()
{
  cat <<EOF | scutil | \
    sed -nEe '
/ServiceOrder/ {
  :ids
  n
  /[0-9]+ :/ {
    s/ *[0-9]+ : ([0-9A-Z-]+) */\1/p
    b ids
  }
}'
show Setup:/Network/Global/IPv4
EOF
}

function get_srvc_id_by_name ()
{
  local srvc_ids=$(get_srvc_ids)

  for srvc_id in $srvc_ids
  do
    local srvc_name=$(get_srvc_name "$srvc_id")
    if [[ "$srvc_name" == "$1" ]]
    then
      echo $srvc_id
      return
    fi
  done
}

function get_int_name ()
{
  local srvc_id=$(get_srvc_id_by_name "$1")

  cat <<EOF | scutil | \
    sed -nEe '
    s/ *DeviceName : ([a-zA-Z0-9]+) */\1/p'
show Setup:/Network/Service/$srvc_id/Interface
EOF
}

Затем просто позвоните, get_int_name 'Wi-Fi'чтобы получить назначенное имя устройства.

Например:

route add -host 54.81.143.201 -interface $(get_int_name 'Wi-Fi')
parleer
источник
-1

Таким образом, сервер поставщика, с которым вы пытаетесь поговорить об услуге «HipChat», по вашему мнению, 54.81.143.201? В этом случае я бы сделал запись маршрутизации для 54.81.143.0 255.255.255.0, чтобы увеличить диапазон. Может быть, при использовании программного обеспечения вы не всегда общаетесь с этим конкретным сервером, а кластером из них в одной подсети 54.81.143.0/24. Кроме того, дополнительно убедитесь, что ваши метрики маршрута правильны при создании новой записи. Если вы создаете маршрут к 54.81.143.0/24 192.168.15.1 Metric 20 En5, но также есть маршрут к 0.0.0.0/0 10.7.90.1 Metric 10 En0. Компьютер проигнорирует вашу новую запись и продолжит маршрутизацию трафика по маршруту по умолчанию (через En0), потому что это более предпочтительно. Я просто просмотрел это и хотел указать на это. Ура!

KaneNFL443
источник
-1

Вы должны попробовать добавить имя NIC:

route add -net 10.13.0.0 netmask 255.255.0.0 dev NicNameHere

Это работает для меня в CentOS.

user220248
источник
Я получаю это -> маршрут: плохой адрес: dev
Sean256