Comment diriger une route IP via une interface spécifique sous OS X?

40

Je suis sur un Mac et j'essaie de router une adresse particulière via une passerelle spécifique sur ma connexion wifi.

J'utilise:

route add -host 54.81.143.201 192.168.15.1

Parfois, cela fonctionnera, d'autres fois, cela ne fonctionnera pas. Ce que j'ai trouvé, c'est que l'interface choisie est différente à chaque fois. Il faut ot en0travailler

netstat -nr sortie quand ça ne marche pas:

54.81.143.201      192.168.15.1       UGHS            1       89     en5

C'est quand ça marche: (note en0)

54.81.143.201      192.168.15.1       UGHS            0        1     en

Pourquoi est-ce que je fais cela? Parce que notre société a un proxy sur lequel HipChat ne fonctionne pas. Je dirige donc le trafic hipchat via un réseau wifi ouvert tout en restant connecté à Ethernet.

MODIFIER:

J'ai aussi essayé d'ajouter l'entrée en utilisant uniquement l'interface

route add -host 54.81.143.201 -interface en0

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

HipChat ne parvient pas à se connecter.

EDIT 2: Quelqu'un a demandé toute ma table de routage, la voici aujourd'hui. Notez que 54.81.143.201 est maintenant lié à en3 et non 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
la source
Affichez la table de routage complète pour le cas où cela ne fonctionnerait pas. Est-ce que 192.168.15.1 est accessible via en5? Si oui, pourquoi ça ne marche pas? Sinon, il est difficile de voir comment cette route a été ajoutée.
David Schwartz
@ DavidSchwartz, c'est ce qui m'intéresse. 192.168.15.1 n'est pas accessible via en5. La chose fonctionne quand elle est correctement assignée à en0.
Sean256
Montrez-nous la table de routage ou la configuration de en5. Il doit y avoir une raison pour que la route soit installée de cette façon, et c'est probablement le vrai problème.
David Schwartz
@DavidSchwartz Ce n'est pas toujours en5, parfois c'est en3. Je poste maintenant toute ma table de routage.
Sean256
Dans la table de routage que vous avez montrée, en3est clairement correct. 192.168.15.1 n'est accessible par aucune autre interface. Le seul moyen d'atteindre 192.168.15.1 dans cette table de routage est d'utiliser la route par défaut, n'est-ce pas? (On dirait carrément que vous n'avez aucune idée de ce que vous faites. Vous semblez surpris que le système ne fasse pas l'impossible.)
David Schwartz

Réponses:

35

Essayer:

route add -host 54.81.143.201 -interface en0
drk.com.ar
la source
2
C'est ce que je reçois quand j'essaye ça: route: mauvaise adresse: en0
Sean256
Désolé, je n'ai pas de Mac pour tester ça. Il semble que la syntaxe était fausse. J'ai modifié la réponse. Veuillez réessayer.
drk.com.ar
1
même chose malheureusement -> route: mauvaise adresse: en0
Sean256
Réessayer. Cette fois j'ai enlevé la passerelle. Aussi, pourriez-vous ajouter la sortie ifconfig à votre question pour voir la configuration IP impliquée?
drk.com.ar
Je viens d’essayer cela (en fait, j’en ai aussi auparavant) et cela ajoute une entrée à mon tableau, cela ne résout pas le problème. HipChat ne parvient pas à se connecter. Voici l'entrée dans la table de routage lorsque vous procédez de cette façon -> 54.81.143.201 78: 31: c1: c7: 52: 74 UHS 0 2 en0
Sean256
3

Comme d'autres l'ont indiqué, il s'agit en fait de 3 problèmes.

  1. Votre interface sans fil semble changer entre en0, en3 et en5.

    Sur mon MacBook Air, en0 est toujours sans fil. Thunderbolt-to-Ethernet est toujours en3 et USB-to-Ethernet est toujours en5. Mais si vous connectez un adaptateur à un autre port de votre Mac, le nom de la carte réseau change. Vous devez d'abord résoudre ce problème. Assurez-vous que votre réseau sans fil porte toujours le même nom. Sinon, lorsque vous entrez la commande de route statique, si aucune carte réseau n'est connectée à l' en0emplacement, la commande échouera (évidemment) avec une "erreur d'adresse" (l'adresse physique n'a pas de lien).

    De même, assurez-vous que l'adaptateur se connecte toujours au même SSID. L'adresse de la passerelle doit évidemment être valide pour le sous-réseau, et différents réseaux WiFi auront différents sous-réseaux. Cela peut provoquer un autre type d'erreur.

    Vous n'avez pas précisé si le sans fil est votre seule connexion réseau. Compte tenu de ce qui précède, je suppose que non ...? Ceci et la mise en réseau virtuelle due à VMware ou Parallels peuvent entraîner des complexités supplémentaires. (Par exemple, si les deux réseaux connectés utilisent le même espace IP ... Les machines virtuelles sont souvent reliées par un pont et ont leurs propres adresses IP / routes / liens ...). L'affichage d'une topologie de réseau serait utile.

  2. Une fois que cela est fait, essayez sudo route add -host 54.81.143.201 -iface en0ou sudo ipfw. Si vous n'êtes pas sûr du nom de l'adaptateur, vous pouvez plutôt spécifier son adresse MAC, comme suit:sudo route add -host 54.81.143.201 -link 14:10:9f:e7:fd:0a

    Connexes: https://discussions.apple.com/thread/5049994?searchText=policy%20route

  3. Si vous redémarrez, cela ne persistera peut-être pas. Vous devrez gérer cela séparément.

