Comment savoir quelle interface j'utilise pour me connecter à Internet?

48

J'ai eth0 et wlan0 selon ifconfig et je peux le faire ping google.com. Comment puis-je savoir (avec un utilisateur normal, pas avec root) quelle interface est active , par exemple, quelle interface le ping (ou autre, le ping n'est-il pas obligatoire) utilisait-il?

NOTE: en utilisant Ubuntu 11.04 ou Fedora 14

LanceBaynes
la source
2
Les solutions ci-dessous semblent vouloir que vous fassiez l'inférence vous-même, ce qui ne semble pas correct. (Et toutes les tables de routage ont l'air incroyablement simples!) Alors que je cherche l'équivalent Windows, il apparaît que "ip route get <ip-address>" vous indiquera quelle interface serait utilisée si vous tentiez de vous connecter à un adresse IP donnée.
Mwardm
En rapport avec la défaillance du serveur: recherchez l'interface permettant de router vers un hôte spécifique (ce que je recherchais lorsque je me suis retrouvé ici).
Wildcard

Réponses:

48

Vous pouvez utiliser routepour trouver votre route par défaut:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     *               255.255.255.0   U     1      0        0 eth0
link-local      *               255.255.0.0     U     1000   0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

La Ifacecolonne dans la ligne avec destination defaultvous indique quelle interface est utilisée.

Emploi
la source
1
@Job au cas où nous aurions une adresse IP, comment trouver l'interface utilisée?
Bionix1441
1
Cela ne devrait pas être la réponse acceptée. Si iproute a été utilisé pour définir des règles de routage personnalisées, routene peut pas être utilisé. @Torgeir a le droit de répondre.
Joseph Garrone
1
Cette réponse n'est pas correcte. Par exemple (et avec les mêmes itinéraires affichés dans la réponse), si vous envoyez une requête ping à 192.168.1.16 (un ordinateur de votre réseau local), l'entrée qui commence par 192.168.1.0...est l'itinéraire qui sera utilisé. Bien sûr, dans ce cas, il s'agit du même Iface, mais c'est simplement parce que vous avez une interface sur votre machine.
kdehairy
1
@Job Même avec google.com, si vous avez deux itinéraires sur une interface différente, la correspondance avec le masque le plus long sera sélectionnée (pas nécessairement la valeur par défaut). Tout ce que par défaut signifie, c’est que si aucune autre route n’est trouvée,
consultons
1
Je reçois une ligne "default ... eth0" et une ligne "default ... wlan0". Alors, quel est le vrai défaut?
AstroFloyd
26

Ma version qui est essentiellement basée sur ceci et ceci :

route | grep '^default' | grep -o '[^ ]*$'

Et ceci, expérimentalement , pour macOS:

route -n get default | grep 'interface:' | grep -o '[^ ]*$'
Ebrahim Byagowi
la source
1
Y at-il un moyen pour vous de traduire cela pour OSX?
John Allard le
1
@JohnAllard: dites-moi si ma mise à jour donne maintenant une réponse correcte pour macOS.
Ebrahim Byagowi
vous n'avez pas besoin de plusieurs tuyaux, utilisez simplementroute |awk '/^default/{print $NF}'
P ....
J'obtiens deux lignes: "eth0" et "wlan0", donc je ne sais toujours pas lequel est actif ...
AstroFloyd
9

Sur les systèmes GNU / Linux:

#!/bin/sh

# host we want to "reach"
host=google.com

# get the ip of that host (works with dns and /etc/hosts. In case we get  
# multiple IP addresses, we just want one of them
host_ip=$(getent ahosts "$host" | awk '{print $1; exit}')

