前言
由于复现协议栈安全方向论文需要,我从零学习搭建虚拟机网络拓扑,在网上阅读了很多优秀的讲解类、实操类的文章(此处感谢我的入门教程,写的很详细,偶有不完整),终于成功了。
网络拓扑
目标
让Server、Client和Attacker之间能相互通信(用ping命令测试)
环境
Windows11(小声bb:Win11卡的一批,新买的电脑不到一周死机两次,但我懒得换OS了) VMware Workstation 16 Player(再次bb:不要靠近苹果m1,否则你会被迫买新电脑) 虚拟机OS我选的是Ubuntu,我的虚拟路由器用的ubuntu-20.04.4-live-server-amd64,其他主机用的是ubuntu-22.04-desktop-amd64。server版没有办法上下划拉滚轴看更早之前的运行记录,而且不能复制粘贴命令,慎用。router用server版还好,但主机(尤其是想跑自己代码的)就不要用了。
配置过程
- 拓扑图中主机下面标的是它的IP地址,准确地说,是它网络适配器(网卡)的IP地址,后面的/24是子网掩码,说明其IP的前24位标明所在子网,换句话说,与它IP前24位相同的设备和它在用一个子网下。同一个子网下的设备天然可以相互ping通,除非你做了别的事情,比如手动删除某个设备的本网段route条目,使它拒绝接受本网段的数据包;或是开了防火墙等等。不同子网下设备不能天然ping通。网关是数据包离开本子网时最后经过的那个边界路由器,一个子网的网关地址是这个边界路由器在该子网下的IP地址。本实验中,10.3.0.0/24子网的网关是10.3.0.1,以此类推。设置默认网关地址的意义在于,当路由表中没有本机想发或转发的目标IP对应的下一跳路由时,就把默认网关地址作为下一跳IP。
- 尽管拓扑图上相邻两台设备之间是直连的线,但事实上是通过让线段两端的设备连在同一个VMnet上实现的。VMnet是宿主机(的hypervisor)提供的虚拟网卡,有VMnet0-VMnet19共20个(可能不同计算机提供的个数不一样),其中VMnet0是桥接模式,虚拟机相当于一台实体机,可以自由访问与被访问及上网;VMnet1是host-only模式,虚拟机之间、主机与虚拟机之间互访,但虚拟机无法访问外网;VMnet8是NAT模式,虚拟机之间、主机与虚拟机之间互访,虚拟机可以通过主机访问外网,外网无法访问虚拟机。其他的就是普通的虚拟网卡(vmware中VMnet0、VMnet1、VMnet8是干什么的)。把相邻两台设备的网卡的连接模式设为同一个除0、1、8之外的自定义VMnet即可。
【注意!新的虚拟机先启动起来,sudo apt install net-tools (安装ifconfig)和sudo apt install vim 之后再设置!!!】 配置页面如图,可以在设置虚拟机的时候配置,也可以开启虚拟机之后配置(左上角Player( P ) -->管理–>虚拟机设置)。温馨提示,如果是开启虚拟机之后配置,刚配置完可能不生效,建议重启一下。 - router需要多个网络适配器,因为它连接了不同网段(子网),它在不同子网下的IP不同。也是在上图的界面添加新的网络适配器:添加–>网络适配器–>选择合适的VMnet。新添加完的网卡用
ifconfig 查不到地址,因为ifconfig 查看的是已经启动的网卡的信息,新的网卡还没有启动,需要用ip a 命令查看所有网卡,查到新网卡的名字,再sudo ifconfig <新网卡名字> up ,之后ifconfig 就能看到新网卡了。(即使ifconfig已经可以看到新网卡名字也要up一下 - 绑定在自定义VMnet上的网卡天然没有ip,你可以用
ifconfig 命令看到,对应网卡下面只有mac地址。桌面版可以进入网络设置,点击IPv4,在Addresses中添加本机的IP地址、子网掩码和网关地址(是它连接的路由器上和它在同一个子网下的网卡的IP),并关掉这个网卡的DHCP。这里面设置的东西是持久化的,虚拟机关机也不会抹去。server版临时修改IP的命令是:sudo ifconfig <网卡名> < IP > netmask <子网掩码> 。修改后ifconfig可以看到相应网卡有了IP地址。临时设置默认网关的命令是:sudo route add default gw <默认网关地址> 。但这个设置不持久,虚拟机挂起都会抹去,关机也会。持久的方法是修改netplan中配置: ① cd /etc/netplan ② vim 00-installer-config.yaml (不同计算机名称可能不同,但该文件夹中就这一个文件) ③ 如图配置addresses和gateway4,并且把dhcp设置为false: gateway4是与自己连接的路由器上和自己在同一个子网下的网卡的IP。router也可以配gateway4,配置为另一个路由器与自己直接连接的网卡的IP。注意,yaml对格式极其敏感,相同层次的配置缩进必须一致,不能混用空格和tab,并且,每个title的冒号后面要有一个空格! ④ sudo netplan try 测试yaml是否有格式问题或配置矛盾等(比如如果把两个网卡的gateway4设为同一个IP就会报错) ⑤ sudo netplan apply 正式激活设置 其实桌面版也有这个文件,但这个文件中写着,render: NetworkManager,即交给NetworkManager负责管理,NetworkManager反映到图形化界面上就是网络设置界面。 【注意,这个步骤中,多网卡设备千万注意IP别绑混了,要保证它和与它连在同一个VMnet下的网卡的IP在同一个子网。此外,激活设置后route表会恢复默认状态,丢弃新添加的内容】 这一步其实完成了配置IP和大部分配置路由表的工作(因为网络拓扑很简单)。如果所有网卡都只配置IP,则相邻两个设备可以相互ping通,但无法ping通任何其他网段的IP。如果所有网卡绑定好IP,主机还绑了网关,那么除了相邻两个设备相互能够ping通,主机也可以ping通与它相连的路由器其他网卡的IP;但左侧主机ping右侧路由器(e.g. Server ping 10.0.0.2 )无响应,以及左侧路由器ping右侧主机无响应,原因是路由器不允许转发(经典的能ping通子网网关但ping不通主机);左侧主机ping右侧主机(e.g. Server ping 10.1.0.5 )显示Network unreachable,原因还包括路由表中没有合适的下一跳路由(之前没有配置路由器的默认网关造成)。右侧路由器和主机ping左侧现象和原因同理。 - 作为router,转发是它的天职,但我们的router是Ubuntu系统,Ubuntu默认不开启转发。使用命令
sysctl net.ipv4.ip_forward 查看是否允许转发,如果=0则不允许。开启转发的命令是:echo 1 > /proc/sys/net/ipv4/ip_forward (需要root权限,而且好像sudo不行,需要先sudo -i 切换到root,再执行命令)。这个设置在虚拟机重启后会恢复为0,但挂起不影响。 这时候,如果所有的网卡都配好了IP和网关,并且路由器开启了转发,我们的目的就完成了,可以让不同网段的主机相互ping通了! 如果没有配置好默认网关,则要经过第5步。 - 使用命令route查看路由表。如果配置过网关但未手动添加、删除过route表项,路由表中会有其所在所有子网的表项,Gateway都是0.0.0.0,并且还有一项Destination列为default,Gateway列为_gateway。未配置过网关并且未手动添加过任何route的路由表中,应该只有本机所在的子网的条目。可以手动为表项中没有但我们想到达的子网添加表项:
sudo ip route add <目的子网>/<子网掩码长度> via <下一跳IP> 。这里注意,“目的子网”是子网,尽管匹配的时候用子网掩码&一下后面的位也会变成0,但子网地址的要求就是无关位为0。比如我想让router1能转发去往10.3.0.9(Server)的包,我需要sudo ip route add 10.3.0.0/24 via 10.0.0.1 。同理,我需要给router0:sudo ip route add 10.1.0.0/24 via 10.0.0.2 ,sudo ip route add 10.2.0.0/24 via 10.0.0.2 。 - 连在自定义VMnet上的虚拟机无法上网(你可以试试
ping www.baidu.com ,ping不通的)。但由于复现论文需要下载各种网络包,所以希望虚拟机能访问外部网站。解决方案是给主机也增加一张网卡,并使用NAT模式(VMnet8)。前面提到过,新绑的网卡可能不会立刻生效。此外,主机的两张网卡有时候不能同时工作,尽管它们显示都是已经开启的状态。解决方案是,当需要连接外网的时候,把内网网卡sudo ifconfig <网卡名> down 掉,或是在设置中把内网网卡turn off;连接内网的时候,把外网网卡关掉。千万别记混了…… - 大功告成
我的实验过程
在开始截屏之前,我已经设置过所有网卡的IP了,但只有BGPServer这台机器设置过默认网关。另外,做实验的时候充当server的BGPServer的ip是10.3.0.8,与拓扑图上略有些不同。 起始状态网卡配置和路由表: 此时相邻两个路由器相互可以ping通,但如果ping直连的设备的另一个ip,右边三个都ping不通,显示Network unreachable,只有第一个ping通了,因为第一个的/etc/netplan/00-xxxx.yml中设置了gateway4=10.3.0.1。(后续实验中我给attacker也设置好了gateway4=10.2.0.1) 手动给路由器路由表添加远处的子网表项后: 现在两个路由器可以ping通对方不与自己直连的ip了: 但是无法ping通对方不与自己直连的ip所在子网的其他主机地址,这是因为对方没有转发自己的数据包。查看路由器是否允许转发: 让路由器开启转发: 主机再次ping远处的路由器,都通了: 并且能够ping通远处路由器离自己远的ip了: 甚至ping通了彼此!!!!!!!!!!! 这是完全成功时候的路由表: 我现在尝试给两个交换机添加默认网关,把对方离自己近的网口的ip作为默认网关: 修改完毕后用netplan try + netplan apply激活,然后看路由表,只有当时新加的那条路由有区别: bgp和attacker仍然能够成功相互ping通: 大功告成!
|