如何找出我使用哪个接口连接到互联网?

Lan*_*nes 75 linux routing

我有eth0,wlan0根据ifconfig,我可以ping google.com。

我如何才能找出(对于普通用户,而不是root)哪个接口处于活动状态,例如 ping(或其他什么,ping 不是强制性的)使用的接口是什么?

我使用的是 Ubuntu 11.04 或 Fedora 14

mtv*_*vec 66

您可以使用route来查找您的默认路由:

$ 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
Run Code Online (Sandbox Code Playgroud)

Iface目的地行中的列default告诉您使用的是哪个接口。

  • 我得到一行“默认... eth0”和一行“默认... wlan0”。那么哪一个是真正的默认值呢? (5认同)
  • 这不应该是公认的答案。如果使用 iproute 来定义自定义路由规则,则不能使用 ``route``。@Torgeir 给出了正确的答案。 (2认同)
  • 这个答案不正确。例如(并且给定答案中显示的相同路由),如果您 p​​ing 192.168.1.16(本地网络上的一台电脑),则以“192.168.1.0...”开头的条目是将要使用的路由。当然,在这种情况下,它指的是同一个 Iface,但这只是因为您的计算机上只有一个接口。 (2认同)

Ebr*_*owi 40

我的版本基本上基于这个和这个:

route | grep '^default' | grep -o '[^ ]*$'
Run Code Online (Sandbox Code Playgroud)

对于 macOS,这是实验性的:

route -n get default | grep 'interface:' | grep -o '[^ ]*$'
Run Code Online (Sandbox Code Playgroud)

  • 您不需要多个管道,只需使用`route |awk '/^default/{print $NF}'` (3认同)
  • @JohnAllard:如果我的更新现在为 macOS 提供正确答案,请告诉我。 (2认同)
  • 我得到两行:“eth0”和“wlan0”,所以我仍然不知道哪一个是活跃的...... (2认同)

小智 23

在 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)'
Run Code Online (Sandbox Code Playgroud)

  • 请解释这些命令在做什么。此外,你在这里可能很安全,因为你知道你的值是什么,但是,一般来说,你应该引用 shell 变量引用(除非你有充分的理由不这样做,并且你确定你知道你在做什么)。 (3认同)

Eug*_*neP 12

获取通常用于路由到与 DMZ、专用网络、VM 主机等相对的“剩余”互联网的默认网络接口,这些接口通常是明确路由的。

$ ip -4 route ls | grep default | grep -Po '(?<=dev )(\S+)'
eth0
Run Code Online (Sandbox Code Playgroud)

  • 它并不总是将您带到您想要的地方的默认路线。尽管 OP 最有可能使用默认路由来访问互联网,但这只是一个概括,可能并不总是成立。一句警告 (2认同)

h0t*_*1r3 11

一个班轮:

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

  • +1 为 `ip route get 8.8.8.8`,其余的在 **ubuntu 18.04** 上不起作用。我使用了更简单的方法:`ip route get 8.8.8.8 | 头-n1 | awk '{print $5}'` (2认同)

小智 10

Linux、Unix、某些版本的 Microsoft Windows 和许多其他操作系统的不同发行版不限于仅使用一个网络接口来访问互联网。\xc2\xa0\n许多操作系统将检测多个有效接口,能够到达互联网,并设置\xe2\x80\xafup 每个用于将流量传送到互联网(具体来说,是最终连接到互联网的网关)。

\n

如果\xc2\xa0the\xc2\xa0OS尝试访问外部网络并成功使用eth0,它将将该接口添加到路由表并将其绑定到该网络。\xc2\xa0\n如果\xc2\xa0the\xc2\xa0OS尝试要到达相同的外部网络\n并且\xc2\xa0也可以使用 成功eth1,\nit还会将该接口 ( eth1) 添加到路由表\nas中,这是到达同一网络的另一种方式。\xc2\xa0\n到目前为止,其他发帖者还没有考虑路由表中度量值的重要性。

\n

下面的我的路由表显示了两个不同的接口,eth0并且wlan0.\xc2\xa0\n两者都已启动,两者都已由操作系统自动设置为网关的默认路由192.168.1.1,\n和\xc2\xa0都已自动构建了一条路由由操作系统\n连接到(即\xc2\xa0 )网络。\xc2\xa0\n整个路由表是由操作系统自动写入的。\xc2\xa0\n我没有对其进行任何编辑。此处显示的差异是\n有线以太网接口 ( ) 的度量较低 (202),\n并且 \xc2\xa0 因此到我自己网络之外的节点的更多流量\n将通过此接口路由(这是较低的度量),\n而到网络之外的节点的其余流量\n将通过无线接口 ( )\n 路由(它的度量较高,为 303,因此操作系统不太喜欢\xc2\xa0)。192.168.1.X192.168.1.0/24eth0wlan0

\n
pi@raspberrypi:~ $ route\nKernel IP routing table\nDestination     Gateway         Genmask         Flags Metric Ref    Use Iface\ndefault         192.168.1.1     0.0.0.0         UG    202    0        0 eth0\ndefault         192.168.1.1     0.0.0.0         UG    303    0        0 wlan0\n192.168.1.0     0.0.0.0         255.255.255.0   U     202    0        0 eth0\n192.168.1.0     0.0.0.0         255.255.255.0   U     303    0        0 wlan0\n
Run Code Online (Sandbox Code Playgroud)\n

