我已经使用命令在 wlan0 上创建了一个虚拟接口ifconfig
,这是我所拥有的:
wlan0 Link encap:Ethernet IndirizzoHW c4:46:19:69:b7:a5
indirizzo inet:192.168.1.4 Bcast:192.168.1.255 Maschera:255.255.255.0
indirizzo inet6: fe80::c646:19ff:fe69:b7a5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:277003 errors:0 dropped:2 overruns:0 frame:0
TX packets:121609 errors:0 dropped:0 overruns:0 carrier:0
collisioni:0 txqueuelen:1000
Byte RX:329915637 (329.9 MB) Byte TX:17663121 (17.6 MB)
wlan0:1 Link encap:Ethernet IndirizzoHW c4:46:19:69:b7:a5
indirizzo inet:172.16.1.4 Bcast:172.16.255.255 Maschera:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
我在本地网络上的第二台电脑上做了同样的事情,并且ping 172.16.1.7
一切正常。
但我不明白一件事,因为我有两个IP,选择哪一个来发送icmp请求?原来的192.168.1.4
还是我创建的172.16.1.4
?
答案1
它是由内核中的路由策略规则决定的。如果运行以下命令,您可以检查内核将使用什么:
$ ip route get 172.16.1.7
172.16.1.7 dev wlan0 src 172.16.1.4
ip route show
您可以使用或ip ro
简称显示路由表(其中还显示它将用于该路由上的流量的源地址) 。
使用ping
with时-I
,您可以指定使用哪个接口:
ping -I 172.16.1.4 172.16.1.7
答案2
“虚拟接口”(wlan0:1
等等)只是一种告诉内核多个 IPv4 地址与网络接口关联的旧方法。在现代内核中,这些接口实际上并不存在,并且当您使用ip addr
.相反,仅列出所有分配的 IPv4 地址(此处显示的是 veth 对的一端):
$ sudo ifconfig veth0b:1 add 10.0.0.2
$ sudo ifconfig
veth0b: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.1 netmask 255.255.255.0 broadcast 0.0.0.0
inet6 fe80::801e:15ff:fe73:e98a prefixlen 64 scopeid 0x20<link>
ether 82:1e:15:73:e9:8a txqueuelen 1000 (Ethernet)
RX packets 58 bytes 7700 (7.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 15 bytes 1174 (1.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth0b:1:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.2 netmask 0.0.0.0 broadcast 0.0.0.0
ether 82:1e:15:73:e9:8a txqueuelen 1000 (Ethernet)
$ ip addr show dev veth0b
2: veth0b@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 82:1e:15:73:e9:8a brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.0.0.1/24 scope global veth0b
valid_lft forever preferred_lft forever
inet 10.0.0.2/0 scope global veth0b:1:0
valid_lft forever preferred_lft forever
inet6 fe80::801e:15ff:fe73:e98a/64 scope link
valid_lft forever preferred_lft forever
特别是,您不能选择“虚拟接口”作为要绑定到的接口:
$ ping -I veth0b:1 10.0.0.254
ping: invalid source address veth0b:1
但您可以选择 ping 的源 IP 地址(这相当于同一件事):
$ ping -I 10.0.0.1 10.0.0.254
$ ping -I 10.0.0.2 10.0.0.254
这实际上与路由或网关无关;路由由目的地址决定仅有的,除非策略路由有效,并且在任何一种情况下都发生在应用程序选择绑定到接口或选择特定源地址之后。
答案3
ping 有默认接口,你必须这样做:
ping -I wlan0:1 your_target