![我的 kali-linux 虚拟机上的互联网无法正常工作](https://linux22.com/image/160779/%E6%88%91%E7%9A%84%20kali-linux%20%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8A%E7%9A%84%E4%BA%92%E8%81%94%E7%BD%91%E6%97%A0%E6%B3%95%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C.png)
我正在使用 Kali-linux 作为操作系统在 Oracle VM 上设置一些虚拟机。当我创建第一个 NAT 网络时,互联网通常可以正常工作,但一旦我执行了诸如更改 MAC 地址之类的操作,互联网连接就会停止工作,即使机器说wired connection
是connected
.
如果我希望连接正常工作,我必须每次创建一个新的 NAT 网络,但一段时间后它将停止工作,我相信这与我更改我的 mac 地址有关,我的操作如下:
ifconfig eth0 down
ifconfig eth0 hw ether 'new mac address'
ifconfig eth0 up
有谁知道这个过程中可能会出现什么问题?
这些是我的当前结果ifconfig
:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.2.4 netmask 255.255.255.0 broadcast 10.0.2.255
inet6 fe80::a00:27ff:fe82:e693 prefixlen 64 scopeid 0x20<link>
inet6 fd17:625c:f037:2:a00:27ff:fe82:e693 prefixlen 64 scopeid 0x0<global>
inet6 fd17:625c:f037:2:8c24:fafd:c5e0:725c prefixlen 64 scopeid 0x0<global>
ether 08:00:27:82:e6:93 txqueuelen 1000 (Ethernet)
RX packets 44 bytes 11250 (10.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 423 bytes 38119 (37.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 24 bytes 1356 (1.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 24 bytes 1356 (1.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
答案1
您在这里观察到的是当您从 TCP/IP 堆栈下拉出地毯时发生的现象:D
请注意,这里实际上有两个现象......
1. 缺少默认网关的陷阱
这个很简单:
跑步ifconfig eth0 down
删除您的默认网关配置来自虚拟机的路由表;因为与该网关关联的网络已被删除。
跑步ifconfig eth0 up
意志不是恢复您的默认网关;它将仅保留旧的 IP 地址和子网掩码。如果您尝试运行route -n
,您将不会G
在“标志”列下看到任何带有 的行。
一旦发生这种情况,虚拟机中尝试访问 Internet 的任何程序都将收到“主机未找到“, 或者 ”网络不可达“ 错误。
您必须route add default gw GATEWAYIP
手动运行才能恢复默认网关。
- 不要忘记替换
GATEWAYIP
为您的实际默认网关地址。在执行此肮脏行为之前,请检查您的/etc/network/interfaces
或运行route -n
命令(并在“标志”列下查找该行的“网关”列);G
但无论如何它可能10.0.2.2
在 VirtualBox 下。
但即使恢复默认网关后,你会发现你的虚拟机仍然无法连接互联网;或者更准确地说,互联网无法回复它。那是因为...
2. 延迟 ARP 缓存的影响
您知道以太网上的 TCP/IP 使用ARP找到与IP匹配的MAC地址才能真正通信,对吗?
据我所知,这是 VirtualBox 实例内部发生的事情的时间线:
- 当你的虚拟机刚刚启动后,它使用原始的MAC地址来请求互联网上的东西。
- VirtualBox 的 NAT 引擎还需要虚拟机的 MAC 地址1才能将 Internet 上的数据传回虚拟机。
- VirtualBox 的 NAT 引擎最初并不知道您的虚拟机有哪个 MAC 地址;所以它发出 ARP 请求,你的机器用它的原来的MAC地址。
- VirtualBox 的 NAT 引擎将虚拟机的 MAC 地址(和关联的 IP 地址)存储在其 ARP 缓存中;这是很正常的事情。
- 您更改了虚拟机的 MAC 地址对于刚化妆的人来说,不改变其IP地址。
- 当您再次从虚拟机发出 Internet 请求时,它会使用新的 MAC 地址来请求。1
- VirtualBox 的 NAT 引擎收到您的请求(但只关心你的IP,而不关心MAC)并正常转发到互联网。
- 当互联网响应时,VirtualBox 的 NAT 引擎需要您的虚拟机的 MAC 地址来将此响应传递回您的虚拟机。
- VirtualBox 的 NAT 引擎在其自己的 ARP 缓存中查找虚拟机的 IP 地址,并发现MAC地址未过期的记录,因此不会再次发出ARP请求。 (尽管,VirtualBox 未知- 发现的 MAC 地址是旧的、过时的地址)。
- VirtualBox 的 NAT 引擎将 Internet 响应发送到您的虚拟机老的MAC 地址,而不是新的地址。
- 您的虚拟机(正在使用新的 MAC 地址)没有收到响应,并且超时;因此 ”我的 kali-linux 虚拟机上的互联网无法正常工作”。
即使默认网关配置得到修复后,虚拟机中的 Internet 访问仍将继续中断,直到所述 ARP 缓存条目过期,或者您更改了虚拟机的 IP 地址。
底线
我不知道VirtualBox的NAT引擎在内部缓存ARP响应多久;所以我建议解决方法更改IP地址更改虚拟机的 MAC 地址后,防止二次效应。另外,在更改 IP 地址并启动接口后,确保你也重新添加默认网关以防止第一个陷阱。 (用于route -n | grep UG
验证)
1有人可能认为 VirtualBox 的 NAT 引擎应该从每个请求数据包本身中获知虚拟机的 MAC 地址,这不是做事的方式;因为它允许大量随意的 IP/MAC 地址欺骗。因此,仅使用/缓存显式 ARP 请求请求的 MAC 地址进行路由;不是从随机数据包中学到的。