两个接口都用于连接“互联网”,并且它们的使用按“度量”值进行加权,如以下字节和数据包统计数据eth0所示wlan0:

\n
pi@raspberrypi:~ $ ip -s address\n1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000\n    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n    inet 127.0.0.1/8 scope host lo\n       valid_lft forever preferred_lft forever\n    inet6 ::1/128 scope host \n       valid_lft forever preferred_lft forever\n    RX: bytes  packets  errors  dropped overrun mcast   \n    0          0        0       0       0       0       \n    TX: bytes  packets  errors  dropped carrier collsns \n    0          0        0       0       0       0       \n2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000\n    link/ether dc:a6:32:31:a2:c7 brd ff:ff:ff:ff:ff:ff\n    inet 192.168.1.195/24 brd 192.168.1.255 scope global dynamic noprefixroute eth0\n       valid_lft 80787sec preferred_lft 69987sec\n    inet6 fe80::2f3f:3f1d:8c35:a05e/64 scope link \n       valid_lft forever preferred_lft forever\n    RX: bytes  packets  errors  dropped overrun mcast   \n    14341060   22393    0       0       0       971                             \xe2\x86\x90\xe2\x80\x94\xe2\x80\x94 high\n    TX: bytes  packets  errors  dropped carrier collsns \n    1190274    10745    0       0       0       0                               \xe2\x86\x90\xe2\x80\x94\xe2\x80\x94 high\n3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000\n    link/ether dc:a6:32:31:a2:c8 brd ff:ff:ff:ff:ff:ff\n    inet 192.168.1.193/24 brd 192.168.1.255 scope global dynamic noprefixroute wlan0\n       valid_lft 80787sec preferred_lft 69987sec\n    inet6 fe80::4f31:5fcf:8f70:b5ca/64 scope link \n       valid_lft forever preferred_lft forever\n    RX: bytes  packets  errors  dropped overrun mcast   \n    4963408    7954     0       0       0       929                             \xe2\x86\x90\xe2\x80\x94\xe2\x80\x94 lower\n    TX: bytes  packets  errors  dropped carrier collsns \n    49371      235      0       0       0       0                               \xe2\x86\x90\xe2\x80\x94\xe2\x80\x94 lower\n
Run Code Online (Sandbox Code Playgroud)\n

正如注释所示,eth0操作系统正在提供更多流量。

\n

许多操作系统将为连接速度较快的有线接口提供较低的度量,\n为连接较慢的有线接口提供较高的度量。\xc2\xa0\n例如,如果 和 都eth0连接eth1到同一节点,\但\xc2\xa0eth0协商了\xc2\xa0100\xe2\x80\xafMbs 连接,\n并且\xc2\xa0eth1仅协商了\xc2\xa010\xe2\x80\xafMbs 连接,\neth0将获得比 更低的度量eth1。 \xc2\xa0\n类似地,许多操作系统将为有线接口提供较低的度量,而为无线接口提供较高的度量。

\n

可以自动设置多个接口(取决于操作系统)\xe2\x80\xafup,也可以手动设置\xc2\xa0,以通过创建/编辑路由表条目来到达同一外部节点。

\n
\n

一个经过最低限度测试的脚本,用于查找具有最低指标\nas报告的接口route:[已添加\xc2\xa0by\xc2\xa0G-Man]

\n
route | awk '\n        BEGIN           { min = -1 }\n        $1 == "default" {\n                            if (min < 0  ||  $5 < min) {\n                                min   = $5\n                                iface = $8\n                            }\n                        }\n        END             {\n                            if (iface == "") {\n                                print "No \\"default\\" route found!" > "/dev/stderr"\n                                exit 1\n                            } else {\n                                print iface\n                                exit 0\n                            }\n                        }\n        '\n
Run Code Online (Sandbox Code Playgroud)\n

您可能想将其扩展为\xc2\xa0查看“标志”;即\xc2\xa0 $4。

\n

  • 对于那些拥有多个网卡的人来说,这将是最好的答案,我相信如果他们问OP的问题,这应该是这里的每个人? (2认同)

jas*_*yan 6

跑步ifconfig会给你你需要的信息。

活动界面将有一个inet addr并且将显示传输数据的记录,如下所示:

RX bytes:1930741 (1.8 Mb)  TX bytes:204768 (199.9 Kb)
Run Code Online (Sandbox Code Playgroud)

您也可以使用该ip addr命令,任何非活动接口都将被指定为具有:NO-CARRIER。

  • 正如海报所指出的那样,这不一定对具有多个接口的系统有帮助。更好的答案是使用 `route` 命令,尽管由于路由的原因,这也不一定是万无一失的。默认路由不一定是访问 Internet 的路由,尽管它可能经常是。 (2认同)

Sha*_*dur 5

该命令ip route ls将给出活动路由及其来源的列表:

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 
Run Code Online (Sandbox Code Playgroud)