在GNS3中安装Kali Linux
介绍
有时,我们会想要在GNS3(Graphical Network Simulator-3,图形化网络模拟器3),一款用于模拟搭建网络的学习和实验软件中,添加Kali Linux设备,来用于攻防模拟练习。
然而,在GNS3中添加Kali Linux的步骤非常繁琐,而且可能遇到怪异的故障。
本篇文章会逐步指导你如何在GNS3中添加Kali Linux设备。
GNS3中添加Kali的默认逻辑
老旧的Kali版本
到目前为止,GNS3默认最高仅支持到Kali Linux 2021.1。这是一个老旧的版本,即便安装成功,也会出现很多怪异的问题,需要复杂的排故才能修复。还好,我们可以打破这一默认设定。在本文中,我们将使用最新的版本。截至目前,最新的Kali版本是2025.1a。
善于制造麻烦的自生启动(Live Boot)
除此之外,GNS3默认使用自生启动启动Kali。也就是说,我们仅需一个ISO镜像文件,就能直接使用Kali,无需先安装系统。这固然很方便,但导致很多功能受到限制,例如使用apt
命令时许多怪异行为。在本文中,我们将从硬盘(Hard Disk)启动来避免使用自生启动。
通常,从硬盘启动就意味着亲手制作硬盘文件,但我们有办法避免这一绵长的过程。
在GNS3中添加Kali Linux设备
现在,是时候开始操作了。
确保拥有最新版本的GNS3
如果你还未安装GNS3,你可以到GNS3官网安装它。在安装过程中,你必须安装GNS3 虚拟机(VM),它必不可少的组件之一。
如果你已经安装了GNS3,但客户端和VM均非最新版本,请参考这篇文章升级。
如果你在升级中遇到了怪异的问题,请参考这篇文章排查故障。
在本文中,我将使用Hyper-V运行GNS3 VM。有时,使用Hyper-V检查点时会遇到诡异的行为。请参考这篇文章解决。
打开GNS3客户端
接下来,我们需要启动GNS3客户端。确保稍等片刻后,GNS3 VM也跟着启动。
如果你正在使用Hyper-V但客户端却无法启动GNS3 VM,尝试使用管理员权限运行客户端。
添加模板
接下来,要想添加一款新设备(模板),点击新建模板
。
我们选择从GNS3服务器(即GNS3 VM)添加设备,然后点击下一步
。
我们将添加一款带有图形化界面的Kali设备,而不是运行在Docker容器中的纯命令行Kali轻量系统。所以我们选择
Kali Linux
,并点击安装
。
我们将把该设备的虚拟硬盘文件等配置文件存储在GNS3 VM上。选中对应选项,并点击下一步
。
GNS3 VM将使用用来运行x86和x64架构的QEMU虚拟机软件来运行Kali虚拟机。直接点击下一步。
接下来,我们注意到,GNS3最高只支持到Kali的2021.1版本。所以为了创建一个自定义的新版本,点击创建新版本
。
我们将新版本命名为2025.1a
。你可以根据你使用的版本来命名。
尽管我们不会使用自生启动,但GNS3仍要求我们添加一个ISO镜像。那么我们就会在之后添加Kali 2025.1a的ISO镜像,来以防万一。但现在GNS3要求我们为镜像文件指定一个默认名称。你可以设置成与官方文件名一致或随便填写。
添加Kali设备所使用的硬盘文件的文件名,可以随意填写。
之后,创建的新版本会在窗口底部显示。
之后,我们勾选允许自定义文件
。因为我们将上传这个GNS3并不认识的新版本的文件。启用此选项,来防止GNS3认为我们文件的特征不是它所认识的。
接下来我们看到GNS3指出还没有上传该版本所需的安装文件。
因此,我们将前往Kali官网(old.kali.org),下载这些文件。
我们在Kali-images
下找到最新版本。
找到适用于amd64架构的自生启动ISO镜像,和适用于QEMU虚拟机的预制系统启动盘,并点击下载。
下载完成后,解压包含QEMU虚拟硬盘文件的7z文件。
接下来,是时候导入文件到GNS3 VM上去了。我们先导入ISO镜像。选中镜像文件,点击导入
,找到刚刚下载的镜像文件并打开。
等待GNS3将文件上传到GNS3 VM。
我们注意到文件已上传到GNS3 VM。接下来,用同样的方法导入QEMU虚拟磁盘文件。
上传完成后,GNS3指出该版本已可准备安装。点击下一步
。
模板新建步骤即将结束。GNS3指出,Kali Linux的默认密码是“toor”(root的颠倒)。然而事实并非如此。至少在现今,默认用户名是kali,密码也是kali。点击结束
完成导向。
我们成功创建了Kali的模板。
并且,该模板也在所有设备中显示了出来。
更改模板配置
然而,此时,我们还不能立刻开始使用Kali Linux。
默认情况下,GNS3会试着从ISO镜像自生启动,而不是我们想要的从虚拟硬盘启动,尽管我们提供了虚拟硬盘文件。我们需要更改模板的配置,使每一个我们创建的Kali设备都从虚拟硬盘启动。
我们右键该模板,并点击配置模板
。
我们将启动优先级更改为HDD
,使得QEMU知道要尝试从硬盘启动虚拟机。
顺带着,我们将内存改成2个G。这将更改分配给我们每一个创建的Kali虚拟机的内存。在一些较老的Kali版本上,1G足矣,但对于较新的版本,小于2G的内存很容易致使它内存溢出。
启动!
至此,终于大功告成。我们可以开始使用Kali Linux了。新建一个项目,将一台Kali设备拖入工作区,然后启动。
点击终端
,我们将被自动转跳到Kali的图形化界面的VNC连接。
管理Kali Linux
在GNS3中添加完Kali后,我们在使用时可能还会碰到问题。你可能想使用一个该虚拟机并未自带的工具,这时你就需要通过诸如apt install
等命令安装,而安装需要联网。
好在,不同于网络模拟软件Cisco Packet Tracer,GNS3中的虚拟设备可以连接到真正的网络。我们将为Kali联网,使得我们能够自由操控它,就像一台真正的设备一样。
GNS3中的互联网
在GNS3中,我们可以将设备连接到一个叫“云”的设备来真正联网。云通常在拓补图中代表互联网,这也就是为什么GNS3采用了这种设计方式。
GNS3中有两种云——“云”和“网络地址转换(NAT,Network Address Translation)云”。它们都提供上网,但网络地址转换云使得你的设备没法与GNS3 VM所在局域网内的IP地址进行直接通信,因为它使用了端口地址转换(PAT)。
除此之外,这两者还有如下行为。
- 有些时候,GNS3中的云和NAT云总是只有一个可用。当一个可用时,另一个总是会出现奇怪的错误。
- 云支持连接的设备用DHCP获取云自己的信息。
- 但NAT云有时不支持,有时支持。当与NAT云连接时,网段为
192.168.122.0/24
,NAT云即网关的地址是192.168.122.1
。如果NAT云不响应DHCP请求,请自行配置静态IP,并手动填写默认网关等信息。
直接连接到互联网
我们将先展示通过云上网。
最简单的方式是直接将Kali连接到云,这样Kali就能自动通过DHCP获取IP地址和网关等信息,从而上网。
当使用NAT云时,如果NAT云不回复DHCP请求,你可能需要手动为Kali填写一个静态IP以及默认网关等。
通过路由器连接到互联网
有时,我们可能想通过路由器连接到互联网,尽管这在简单配置中多此一举。因为,例如,你可以先将Kali临时连接到云,下载好要用的软件,然后断开。
路由器连接云
当你将路由器连接到云时,我们可以这样配置使得你的设备都能够上网。
值得注意的是,小气的思科将未激活的路由器虚拟机的数据处理网速都限制在1Mbps左右。
首先,我们确保路由器自身能够上网。其WAN接口将通过DHCP从云获取上网信息,然后尝试上网。
R1#config terminal
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)#interface g0/1
R1(config-if)#ip address dhcp
R1(config-if)#no shutdown
R1(config-if)#
*Apr 25 02:05:15.166: %LINK-3-UPDOWN: Interface GigabitEthernet0/1, changed state to up
*Apr 25 02:05:16.166: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/1, changed state to up
R1(config-if)#
*Apr 25 02:05:23.981: %DHCP-6-ADDRESS_ASSIGN: Interface GigabitEthernet0/1 assigned DHCP address 172.20.23.39, mask 255.255.240.0, hostname R1
R1(config-if)#do show ip interface brief
Interface IP-Address OK? Method Status Protocol
GigabitEthernet0/0 unassigned YES unset administratively down down
GigabitEthernet0/1 172.20.23.39 YES DHCP up up
GigabitEthernet0/2 unassigned YES unset administratively down down
GigabitEthernet0/3 unassigned YES unset administratively down down
R1(config-if)#do ping 8.8.8.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 16/17/19 ms
R1(config-if)#
接下来,我们需要在路由器上配置NAT,使得所有在192.168.1.0/24
的终端设备也能上网。否则,云将因为找不到192.168.1.0/24
的路由而无法转发响应数据。
R1#config terminal
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)#interface g0/0
R1(config-if)#ip address 192.168.1.1 255.255.255.0
R1(config-if)#no shutdown
R1(config-if)#
*Apr 25 02:10:46.350: %LINK-3-UPDOWN: Interface GigabitEthernet0/0, changed state to up
*Apr 25 02:10:47.350: %LINEPROTO-5-UPDOWN: Line protocol on Interface GigabitEthernet0/0, changed state to up
R1(config-if)#ip nat inside
R1(config-if)#
*Apr 25 02:11:43.017: %LINEPROTO-5-UPDOWN: Line protocol on Interface NVI0, changed state to up
R1(config-if)#interface g0/1
R1(config-if)#ip nat outside
R1(config-if)#access-list 1 permit 192.168.1.0 0.0.0.255
R1(config)#ip nat inside source list 1 interface g0/1 overload
R1(config)#
之后,如果你不想在Kali上手动设置静态IP,可以让路由器担任DHCP服务器。
R1(config)#ip dhcp pool MYPOOL
R1(dhcp-config)#network 192.168.1.0 /24
R1(dhcp-config)#dns-server 8.8.8.8
R1(dhcp-config)#default-router 192.168.1.1
R1(dhcp-config)#end
R1#
*Apr 25 02:18:18.654: %SYS-5-CONFIG_I: Configured from console by console
R1#show ip dhcp binding
Bindings from all pools not associated with VRF:
IP address Client-ID/ Lease expiration TypeHardware address/User name
192.168.1.2 010c.9a59.0e00.00 Apr 26 2025 02:17 AM Automatic
R1#
至此,Kali已能上网。
有时,Kali可能未能从路由器获取默认网关和DNS服务器,而又因为没有安装dhclient而无法更新信息,此时最简单的方法是重启Kali。
之后将一切正常。
路由器连接NAT云
此时,一些配置将稍有不同。
当NAT云不响应DHCP发现请求时,你就需要在路由器上手动配置默认路由以及WAN接口IP地址。
R1#config terminal
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)#interface g0/1
R1(config-if)#ip address 192.168.122.100 255.255.255.0
R1(config-if)#no shutdown
R1(config-if)#do show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGPD - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter areaN1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2E1 - OSPF external type 1, E2 - OSPF external type 2i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2ia - IS-IS inter area, * - candidate default, U - per-user static routeo - ODR, P - periodic downloaded static route, H - NHRP, l - LISPa - application route+ - replicated route, % - next hop override, p - overrides from PfRGateway of last resort is not set192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.1.0/24 is directly connected, GigabitEthernet0/0
L 192.168.1.1/32 is directly connected, GigabitEthernet0/0192.168.122.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.122.0/24 is directly connected, GigabitEthernet0/1
L 192.168.122.100/32 is directly connected, GigabitEthernet0/1
R1(config-if)#ip route 0.0.0.0 0.0.0.0 g0/1 192.168.122.1
R1(config)#do show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGPD - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter areaN1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2E1 - OSPF external type 1, E2 - OSPF external type 2i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2ia - IS-IS inter area, * - candidate default, U - per-user static routeo - ODR, P - periodic downloaded static route, H - NHRP, l - LISPa - application route+ - replicated route, % - next hop override, p - overrides from PfRGateway of last resort is 192.168.122.1 to network 0.0.0.0S* 0.0.0.0/0 [1/0] via 192.168.122.1, GigabitEthernet0/1192.168.1.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.1.0/24 is directly connected, GigabitEthernet0/0
L 192.168.1.1/32 is directly connected, GigabitEthernet0/0192.168.122.0/24 is variably subnetted, 2 subnets, 2 masks
C 192.168.122.0/24 is directly connected, GigabitEthernet0/1
L 192.168.122.100/32 is directly connected, GigabitEthernet0/1
R1(config)#do ping 8.8.8.8
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 8.8.8.8, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 16/17/18 ms
R1(config)#
除此之外,诸如DHCP或NAT的配置并不需要更改。
联网更新
至此,Kali已经能够上网,并下载我们想要的软件了,例如
sudo apt update && sudo apt install yersinia
保存Kali配置
如果你使用过诸如Cisco路由器和交换器的设备,就会注意到除非保存当前配置,下次重启(reload)后,配置又会变回原样。
我们需要通过使用命令将配置保存。此时,GNS3也才会记得配置的更变。
R1#write
Building configuration...
[OK]
R1#
*Apr 25 02:53:38.315: %GRUB-5-CONFIG_WRITING: GRUB configuration is being updated on disk. Please wait...
*Apr 25 02:53:38.976: %GRUB-5-CONFIG_WRITTEN: GRUB configuration was written to disk successfully.
R1#
SW1>enable
SW1#copy running-config startup-config
Destination filename [startup-config]?
Building configuration...
Compressed configuration from 3203 bytes to 1711 bytes[OK]
SW1#
*Apr 25 02:57:09.164: %GRUB-5-CONFIG_WRITING: GRUB configuration is being updated on disk. Please wait...
*Apr 25 02:57:09.817: %GRUB-5-CONFIG_WRITTEN: GRUB configuration was written to disk successfully.
SW1#
当你使用自生启动启动Kali时,除非使用USB持久选项,否则下次自生启动时,更改全会消失。
但好在,我们现在使用硬盘启动Kali。让我们做一个测试。
在Kali中,在桌面上创建一个TXT文件。
cd ~/Desktop
printf "Some text" | tee test.txt
直接关闭GNS3并重新打开项目。
我们发现我们创建的TXT文件仍然存在。说明配置能够被记住。
结语
至此,我们已经了解了,如何在GNS3中添加Kali Linux的完整步骤,以及各种容易踩坑的相关注意事项。