Come indirizzare il percorso IP attraverso un'interfaccia specifica in OS X?


40

Sono su un Mac e sto provando a instradare un indirizzo particolare attraverso un gateway specifico sulla mia connessione WiFi.

Sto usando:

route add -host 54.81.143.201 192.168.15.1

A volte questo funzionerà, altre volte no. Quello che ho scoperto è che l'interfaccia che sceglie è sempre diversa. Deve en0funzionare

netstat -nr output quando non funziona:

54.81.143.201      192.168.15.1       UGHS            1       89     en5

Questo è quando funziona: (nota en0)

54.81.143.201      192.168.15.1       UGHS            0        1     en

Perché lo sto facendo? Perché la nostra azienda ha un proxy su cui HipChat non funziona. Quindi instrado il traffico hipchat attraverso una rete wifi aperta mentre sono ancora sul mio Ethernet di lavoro.

MODIFICARE:

Ho anche provato ad aggiungere la voce usando solo l'interfaccia

route add -host 54.81.143.201 -interface en0

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

HipChat non riesce a connettersi.

EDIT 2: Qualcuno ha chiesto la mia intera tabella di routing, eccola oggi. Si noti che 54.81.143.201 è ora associato a en3 e non a 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

Pubblica la tabella di routing completa per il caso in cui non funziona. 192.168.15.1 è raggiungibile tramite en5? Se è così, perché non funziona? Altrimenti, è difficile vedere come è stata aggiunta quella rotta.
David Schwartz,

@DavidSchwartz, questo è ciò che è interessante per me. 192.168.15.1 non è raggiungibile tramite en5. La cosa funziona quando viene assegnata correttamente a en0.
Sean256,

Mostraci la tabella di routing o la configurazione di en5. Devono esserci dei motivi per cui il percorso viene installato in questo modo, e questo è probabilmente il vero problema.
David Schwartz,

@DavidSchwartz Non è sempre en5, a volte è en3. Sto postando tutta la mia tabella di routing ora.
Sean256,

Nella tabella di routing che hai mostrato, en3è chiaramente corretto. 192.168.15.1 non è raggiungibile tramite nessun'altra interfaccia. L'unico modo per raggiungere 192.168.15.1 in quella tabella di routing è attraverso la route predefinita, giusto? (Senza mezzi termini, sembra che tu non abbia idea di cosa stai facendo. Sembri sorpreso che il sistema non stia facendo l'impossibile.)
David Schwartz,

Risposte:


35

Provare:

route add -host 54.81.143.201 -interface en0

2
Questo è quello che ottengo quando lo provo: route: indirizzo errato: en0
Sean256

Mi dispiace non ho un Mac per testarlo. Sembra che la sintassi fosse sbagliata. Ho modificato la risposta. Per favore, riprova.
drk.com.ar,

1
stessa cosa purtroppo -> itinerario: indirizzo errato: en0
Sean256

Riprova. Questa volta ho rimosso il gateway. Inoltre, potresti aggiungere l'output ifconfig alla tua domanda per vedere la configurazione IP coinvolta?
drk.com.ar,

L'ho appena provato (in realtà ce l'ho anche prima) e aggiunge una voce al mio tavolo, non risolve il problema. HipChat non riesce a connettersi. Ecco la voce nella tabella di routing quando lo fai in questo modo -> 54.81.143.201 78: 31: c1: c7: 52: 74 UHS 0 2 en0
Sean256

3

