
在日常分析病毒样本的过程中,我们经常遇到需要调试蠕虫的情况。考虑到内网中的机器一般是不经常打补丁的,这种情况下我们一定需要注意网络隔离,不然有可能会出现蠕虫扩散到整个网络的情况。
随着我们部门人数和业务的增加,公用调试环境中有很多人的调试虚拟机,这就导致A在调试蠕虫或勒索的时候横向传播到B的虚拟机中从而影响B的工作进度的事情发生。因此,对我们部门的公用虚拟机进行网络隔离就成了一个需要提上日程的需求。
网络拓扑结构
首先给出网络拓扑结构,ESXi是跑在一台Dell R710服务器上面的,软路由OpenWrt通过vSwitch0连接到网关(最终连接到Internet),vSwitch1下专门用于连接各调试用虚拟机:

几个有必要知晓的概念
VLAN: 本文中指的是符合802.1q或802.1ad规范的VLAN。VLAN的作用是隔离不同的网络,大家可以理解为VLAN可以将一台物理交换机上的不同RJ45端口划分为不同的子网,不同子网之间需要通过Trunk口才能通信,如果没有配置Trunk口,则不同子网之间无法通信。
端口组: PortGroup是用于管理虚拟机网络的一个概念,可以理解为虚拟网卡,不同的地方在于这块虚拟网卡可以被不同的虚拟机使用,而使用同一个虚拟网卡的虚拟机隶属于一个VLAN。下图展示了本教程的核心路由器使用的端口组配置,该路由器连接了两块网卡,TrunkPG0用于访问公网、TrunkPG1用于分析网络下的各个分析虚拟机之间的通信。

OpenWRT网络配置:如下配置展示了利用eth1网卡配置了两个VLAN,其VLAN ID分别是100和200。需要注意的是,虽然这两个子网使用同一块物理网卡, 但是这两个子网默认是隔离的。具体参数的意义可以参考文末参考1。

ESXi的配置
1. 创建虚拟交换机
为了方便管理,本文中为分析网络单独建立了一个虚拟交换机,当然也可以在默认交换机上做本文讲述的配置,步骤都是相似的。
首先进入ESXi的网络标签页,然后在“虚拟交换机”选项卡中选择“添加标准虚拟交换机”,除去名称变更为"vSwitch1"之外(其实可以任意起名),其他所有参数均可以使用默认值。

2. 创建端口组(PortGroup)
然后选择“端口组”选项卡并点击“添加端口组”按钮,在弹出的菜单中填入下图中信息:

注意:VLAN ID填入200,这个值你可以填写任意整数,但是必须和下文中路由器配置的内容一致,即这里填200与下面路由器配置中的ethX.200对应。
上面我们专门为分析环境的虚拟机划分了一个VLAN是200的子网,如果VLAN 200环境中的虚拟机需要连接Internet,则需要通过“路由器”上网,而路由器不属于VLAN 200这个网络,因此我们需要创建两个Trunk口分别连接到VLAN 200的虚拟交换机vSwitch1与“路由器”的虚拟交换机vSwitch0上,这两个端口组分别命名为TrunkPG0和TrunkPG1:


注意:上图中TrunkPG0和TrunkPG1的相同点是VLAN ID均为4095(必须为这个值), 不同点是TrunkPG0的虚拟交换机是vSwitch0而TrunkPG1的的虚拟交换机是vSwitch1(具体可以参考第一节中的拓扑图)。
由于是纯虚拟环境,因此vSwitch1就没必要再绑定物理网卡了。到目前为止“物理链路”我们已经打通了,接下来是OpenWRT和虚拟机的配置。
分析虚拟机配置
这个是最简单的,一句话说完,创建虚拟机时注意选择我们刚才创建的PortGroup1即可。

OpenWrt虚拟机配置
1. 物理链路配置
其实OpenWrt也是一台虚拟机, 只不过此虚拟机比较重要,这台虚拟机本质上是一台软路由,负责控制vSwitch1下的VLAN和各个VLAN下机器的网络通信情况,具体网络拓扑结构可以参考上文的第一节。
这里需要注意的是,此虚拟机需要分配两块网卡,分别对应上面创建的TrunkPG0和TrunkPG1:

2. OpenWrt配置
首先说一句,如果你因为种种原因无法访问OpenWrt的Web配置界面的话,可以参考后面的配置文件,其效果是一样的,这里使用Web界面做说明仅仅是为了直观。
首先来看一下目前我们分析环境中配置的网络情况:

其中, WAN口对应上文中的TrunkPG0端口组,此网卡可以通过适当的配置网关和自身的ip地址获取到可以访问Internet的ipv4地址。
IF_VM_GROUP1与IF_VM_SERVERS(上文未涉及)对应TrunkPG1端口组。
这里有一个容易混淆的概念,TrunkPG0对应网卡eth0、TrunkPG1对应网卡eth1。而eth1.200(即VLAN 200)对应PortGroup1端口组所在的VLAN网络,因为PortGroup1这块“网卡”我们是分配给第五节中的调试用虚拟机的,本节的OpenWrt并没有分配这块网卡。
之所以会这样是因为PortGroup1所在的vSwith1等设施都是硬件层级的配置,在OpenWrt中需要有一个软件层级的配置与之对应,而ethX.Y这种形式即是OpenWrt在软件层对VLAN的支持1。
接下来,我们配置VLAN 200的网络端口,即IF_VM_GROUP1:

你可以按需配置这个接口的子网地址, 例如上图中笔者就是分配的192.168.2.1/24这个子网池。如果你需要DHCP,记得把下面的DHCP服务给enable, 配置可以按需来,如下图:

接下来需要配置VLAN ID,可以在Custom Interface输入框里面输入eth1.200,这里只需要注意200的值必须与第二节中配置的PortGroup1的VLAN ID完全一致:

最后,为了让eth1.200这个VLAN可以访问Internet,需要配置eth1.200(IF_VM_GROUP1)到eth0(WAN)的防火墙规则。
首先给IF_VM_GROUP1分配一个ZONE:

同理WAN也许要一个ZONE:

最后在Firewall规则中配置这两个ZONE可以连通即可:

配置文件
/etc/config/network
- config interface 'if_vm_group1'
- option ifname 'eth1.200'
- option proto 'static'
- option ipaddr '192.168.2.1'
- option netmask '255.255.255.0'
- option gateway '192.168.2.1'
- option metric '10'
- option dns '114.114.114.114 8.8.8.8'
/etc/config/dhcp
- config dhcp 'dhcp_vm_group1'
- option leasetime '12h'
- option interface 'if_vm_group1'
- option start '100'
- option limit '100'
/etc/config/firewall
- config defaults
- option input 'REJECT'
- option output 'REJECT'
- option forward 'REJECT'
- config zone
- option name 'WAN'
- option input 'ACCEPT'
- option output 'ACCEPT'
- option forward 'ACCEPT'
- option masq '1'
- option network 'wan'
- config zone
- option forward 'REJECT'
- option name 'Group1'
- option input 'ACCEPT'
- option output 'ACCEPT'
- option network 'if_vm_group1'
- config zone
- option forward 'REJECT'
- option name 'Servers'
- option input 'ACCEPT'
- option output 'ACCEPT'
- option network 'if_vm_servers'
- config forwarding
- option dest 'WAN'
- option src 'Group1'
- config forwarding
- option dest 'Group1'
- option src 'WAN'
- config forwarding
- option dest 'Servers'
- option src 'Group1'