一次性付费进群,长期免费索取教程,没有付费教程。
进微信群回复公众号:微信群;QQ群:460500587
教程列表
见微信公众号底部菜单 |
本文底部有推荐书籍
微信公众号:计算机与网络安全
ID:Computer-network
几乎所有从事IT相关工作的人都会时不时从远程位置访问他们的专业工具。假设那些用以访问远程位置的公共网络本质上都是不安全的,那么,需要小心地控制这些连接。
本文将使用VirtualBox虚拟机以及加密技术来构建一个虚拟的专用网络(VPN)隧道,以实现安全的、不可见的远程连接。此外,在一个独立的项目中,将设计更为复杂的防火墙体系,策略性地把网络划分为多个隔离的网段。最后,将在VirtualBox中构建一个虚拟网络环境,从而可以测试配置。
合理设计的VPN隧道在远程客户端与服务器之间提供了直接连接,在不安全的网络上以隐藏的方式传输数据。VPN的实际价值在于,一旦隧道打开,就可以连接到远程网络,如同这些都是本地网络。
使用这样的扩展网络,无论管理员当前处于什么位置,都可以在服务器上进行工作。但更为重要的是,如图1所示,资源分布在多个分支机构的公司可以让这些资源对所有团队是可见的和可访问的,无论他们在哪里。
仅仅单独采用隧道本身并不能保证安全。但将诸多加密标准中的某个标准合并到该设计中,就可以让事情变得更好。采用OpenVPN开源软件包构建的隧道使用了TLS/SSL加密。OpenVPN并不是构建隧道的唯一可用选择,但它是最有名的一个。而且,人们广泛地认为,它比采用IPsec加密的二层隧道协议(L2TP)更快且更安全。
希望团队成员能够在出行途中彼此实现安全连接。为此,需要构建一个OpenVPN服务器来支持应用之间的共享以及访问服务器的本地网络环境。为了完成这项工作,启动两个虚拟机或者容器就足够了:一个作为服务器或宿主机,另一个则作为客户端。创建VPN需要的步骤相当多,因此,值得花点时间来思考它是如何工作的。
如果想在自己的机器上完成这个过程,可能会发现自己在用桌面上打开的多个终端窗口进行工作,每个窗口都登录到不同的机器。有时会在某个时刻将命令输入错误,并完全搞乱自己所处的工作环境。为了避免这个问题,可以使用hostname命令把显示在命令行的机器名称修改为可以形象地提示所在位置的名字。一旦完成这个操作,需要退出该服务器并重新登录,以使这些新的设置生效。操作方法如下:
按照此方法为使用的每一台机器指定合适的名字,这有助于跟踪所处的位置。
使用hostname命令后,随后运行命令时可能会遇到烦人的“Unable to Resolve Host OpenVPN-Server”(不能解析宿主OpenVPN服务器)消息。更新/etc/hosts文件来匹配新的hostname可以解决这个问题。
在服务器上安装OpenVPN需要两个软件包:OpenVPN以及用于管理加密密钥生成过程的easy-rsa。对于CentOS用户,如有必要,应该首先安装epel版的软件仓库。为了找到一个测试访问服务器应用的简单方式,也可以安装Apache Web
服务器
(Ubuntu上是apache2,CentOS上是httpd)。
在配置服务器时,最好操作正确并激活一个只允许端口22(SSH)和端口1194(默认的OpenVPN端口)的防火墙。本例说明了Ubuntu ufw上的工作方式,CentOS的防火墙firewalld:
为了允许服务器上不同网络接口之间的内部路由,需要取消/etc/sysctl.conf文件中对特定行的注释(net.ipv4.ip_forward=1)。这让远程客户在连接后,可以根据需要进行重定向。要想加载新的设置,请运行sysctl-p命令:
现在,服务器环境已经完全建立,但在一切就绪之前仍然还有一段路要走。
简单起见,将在运行OpenVPN服务器的同一台机器上设置密钥基础设施。然而,安全最佳实践中常常建议在产品级部署中使用一台独立的CA服务器。无论何种情形,图2都可以说明为OpenVPN应用生成和分发加密密钥资源的过程。
图2 PKI服务器将会创建的文件以及它们的分发目标
安装OpenVPN时,会自动创建一个/etc/openvpn/目录,但这还不是全部。openvpn和easy-rsa软件包中都提供了样本模板文件,可将这些文件作为配置的基础。若要启动认证过程,请将easy-rsa的模板目录从/usr/share/拷贝到/etc/openvpn/,随后切换到easy-rsa/目录:
由于easy-rsa目录现在包含相当多的脚本,所以,表1给出了将用于实现密钥的工具的快速预览。
这些操作需要root权限,如果采用sudo su命令,需要变为root用户。
工作中,会用到的第一个文件是vars,其包含了easy-rsa在生成密钥时用到的一组环境变量。编辑该文件,从而用自己的值替代样本中已经存在的默认值。本例文件的形式如图3所示。
图3 /etc/openvpn/easy-rsa/vars文件的关键内容节选
运行vars文件将把它的值传递给shell环境,在该环境中,这些值将合并到新密钥的内容中。为什么单靠sudo不能工作?这是因为,第一步编辑了名为vars的脚本文件,之后就去获取它。获取(Sourcing)意味着该vars文件将把它的值传递给shell环境,在该环境中,这些值将合并到新密钥的内容中。
如果需要完成一个未完成的过程,请确保使用新的shell来重新运行该文件。完成时,该脚本将支持运行clean-all脚本,以删除/etc/openvpn/easy-rsa/keys/目录下任何已有的内容:
下一步将会顺序运行clean-all脚本以及build-ca脚本,使用pkitool脚本创建根证书。此时会要求对vars提供的验证设置进行确认:
接下来是build-key-server脚本。因为它使用相同的pkitool脚本以及新的根证书,所以,将被询问相同的确认问题以生成一个密钥对。基于所传递的参数,系统将给这些密钥设定名称,除非正在机器上运行多个VPN,否则传递的参数通常为server,如本例所示:
OpenVPN使用由Diffie-Hellman算法(运行build-dh)生成的参数为新连接进行身份验证协商。这里创建的文件无须保密,但它必须是使用build-dh脚本在当前活动的RSA密钥上生成的。如果在未来的某个时刻创建了新的RSA密钥,也需要更新Diffie-Hellman文件:
现在,服务器端的密钥将被写入/etc/openvpn/easy-rsa/keys/目录,但是OpenVPN并不知道这些。OpenVPN默认在/etc/openvpn/目录下进行查找,因此,要将它们复制过去,操作如下:
TLS使用了匹配的密钥对:一个安装在服务器上,另一个则安装在远程客户端。这意味着需要客户端密钥。pkitool是适合做这些事情的工具。本示例将仍在/etc/openvpn/easy-rsa/目录中运行,传递一个client参数来生成名为client.crt和client.key的文件:
这两个客户端文件和仍保存在keys/目录中的原始ca.crt文件将安全地传输到客户端。鉴于它们的所有权以及权限,这可能有点复杂。最简单的方法是将源文件的内容手动复制到桌面上运行的终端中,之后再登录到客户机的第二个终端上将其粘贴到所创建的同名新文件中。
但是,任何人都能剪切和粘贴。要像管理员一样思考,因为并非总能访问支持剪切和粘贴的GUI系统。将这些文件复制到主目录(从而,远程scp操作可以访问这些文件),之后使用chown将文件的所有权从root用户改为常规的非root用户,以便远程scp操作可以执行。请确保所有文件都已安排就绪。稍后,要将这些文件移动到客户端:
在为本操作准备好一整套加密密钥后,需要告诉服务器您想怎样构建VPN。这里是用server.conf文件完成的。
可以减少按键次数。大括号扩展有助于将这6个命令减少至2个。包括了多个乃至数百个元素的命令应用这一规则:
OpenVPN安装留下了一个可以复制到/etc/openvpn/目录的压缩的模板文件。我们用该压缩模板来介绍一个有用的工具:zcat。
用cat命令将文件的文本内容打印到屏幕,但如果该文件是用gzip压缩的需要先解压该文件,然后cat命令就可以将它显示出来,但这需要很多步骤才能完成。可以使用zcat在一步内将解压的文本装载到内存中。本例并没有将其显示到屏幕上,而是将文本重定向到一个称为server.conf的新文件中:
省略该文件中大量有帮助的文档后,图4是完成编辑后的样子。注意,分号(;)告诉OpenVPN不要读取和执行其后的行。
图4 /etc/openvpn/server.conf文件中的一些有效设置
● 默认情况下,OpenVPN工作在1194端口。可以改变该端口,可能是为了进一步隐藏您的活动或者避免与其他有效的隧道发生冲突。因为至少需要在客户端之间进行协调,所以1194通常是最佳选择。
● OpenVPN使用传输控制协议(Transmission Control Protocol,TCP)或用户数据报协议(User Datagram Protocol,UDP)来传输数据。TCP可能会慢一点,但更加可靠,并且更能够与在隧道两端运行的应用和谐相处。
● 当想创建一个仅用于传输数据内容的更简单有效的IP隧道时,可以指定dev tun。另一方面,如果需要通过创建一个以太网桥来连接多个网络接口(以及它们所表示的网络),之后必须选择dev tap。
● 下面四行将三个服务器认证文件的名字和早前创建的dh2048参数文件传递给OpenVPN。
● server行对子网范围及掩码进行设置,用于在客户登录时为其分配IP地址。
● 可选的push"route 10.0.3.0 255.255.255.0"设置允许远程客户访问该服务器后端的私有子网。要想让其工作,还要求服务器自身的网络配置能确保该私有子网可以感知OpenVPN子网(10.8.0.0)。
● port-share localhost 80行允许来自端口1194的客户流量被重定向到监听80端口的本地Web
服务器
(在本例中这很有用,因为将用Web服务器测试VPN)。只有proto被设置为tcp时,它才能工作。
● 应该删除分号(;)来使user nobody和group nogroup行生效。强制远程客户以nobody和nogroup工作,可以保证他们在服务器上的会话不享受任何特权。
● 每次OpenVPN启动时,log设置用当前的日志条目覆盖旧的条目。openvpn.log本身会被写入/etc/openvpn/目录。
另外,在配置文件中添加client-to-client是很常见的,由此,除了OpenVPN服务器之外,多个客户将彼此可见。一旦您对所做的配置感到满意,就已经准备好启动这台OpenVPN服务器了:
由于OpenVPN与systemd之间关系演化的本质,启动该服务有时需要这样一个语法:systemctl start openvpn@server。
现在,运行ip addr命令列出服务器的网络接口,将包括一个对tun0新端口的引用。这是由OpenVPN为传入的客户所创建的:
在服务器上正确地配置OpenVPN可以引导隧道一端的传入和传出流量。但是,还需要在客户端运行某种软件。
下面手动配置Linux
计算机
作为OpenVPN客户端。这并不是可以使用该服务的唯一方式。OpenVPN本身维护了一组客户端应用,其可以在Windows或Mac台式机与笔记本上,也可以在Android或iOS智能手机与平板上安装和使用。
尽管要使用的密钥已经存在,并不需要在客户机上安装easy-rsa,但还是需要在客户端计算机上安装OpenVPN软件包,如其在服务器上一样。需要将client.conf模板文件复制到安装时创建的/etc/openvpn目录。这次文件并没有被压缩,因此,普通的cp命令就可以很好地完成这一工作:
client.conf文件中的大多数设置会相当清晰:它们需要匹配服务器使用的值。如从图5中所看到的,唯一的设置是remote 192.168.1.23 1194,其将客户端指向了服务器的IP地址。请确保在使用自己的服务器地址。还应该强制客户端来验证服务器的证书,以防止可能的中间人攻击。一个实现方式是增加remote-cert-tls server行。
图5 VPN客户端/etc/openvpn/client.conf文件中的有效设置
现在,可以切换到/etc/openvpn/目录并从服务器提取那些证书的密钥。将服务器的IP地址或域名替换为示例中的某一个:
在客户端启动OpenVPN之前,并不会发生什么令人兴奋的事情。因为需要传递几个参数,所以,要从命令行开始操作。--tls-client参数告诉OpenVPN将作为一个客户端并通过TLS加密进行连接,同时,--config参数指向配置文件:
仔细查阅命令的输出,以确保已经正确地进行连接。如果出错,可能是由于服务器与客户端配置之间有不匹配的设置,或者是网络连通性/防火墙问题。以下是一些解决问题的步骤:
● 仔细查阅客户端的OpenVPN操作输出。它通常包含有价值的线索,告诉您什么是不能做的,以及为什么。
● 检查服务器/etc/openvpn/目录下的openvpn.log和openvpn-status.log文件中与错误相关的消息。
● 检查服务器与客户端系统日志中特定时刻与OpenVPN相关的消息。(journalctl-ce命令将把最近的条目输出到屏幕上)。
● 确认已经在服务器与客户端之间建立了活动的网络连接。
在客户端加载时,如果OpenVPN输出的一切看上去都是正常的,那么应该继续测试隧道以确认其正在运行且保护着连接。在客户端以服务器的地址和OpenVPN端口运行curl命令会返回Web
服务器
根目录(/var/www/html/)下的index.html文件:
通过删除端口号及其之前的冒号来测试设置。假设防火墙正在以之前的配置运行,curl命令将不会工作。
事实上,单独的一个测试并没有用。毕竟,VPN的目的是防止会话活动被网络上的其他人看到,所以,能够加载页面并不能说明什么。以下内容没有展开详细的介绍,但是提供了用以确认VPN是否正常工作的几种方法(没有特定顺序)。
将一个常规的GUI桌面计算机配置为客户端,并使用浏览器打开一个基于服务器的、需要某种数据录入的应用程序。就该应用程序而言,可以使用如图6所示的简单HTML表单。
可以将该文件保存到服务器的Web文档根目录下,如form.html。随后,可以用URL地址192.168.1.23/form.html来访问该页面(请替换为您的服务器地址)。
为了查明在该表格中输入的信息对未授权的用户是否可见,可以使用诸如Wireshark等网络包嗅探软件来抓取并分析数据。如果该隧道加密了会话,那么,包含输入的名字的数据包就会是不能理解的。
测试VPN的第二种方法涉及在服务器的局部网络中配置资源(服务器、路由器等),该网络中加入了server.conf文件中的客户端。构建这样或那样的基础设施来实现这一目标可能会涉及很多方面。但如果圆满完成了,而且客户端可以访问这些资源,就会明白一切都在正常运转。
通过加密处理,VPN能很好地保护会话数据。而防火墙则可以通过端口、协议或路由信息来很好地控制流入及流出的网络流量。理论上,这足以保护服务器网络。
在涉及IT安全性时并不存在100%的保障。尽最大努力了解新型的威胁,为软件打补丁,审计进程并调整防火墙,但总有人会找到穿越防护的方法。除了人为错误以及存在漏洞或软件被故意破坏的风险,能够破解加密算法的计算机被广泛地应用也只是时间问题。
实际上,解决方案是超量保护,尽可能地为安全配置添加更多的保护层,以致即使那些坏家伙已经突破了第一道防线,还有其他两三道防护。
一个流行的隔离体系结构是非军事区(Demilitarized Zone,DMZ)(用以描述两个互不信任的国家之间的地理缓冲地带)。该想法是,将服务器、工作站、WiFi
路由器
以及其他资源划分为多个独立的网络。为了实现该想法,每台设备都需要物理地连接到一个单独的网络接口。
一个简单的DMZ实现是,将一个服务器用作在互联网与两个内部网络之间进行重定向的路由器,如图7所示。这些网络之一可能包括后端数据库或工作站以及办公室中使用的笔记本电脑等。这个网络将由严格的访问规则进行保护。其他网络将可以非常直接和简单地访问外部世界,而且,可能包括诸如Web服务器等面向公众的资源。
在前往构建自己的DMZ环境之前,至少应该了解一些可供替代的DMZ模型。
DMZ足够可靠与灵活,可以作为各种用例的候选,除此之外,还可以考虑其他的安全网络配置模型。
跳板服务器(jump server,有时也称为跳板机(jumpbox),或者,也可能称为堡垒主机(bastion host))是一个对互联网开放的轻量级服务器,它只有一个功能:允许远程的SSH客户端登录,之后“跳转到”跳板服务器所在私有网络中的其他服务器。如图8所示,网络中的私有服务器将具有某类访问控制,只允许来自跳板服务器的远程登录。
跳板服务器(由其定义,表示可能的单点故障和额外层的复杂度)并不像以前那样流行了。由诸如Juniper及Cisco等公司提供的专用硬件解决方案可用于为更大的企业级部署管理网络连通性与安全性。但是,该类硬件的成本以及在能够完全使用该类硬件之前所需要克服的重要学习曲线有时会超过其益处。
对于混合的云解决方案而言,这些系统都是没有意义的,在这些方案中企业的基础设施是由本地及远程的云平台共同托管的。但是,底层的工具与概念总是有用的。
接下来,讨论采用两个广泛使用的防火墙软件包iptables与Shorewall创建DMZ的方法。它们几乎是同样的事物。Shorewall是一个对用户更友好的工具,它实际上仅以不用关注的方式操作iptables规则。同时提及这两个方法的两个原因:
● 通常会有一些限定和实用的考虑因素来指导从这些工具中进行选择,因此,拥有多个立即可用的选项会有一个好的开始。
● 即使最终使用了诸如Shorewall等更为简单的解决方案,在iptables本身所在的位置快速浏览其内容也仍然是一个好做法。这通常有助于加深对Linux
防火墙
的理解。
iptables是一种用于在Linux
计算机
上管理防火墙规则的工具。那ufw、firewalld和nftables呢?
这一切都源于netfilter(网络过滤器),它在Linux内核模块级控制着去往或来自网络栈的访问。数十年来,用于管理netfilter钩子的主要命令行工具就是iptables规则集。
因为调用这些规则的语法可能会让人觉得有点晦涩难懂,所以如ufw和firewalld等各种用户友好的实现就被当作高级的netfilter解释器而引入。然而,ufw和firewalld主要用于解决独立计算机所面临的各种问题。构建大规模的网络解决方案常常需要额外的iptables功能,或者是其自2014年起的替代品nftables(通过nft这一命令行工具调用)。
iptables并没有被淘汰,现在仍然被广泛使用。事实上,在未来的许多年中,作为管理员,应该期望在工作中遇到iptables保护的网络。但是,通过添加经典的netfilter工具集,nftables已经带来了一些重要的新功能。简单起见,这里仍然使用iptables来快速地展示如何从命令行手动创建一个DMZ。完成之后,我们将转向更加直观的Shorewall实现。
默认情况下,iptables应该已经安装。为了进行确认,可以用iptables-L命令列出当前的规则。如果它还未被使用过,应该会看到一个完全开放的(ACCEPT)防火墙。请注意,INPUT、FORWARD和OUTPUT链都是Filter表的默认组成部分。同样默认存在的NAT表可被用于更改(或转换)包的路由信息,以便其能在网络间成功移动。稍后我们会再次学习NAT:
一旦已有完整的计划,在本例中就是用DMZ设置对这些运行的服务器进行分类,应该设置一个严格的默认策略。
防火墙
管理员规则#1:在开始之前,永远要先知道如何终止。
以下这些规则构成了防火墙的基准,在所有接口上,阻止(DROP)所有的传入及转发流量,但允许传出流量:
由于它们的互联网连接会通过该路由服务器(也可能是网络交换机),网络上的所有设备会自动与这些规则绑定。自己测试一下。同样,请任意使用如下所述的虚拟网络基础设施。我们假设连接到防火墙
服务器
的三个网络接口采用表2所示的命名。
以前,可能认为Linux发行版会为计算机上的物理网络接口分配简单的名字。被识别的第一个以太网接口为eth0,第二个为eth1,以此类推;无线接口会被命名为wlan0和wlan1等(诸如隧道和桥等虚拟设备可能会采用不同的命名规则)。关键在于,即使碰巧不知道某个接口的确切名称,通常也可以很快地猜出来。但是,在使用systemd的现代计算机上运行ip addr命令,可能会遇到类似于enp1s0的东西。或者这个令人讨厌的东西:wlx9cefd5fe4a18。
出于诸多可靠性的原因,使用可预测接口名称的系统更加易于管理,也更加安全,即使存在一点便利性上的折中。一个以太网接口可能是由表示以太网的en、表示总线1的p1以及表示第一个物理槽的s0构成的。而一个不同的设备可能由wl(无线局域网)以及x9cefd5fe4a18组成,其中x表示其后的十六进制数是设备的MAC地址。
只要知道设备插在哪里或者其MAC地址是什么,就能够安全地预测出其接口的名称。
希望本地网络中的设备能够与DMZ中面向公众的服务器进行通信,包括该路由器本身。在Filter表中为FORWARD链添加的两条规则将允许数据包在eth1及eth2接口所连接的网络之间移动(FORWARD)。-A参数表明其后的内容应该被添加为一条新的规则。这使得DMZ中的Web
服务器
可以与私有网络中的数据库服务器交换数据:
下一条规则将被添加到NAT表(-t nat)中。它使用TCP协议来处理所有通过eth0接口的流量,该接口针对应用程序的(虚拟)公共IP地址(54.4.32.10),并指定要使用HTTP 80端口。满足这些条件的任何流量都将被重新路由到DMZ(192.168.1.20)中Web服务器的互联网地址:
因为还没有打开通过eth0接口的互联网到DMZ或私有网络的任何访问,所以从外部来的任何流量都不能到达任何本地服务器。
第一步是获得软件。Ubuntu用户可以使用APT来安装shorewall软件包,而CentOS上的用户则需要通过epel版的软件库来获取:
与基于命令行的iptables不同,shorewall由配置文件进行管理。对于配置文件中复杂设置的可靠可视化表示,认为是可靠的。一旦了解到shorewall的设置大约分布在六个文件中,可能会发现,使用shorewall语法要比使用iptables更加简单。
虽然shorewall启动选项是由/etc/default/shorewall文件控制的,但是,防火墙配置本身通常是由/etc/shorewall/directory目录中的一组文件处理的。/etc/shorewall/shorewall.conf设置运行shorewall所需要的shell环境。对于简单的项目,甚至可能不用触及该文件或参数,以及将会在那里发现的一系列连接跟踪(conntrack)文件。然而,将需要创建一些其他文件,可用的模板在/usr/share/doc/shorewall/examples/目录中(或者,对于CentOS操作系统是/usr/share/doc/shorewall-5.0.14.1/Samples目录,其中5.0.x是版本号)。如果列出了examples/目录下的内容,将会看到四个子目录,依次包括涵盖一组普通场景的示例配置文件:
即使three-interfaces选项看上去与我们正在规划的非常匹配,但是,我们要从头将所需的东西组合在一起,以便能够清晰、准确地了解该过程如何工作。表3简要描述了/etc/shorewall/目录中会使用的文件。
表3 /etc/shorewall/中的shorewall配置文件
用正在查找的特定文件名调用man shorewall-,可以从man中找到大量有用的文档:
让我们从使用文本编辑器创建一个zones文件开始,如图9所示。第一行定义了类型为firewall的shorewall服务器。将要创建的三个活动区域都使用ipv4寻址(与IPv6不同)。net区域代表公共网络,dmz区域是基础设施中面向公共的区域,而loc则是面向后端服务器的私有本地网络。
现在,需要创建一个名为interfaces的文件,在该文件中将每个新的区域与连接到shorewall服务器的三个网络接口中的某一个进行关联,如图10所示。detect命令让shorewall明白,想自动检测网络配置;dhcp意味着通过DHCP服务器为网络接口自动分配IP地址。在接入互联网的接口上,nosmurfs、routefilter以及logmartians将过滤可疑的包、源端域以及与日志相关的事件。
图10 /etc/shorewall/interfaces
policy文件建立默认基准行为。图11中,第一行将默默地删除从互联网(net)到任何目的主机的所有流量。第二行允许从私有区域(loc)传出到互联网的流量,这使得本地计算机可以接收软件更新。第三行表明源自防火墙的流量在任何地方都应被接收。最后一行拒绝任何不包含在其他规则中的包。
图11 /etc/shorewall/policy
需要为这个简单的配置创建的唯一其他文件是rules。随着需求发生变化,rules文件可能会变得相当大、相当复杂。然而,在本例中,只需要少数几行即可,如图12所示。rules文件的首要目标是对policy文件中粗粒度的排除规则进行微调。
剩下的全部工作就是在防火墙计算机上启动shorewall了:
在编辑了配置文件之后,请不要忘记重启shorewall。而且,也不要认为之后不会再修改配置文件,因为要努力让所有部分都按照期望的方式运行。
必须亲自使用工具,之后才能明白它是如何工作的。这里所讨论和部署的测试,要使用多个虚拟服务器进行测试。要在这里正确地开展工作,需要设置多个I/O访问可以被完全控制的网络。
如果被困在用命令行为自己构建的某个网络中,那么,下面介绍的工作原理会有所帮助。用VirtualBox创建几个虚拟NAT网络,为每一个将启动的虚拟机提供一组网络接口,并手动地将这些接口关联到合适的网络上。
请牢记,能创建的VirtualBox虚拟机的数量受VirtualBox主机中可用物理内存容量以及CPU能力的限制。在一台拥有8GB RAM的Linux
主机
上,或许可以部署三个并发的虚拟机。但不要在Windows主机上尝试这一操作,除非拥有至少16GB的RAM。请考虑将一个或两个虚拟机转移到网络中一台单独的计算机上。
第一步,将使用vboxmanage命令行工具(为DMZ配置创建网络)。natnetwork add命令通知VirtualBox想添加一个新的NAT网络。在第一个示例中,netname是一个dmz区,子网是10.0.1.0/24。第二个网络被命名为loc(本地),其子网为10.0.2.0/24。创建了这些网络后,就可以用natnetwork start命令启动它们了:
由于一个已知的缺陷,在早于5.1版本的VirtualBox上不能创建并运行NAT网络。
下一步是创建(或者,最好是克隆)需要的虚拟机(请确保运行所有即将启动的虚拟机的宿主计算机上有足够的系统内存及CPU处理能力)。启动虚拟机之前,请点击一次VirtualBox列表中的第一个名字,之后点击设置(Settings)按钮,随后点击左侧的网络(Network)选项。如果该虚拟机是一个Shorewall服务器,那么请将它的第一个网络适配器关联到通常用于虚拟机完全互联网访问的任一接口。
现在,点击Adapter 2选项卡,之后点击Attached To下拉菜单,并选择NAT Network选项。因为之前已经创建了两个NAT网络,这两个网络都会在选项中出现(图13)。为Adapter 2选择其中的一个选项,为Adapter 3选择另一个。
图13 将连接到NAT网络的网络适配器关联到VirtualBox虚拟机
为了完善shorewall测试环境,请对其他两个虚拟机的Settings|Network进行操作,一个关联到dmz NAT网络,另一个关联到loc网络。这两个虚拟机都只有一个接口。
完成上述操作后,可以启动三个虚拟机并登录。在每个虚拟机上运行ip addr命令,以确认这些接口已经被识别且连接到了它们的网络。如果在inet行看到了正确类型的IP地址(如10.0.1.5/24),那么这些就都已经在运行:
但如果没有inet地址,就需要手动启动。
获取接口名(本例中是enp0s3)并将其作为ifconfig up命令的参数。
这条命令通知该接口最好醒过来并开始工作。
运行dhclient命令将从dmz网络的DHCP服务器请求一个IP地址(创建NAT网络时为何要设置--dhcp on?
这是有原因的):
最后,再次运行ip addr命令,以确保一切都正常。
由此,得到了自己的测试环境。
微信公众号:计算机与网络安全
ID:Computer-network