Courtney Schwartz
la source
2
sudo route -n add -net 54.81.143.201/32 192.168.15.1
Muthukumar Anbalagan
la source
@mnciitbhu merci ... cela a fonctionné pour moi aussi: P
Muthukumar Anbalagan 13/12
2

J'ai pu ajouter une route via une interface en utilisant l' -linkoption permettant de spécifier une adresse MAC.

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

Cela enverra du trafic pour 54.81.143.201l'interface appropriée.

Deux 192.168.15.*adresses d’hôte distinctes sont affectées, une à chaque interface, n’est-ce pas? Sinon, vous pouvez envoyer du trafic à partir de l'une ou l'autre interface, mais le trafic sera renvoyé sur l'adresse IP source des paquets.

Nevin Williams
la source
J'ai donc essayé ce que vous aviez suggéré en utilisant l'adresse MAC, et curieusement ma table de routage montre une entrée pour en3 et non pour en0 -> 54.81.143.201 00: 1d.88.4a.21.da. UGHS 0 0 en3
Sean256
Quand vous faites un 'arp -an', quelles entrées avez-vous ...?
Nevin Williams
2

Cette solution fonctionne sur le dernier MacOS 10.12 (Sierra). Voici le Gist .

#!/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

Utilisez comme ceci:

> sudo ./route_wifi.sh IP_ADDRESS

Il suppose que l'interface wifi est: en1 .

N'oubliez pas de mettre les valeurs correctes pour les variables wifi_router et wifi_address . Notez le format wifi_address , qui est: nom d'interface réseau ' : ' adresse MAC d' interface avec ' . ' délimiteurs . Certes, la plupart des informations requises peuvent être analysées en sortie de la commande ifconfig , mais je suis trop paresseux pour cela =)

Alexander Malkoff
la source
Bienvenue chez Superuser. Essayez de contenir la plupart des informations pertinentes contenues dans le lien de votre message. En savoir plus à ce sujet ici .
styrofoam fly
1

La routecommande OS X est documentée ici . Le -ifscopeparamètre et sa valeur vous permettent de spécifier un itinéraire lié à une interface.

Ce n'est cependant pas ce que vous voulez. Vous devez réparer vos réseaux pour que leurs plages IP soient uniques. En dehors de cela, les métriques d'interface (ou priorités) influent sur l'interface sélectionnée.

Daniel B
la source
0

Voici comment traduire le nom défini par l'utilisateur 'Wi-Fi' en un nom de périphérique (par exemple en0, en1, en9, ...) attribué par MacOS à ce moment-là.

Vous pouvez mettre ces fonctions dans un script spécifique ou simplement les conserver dans votre .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
}

Ensuite, appelez simplement get_int_name 'Wi-Fi'pour obtenir le nom d'appareil attribué.

Par exemple:

route add -host 54.81.143.201 -interface $(get_int_name 'Wi-Fi')
parle
la source
-1

Ainsi, le serveur du fournisseur avec lequel vous essayez de parler en ce qui concerne le service "HipChat" que vous prétendez être le 54.81.143.201? Dans ce cas, je ferais une entrée de routage pour 54.81.143.0 255.255.255.0 pour lui donner une plus grande plage. Peut-être que lorsque vous utilisez le logiciel, vous ne communiquez pas toujours avec ce serveur spécifique, mais avec un cluster d’entre eux situé sur le même sous-réseau 54.81.143.0/24. De plus, assurez-vous également que les mesures de votre itinéraire sont correctes lors de la création d'une nouvelle entrée. Si vous créez une route vers 54.81.143.0/24 192.168.15.1 Métrique 20 En5, mais avez également une route vers 0.0.0.0/0 10.7.90.1 Métrique 10 En0. L'ordinateur ignorera votre nouvelle entrée et poursuivra le routage du trafic via l'itinéraire par défaut (via En0), car il est préférable. Je viens de survoler cela et je voulais le souligner. À votre santé!

KaneNFL443
la source
-1

Vous devriez essayer d'ajouter le nom de la carte réseau:

route add -net 10.13.0.0 netmask 255.255.0.0 dev NicNameHere

Cela fonctionne pour moi dans CentOS.

utilisateur220248
la source
Je reçois ceci -> route: mauvaise adresse: dev
Sean256