Come altri hanno indicato, si tratta in realtà di 3 problemi.

  1. La tua interfaccia wireless sembra cambiare tra en0, en3 ed en5.

    Sul mio MacBook Air, en0 è sempre wireless; Thunderbolt-to-Ethernet è sempre en3 e USB-to-Ethernet è sempre en5. Ma se si collega un adattatore a una porta diversa sul Mac, il suo nome NIC cambia. Devi prima risolvere questo. Assicurati che il tuo wireless abbia sempre lo stesso nome. Altrimenti quando si immette il comando route statica, se non è stata inserita alcuna scheda NIC nella en0posizione, il comando fallirà (ovviamente) con un "errore di indirizzo" (l'indirizzo fisico non ha alcun collegamento).

    Allo stesso modo, assicurarsi che l'adattatore sia sempre connesso allo stesso SSID. L'indirizzo del gateway deve ovviamente essere valido per la sottorete e le diverse reti WiFi avranno sottoreti diverse. Ciò può causare un altro tipo di errore.

    Non hai specificato se il wireless è la tua unica connessione di rete. Dato quanto sopra, suppongo di no ...? Questo e il networking virtuale a causa di VMware o Parallels possono causare ulteriori complessità. (Ad esempio, se entrambe le reti connesse utilizzano lo stesso spazio IP ... Le macchine virtuali spesso sono collegate e hanno i propri IP / rotte / collegamenti ...) La topologia della rete di post sarebbe di aiuto.

  2. Una volta fatto, prova sudo route add -host 54.81.143.201 -iface en0o sudo ipfw. Se non sei sicuro del nome dell'adattatore, puoi specificare il suo indirizzo MAC, in questo modo:sudo route add -host 54.81.143.201 -link 14:10:9f:e7:fd:0a

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

  3. Se si riavvia, ciò potrebbe non persistere. Dovrai gestirlo separatamente.



2

Sono stato in grado di aggiungere un percorso attraverso un'interfaccia utilizzando l' -linkopzione per specificare un indirizzo MAC.

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

Questo invierà il traffico per 54.81.143.201l'interfaccia appropriata.

Hai due 192.168.15.*indirizzi host separati assegnati, uno a ciascuna interfaccia, giusto? Altrimenti, è possibile inviare traffico da entrambe le interfacce, ma il traffico tornerà su qualunque IP di origine dei pacchetti.


Quindi ho provato quello che hai suggerito usando mac addr, e stranamente la mia tabella di routing mostra una voce per en3 e non en0 -> 54.81.143.201 00: 1d.88.4a.21.da UGHS 0 0
en3

Quando fai un 'arp -an', quali voci hai ...?
Nevin Williams,

2

Questa soluzione funziona con l'ultimo MacOS 10.12 (Sierra). Ecco l' essenza .

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

Usa così:

> sudo ./route_wifi.sh IP_ADDRESS

Presuppone che l'interfaccia wifi sia: en1 .

Non dimenticare di inserire i valori corretti per le variabili wifi_router e wifi_address . Nota il formato wifi_address , che è: nome interfaccia di rete ' : ' address mac address with ' . ' delimitatori . Certo, la maggior parte delle informazioni richieste può essere analizzata dall'output del comando ifconfig , ma sono troppo pigro per questo =)


Benvenuto in Superuser. Prova a contenere le informazioni più pertinenti dal link nel tuo post. Leggi di più qui .
polistirolo vola il

1

Il routecomando OS X è documentato qui . Il -ifscopeparametro e il suo valore consentono di specificare un percorso associato all'interfaccia.

Questo, tuttavia, non è quello che vuoi. È necessario correggere le reti in modo che i loro intervalli IP siano univoci. Oltre a ciò, le metriche dell'interfaccia (ovvero le priorità) influenzano quale interfaccia viene scelta da un'opzione altrimenti altrettanto opportuna.


0

Ecco come tradurre il nome definito dall'utente "Wi-Fi" in qualsiasi nome di dispositivo (ad es. En0, en1, en9, ...) assegnato da MacOS in quel momento.

Puoi inserire queste funzioni in uno script specifico o semplicemente tenerle nel tuo .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
}

Quindi chiama get_int_name 'Wi-Fi'per ottenere il nome del dispositivo assegnato.

Per esempio:

route add -host 54.81.143.201 -interface $(get_int_name 'Wi-Fi')

-1

Quindi il server del fornitore con cui stai cercando di parlare del servizio "HipChat" che rivendichi è il 54.8.1.143.201? In questo caso, farei una voce di routing per 54.81.143.0 255.255.255.0 per dargli un intervallo più ampio. Forse quando si utilizza il software, non si sta sempre parlando con questo server specifico, ma un cluster di essi sulla stessa sottorete 54.81.143.0/24. Inoltre, assicurati che le metriche del tuo percorso siano corrette quando crei una nuova voce. Se si crea un percorso per 54.81.143.0/24 192.168.15.1 Metrico 20 En5, ma si ha anche un percorso per 0.0.0.0/0 10.7.90.1 Metrico 10 En0. Il computer ignorerà la nuova voce e continuerà a instradare il traffico attraverso il percorso predefinito (tramite En0) perché è preferibile. Ho appena scremato tutto questo e volevo sottolinearlo. Saluti!


-1

Dovresti provare ad aggiungere il nome NIC:

route add -net 10.13.0.0 netmask 255.255.0.0 dev NicNameHere

Questo funziona per me in CentOS.


Ottengo questo -> percorso: indirizzo
errato
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.