# only list the interface used to reach a specific host/IP. We only want the part
# between dev and src (use grep for that)
ip route get "$host_ip" | grep -Po '(?<=(dev )).*(?= src| proto)'
Torgeir
la source
1
Veuillez expliquer ce que font ces commandes. En outre, vous êtes probablement assez en sécurité ici, car vous connaissez vos valeurs, mais, en général, vous devriez citer des références de variables shell (sauf si vous avez une bonne raison de ne pas le faire et que vous êtes sûr de savoir ce que vous faites ).
G-Man dit 'Réintégrez Monica'
1
Fait, dans une certaine mesure. Seulement posté ceci parce que je ne pouvais rien trouver qui fasse exactement cela. J'utilise cela comme un fait d'usage dans un manifeste de marionnettes ...
Torgeir
Votre réponse est plus correcte s'il hosts'agit d'un argument d'entrée du script. Comme la route (et donc l'interface) pourrait être différente pour différents ips.
kdehairy
6

Courir ifconfigvous donnera les informations dont vous avez besoin.

L’interface active aura un inet addret montrera un enregistrement des données transmises, comme ceci:

RX bytes:1930741 (1.8 Mb)  TX bytes:204768 (199.9 Kb)

Vous pouvez également utiliser la ip addrcommande et les interfaces inactives seront désignées comme: NO-CARRIER.

jasonwryan
la source
Puisque OP ne veut pas être root, vous devriez peut-être donner un chemin complet à l'exécutable?
Tshepang
Aucune de ces commandes ne nécessite des privilèges élevés.
jasonwryan
1
Ubuntu et Arch: les deux fonctionnent avec des privilèges normaux (même si sur Ubuntu, il s'agit de / sbin)
jasonwryan
1
@Shadur Pas sur mon installation d'Ubuntu 10.10 et selon help.ubuntu.com/community/EnvironmentVariables, le $ PATH par défaut est/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:
jasonwryan le
2
Cela ne va pas nécessairement aider sur un système avec plusieurs interfaces, comme l'a indiqué l'affiche. Une meilleure réponse consiste à utiliser la routecommande bien que cela ne soit pas nécessairement infaillible à cause du routage. La route par défaut ne doit pas nécessairement être celle qui permet d’accéder à Internet, même si cela se produit souvent.
user1801810
6

Bon mot:

ip route get 8.8.8.8 | sed -n 's/.*dev \([^\ ]*\) table.*/\1/p'

h0tw1r3
la source
Il y a une citation pendante. Ne fonctionne pas du tout tel
quel
@Krease Author a mis à jour sa réponse
Vadim Kotov
5

Obtenez l'interface réseau par défaut généralement utilisée pour acheminer vers l'internet "restant", par opposition à la DMZ, le réseau privé, l'hôte de machine virtuelle, etc. qui sont généralement routés explicitement.

$ ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)'
eth0
EugeneP
la source
ce n'est pas toujours la route par défaut qui vous amène à l'endroit souhaité. Bien que le PO utilise très probablement la route par défaut pour accéder à Internet, il s’agit d’une généralisation qui risque de ne pas toujours être vraie. Un mot de prudence
MelBurslan
Bien sûr, ce n'est que l'interface réseau par défaut. S'il y a plusieurs connexions, il ne faut pas vraiment parler de "connexion à Internet", mais plutôt d'une interface réseau utilisée pour le routage vers la destination exacte.
EugeneP
Vous n'avez pas besoin d'utiliser plusieurs tuyaux / greps,ip -4 route ls |awk '/^default/{print $5}'
P ....
2

La commande ip route lsdonnera une liste des routes actives et leurs sources:

caleburn: ~/ >ip route ls
192.168.10.0/24 dev eth0  proto kernel  scope link  src 192.168.10.7 
default via 192.168.10.254 dev eth0 
Shadur
la source
1

Utilisez cette commande:

$ route | grep default | awk '{print $8}'
enp0s3
Larry Catt
la source
[root @ linux1 network-scripts] # ​​route | grep default | awk '{print $ 8}' enp0s3 [racine @ linux1 scripts de réseau] #
Larry Catt
0

Si votre machine a plusieurs interfaces (ce qui, je suppose), aucune interface ne sera utilisée pour la connexion à Internet.

En fonction de la destination à laquelle vous vous connectez, votre système consultera la table ip (celle affichée lors de la routecommande) pour trouver le prochain hope / routeur. Lorsqu'il en trouvera une, il utilisera l'interface qui lui est associée.

Cela dit, veuillez vous référer à la réponse de @ torgeir, qui dit exactement cela:

  1. Étant donné un domaine (codé en dur comme google.com, ce qui est le seul inconvénient de la réponse)
  2. Résout c'est ip
  3. Consulte la table ip de la route à utiliser (et donc l'interface).
Kdehairy
la source