Just For Coding

Keep learning, keep living …

VMware环境中根据虚拟机IP找寻所在ESXi主机

在VMware vSphere虚拟环境中我们有时需要找寻某IP所在的虚拟机及ESXi宿主机。若VMware虚拟机安装了VMware tools, 则可以通过API直接查找该IP所在位置,但我们的环境中并不是所有的虚拟机都已安装,因而我们只能通过MAC地址来查找。

假设目标IP为10.95.48.11,首先我们从与目标IP位于相同二层网络内的虚拟机上获取10.95.48.11对应的MAC地址:

1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# ping 10.95.48.11 -c 2
PING 10.95.48.11 (10.95.48.11) 56(84) bytes of data.
64 bytes from 10.95.48.11: icmp_seq=1 ttl=64 time=0.141 ms
64 bytes from 10.95.48.11: icmp_seq=2 ttl=64 time=0.137 ms

--- 10.95.48.11 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.137/0.139/0.141/0.002 ms
[root@localhost ~]# ip neighbor |grep 10.95.48.11
10.95.48.11 dev eth0 lladdr 00:0c:29:26:18:c8 REACHABLE

获取到MAC地址为00:0c:29:26:18:c8

若是环境中ESXi主机较少,可以通过SSH直接登录ESXi主机挨个进行查找。

首先进入虚拟机的存储目录,不同环境中数据存储的名字可能不同:

1
cd /vmfs/volumes/datastore1/

该目录存储的是各个虚拟机的相关文件,一个虚拟机对应一个目录,如:

1
2
3
4
5
[root@esxi-01:/vmfs/volumes/595b7497-d8849df8-8d7c-6c92bf585d10] ls -l
total 176
drwxr-xr-x    1 root     root           420 Sep 14 02:30 centos-68
drwxr-xr-x    1 root     root          1820 Oct  9 09:55 dev01-10.95.48.11
drwxr-xr-x    1 root     root          3080 Sep 14 03:37 dev02-10.95.48.12

每台虚拟机目录中的vmx文件中存储了系统为虚拟网卡生成的MAC地址,如:

1
2
ethernet0.generatedAddress = "00:0c:29:26:18:c8"
ethernet0.generatedAddressOffset = "0"

我们可以从vmx文件中搜索MAC地址,找到相应的虚拟机,如:

1
2
[root@esxi-01:/vmfs/volumes/595b7497-d8849df8-8d7c-6c92bf585d10] find . -name '*.vmx' | xargs grep '00:0c:29:26:18:c8'
./dev01-10.95.48.11/dev01-10.95.48.11.vmx:ethernet0.generatedAddress = "00:0c:29:26:18:c8”

若是环境中ESXi主机非常多,一台一台搜索非常低效,我们可以基于VMware官方提供的SDK来编写程序来找到相应的MAC地址。

VMware提供了Python的SDK: https://github.com/vmware/pyvmomi

我们编写的程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/env python
import atexit

from pyVim import connect
from pyVmomi import vmodl
from pyVmomi import vim

def print_vm_info(virtual_machine):
    for device in virtual_machine.config.hardware.device:
        if (device.key >= 4000) and (device.key < 5000):
            if device.macAddress == '00:0c:29:26:18:c8':
                print('device.macAddress==', device.macAddress)

                summary = virtual_machine.summary
                print("Name       : ", summary.config.name)
                print("Template   : ", summary.config.template)
                print("Path       : ", summary.config.vmPathName)
                print("Guest      : ", summary.config.guestFullName)
                print("Host       : ", summary.runtime.host.name)

def main():
    try:
        service_instance = connect.SmartConnect(host="10.10.10.10",
                                                user="administrator@vsphere.local",
                                                pwd="123456",
                                                port=443)

        atexit.register(connect.Disconnect, service_instance)

        content = service_instance.RetrieveContent()

        container = content.rootFolder  # starting point to look into
        viewType = [vim.VirtualMachine]  # object types to look for
        recursive = True  # whether we should look into it recursively
        containerView = content.viewManager.CreateContainerView(
            container, viewType, recursive)

        children = containerView.view
        for child in children:
            print_vm_info(child)

    except vmodl.MethodFault as error:
        print("Caught vmodl fault : " + error.msg)
        return -1

    return 0

# Start program
if __name__ == "__main__":
    main()

虚拟机的设备key值位于4000-5000表示网络设备,我们在网络设备的属性中查找MAC信息。程序中的连接信息可以是ESXi主机信息,也可以是vCenter信息。直接连接vCenter则可以将环境中所有ESXi主机全部搜索完, 避免一台一台主机搜索。

程序的执行结果,如下:

1
2
3
4
5
6
7
[root@vagrant-centos65 samples]# python get_vm_from_mac.py 
('device.macAddress==', '00:0c:29:26:18:c8')
('Name       : ', 'dev01-10.95.48.11')
('Template   : ', False)
('Path       : ', '[datastore1] dev01-10.95.48.11/dev01-10.95.48.11.vmx')
('Guest      : ', 'CentOS 4/5/6/7 (64-bit)')
('Host       : ', ‘esxi-01’)

Ansible入门

Ansible是一个自动化配置管理系统,主要用于简化运维人员对大量服务器上配置及服务等内容的管理工作。在自动化配置管理领域内,除了ansible, 比较著名的还有Puppet,SaltStack, Chef等项目。Ansible与这些同类项目相比,部署和使用更简单。Puppet等项目都是C/S架构,需要在被管理服务器上安装agent程序,agent程序与配置管理中心服务器通信拉取相应的配置或文件。而ansible无论是获取主机信息,发送命令还是拷贝文件等操作都是直接使用SSH通道来完成。

我们在CentOS7环境中来演示ansible使用,首先安装ansible:

1
2
yum install -y epel-release
yum install -y ansible

IPTABLES未有效阻断Windows环境下PING访问的问题分析

我们在CentOS服务器上使用IPTABLES来禁止PING访问。但为了允许从CentOS服务器上主动向外发起的PING的响应包能够正常流入,我们使用了iptables的状态机制,允许RELATED和ESTABLISHED状态的数据包通过。

我们首先配置上允许相关状态下的ICMP数据包通过的规则:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost vagrant]# iptables -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@localhost vagrant]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Tarantool介绍

Tarantool是俄罗斯最大的互联网公司Mail.RU开发的自带DBMS的Lua应用服务器。从作用上看,它类似于带有持久化数据存储模块的node.js

现代WEB应用程序一般由专门的WEB服务器(如NGINX或APACHE)接入用户请求,然后转发给应用服务器进行业务逻辑处理。应用服务器需要从存储服务中获取数据并加工组织为特定格式的响应,发送给前端的WEB服务器,再由WEB服务器返回给用户。存储服务根据承载介质可分为磁盘存储和内存存储。最常使用的磁盘存储是关系型数据库,如MySQL、PostgreSQL。应用程序对数据库的要求主要是ACID特性。一般情况下,数据库的性能往往满足不了现代应用程序的性能要求。这种情况下,需要在应用程序中引入内存型存储做为cache来满足RPS(Request Per Second)要求,如Memcached, Redis等。典型的WEB应用架构如图:

OpenStack私有网络安全防护

之前的文章<<VMware vSphere虚拟网络防护>>介绍了vSphere环境下基于NAT实现不同子网之间的网络安全防护。在OpenStack环境下网络安全防护也可以采用同样的方式。比如,我们在OpenStack环境中,有两个私有网络, 名称分别为webdb, 两个私有网络由虚拟路由连接。架构示意图如下:

WebSocket介绍与实例分析

WEB访问一般都是基于Request/Response模式的HTTP协议,请求由浏览器发起,服务器处理请求后发送回响应。HTTP协议是短连接单向通信模型,服务器不能主动发送内容给客户端。为了解决这个问题,浏览器可以周期性地主动发送请求给服务器,服务器若没有相应数据则返回空响应,否则返回相应数据并关闭连接。这种方案被称为轮询(POLLING)。轮询需要不停地建立连接、并闭连接,不断浪费网络资源。为了减少不必要的网络消耗,LONG POLLING方案被提出。浏览器发送请求给服务器后,若服务器没有相应数据时并不返回空响应及断开连接,而是将请求保持住,当有了相应数据后或者超时发生再将数据返回给客户端并断开连接。当连接断开后,客户端会再次发起请求。这种方案依然会消耗多个TCP连接,HTTP Streaming技术进一步优化了TCP连接的使用效率。当服务器返回响应后并不关闭TCP连接,后续的请求和响应继续复用该连接。

本质上这些方案都是半双工单向通信,于是业内为基于浏览器的应用程序开发提出了全双工的实时双向通信方式: WebSocket。WebSocket是基于TCP的一种数据传输协议,它被设计成可以支持原来直接运行于TCP之上的任何协议。其他协议可以将WebSocket视为传输层,比如XMPP,STOMP,AMQP等。这给基于浏览器的应用程序开发带了具大灵活性,可以不再单纯依赖原有的HTTP协议。

PasteDeploy介绍

之前的文章<<WSGI介绍>>简要介绍了WSGI中的server, applicationmiddleware等概念。WSGI Server收到请求后调用WSGI application的入口点(一般为callable对象或者函数)来处理请求。比如,uWSGImod_wsgi默认调用名为application的入口点。

PasteDeploy是一套发现和配置WSGI应用的系统。它根据指定的配置文件动态生成入口点和组织WSGI application间的逻辑关系。配置文件为INI格式。每个配置文件可以包含多个section, section以格式为[type:name]形式的段名开始,段名行之后为具体配置。示例如下:

1
2
3
4
5
6
7
8
9
10
11
[DEFAULT]
email = alice@example.org

[app:main]
use = egg:BlogApp
database = sqlite:/home/me/blog.db
set email = bob@example.org

[app:wiki]
use = call:mywiki.main:application
database = sqlite:/home/me/wiki.db

其中,[DEFAULT]段中为全局配置,各section中可以覆盖[DEFAULT]段中配置。如示例中的set email配置。

VMware vSphere东西向网络防护

之前的文章<<VMware vSphere虚拟网络防护>>介绍了VMware vSphere的网络基础知识和南北向网络安全防护的思路。南北向网络防护是在网络边界进行安全隔离和流量过滤。那么怎样对网络内部的东西向流量如何进行安全防护呢?VMware NSX提供了东西向安全防护的能力。不过NSX的License价格很贵,很多企业并没有购买意愿。本文介绍在非NSX环境中只依赖vSphere提供的能力将流量引至虚拟安全设备实现东西向网络安全防护的思路。

我们当前一台ESXi上的环境如图:

VXLAN原理介绍与实例分析

云计算环境的一个典型属性是多租户共享物理资源。其中每个租户可以构建自己专属的虚拟逻辑网络,而每个逻辑网络都需要由唯一的标识符来标识。不同的逻辑网络默认情况下相互隔离。传统上,网络工程师一般使用VLAN来隔离不同二层网络,但VLAN的标识符命名空间只有12位,只能提供4096个标识符,这无法满足大型云计算环境的需求。另外,使用VLAN隔离虚拟逻辑网络,往往需要对底层物理网络设备进行手动配置,这无法满足云计算环境的自动化需求。为了解决VLAN在网络虚拟化环境中应用存在的种种问题,Cisco,VMware等厂商提出了新的网络协议VXLAN来隔离虚拟逻辑网络。

VXLAN的全称为Virtual eXtensible LAN,从名称看,它的目标就是扩展VLAN协议。802.1Q的VLAN TAG只占12位,只能提供4096个网络标识符。而在VXLAN中,标识符扩展到24位,能提供16777216个逻辑网络标识符,VXLAN的标识符称为VNI(VXLAN Network Identifier)。另外,VLAN只能应用在一个二层网络中,而VXLAN通过将原始二层以太网帧封装在IP协议包中,在IP基础网络之上构建overlay的逻辑大二层网络。

我们来看具体协议包结构。VXLAN将二层数据帧封装在UDP数据包中,构建隧道在不同节点间通信。包结构如图:

VMware vSphere虚拟网络防护

随着数据中心虚拟化和云计算发展,虚拟网络的安全防护需求越来越多。本文通过实例介绍VMware vSphere虚拟网络的安全防护。

首先介绍VMware vSphere虚拟网络的基础知识。

ESXi主机使用虚拟交换机来路由虚拟网络内部流量以及虚拟网络和物理网络之间的网络流量。vSphere有三种虚拟交换机:

  • vSS: vNetwork Standard Switch
  • vDS: vNetwork Distributed Switch
  • Cisco Nexus 1000v

vSS工作在单一ESXi主机中,适用于小规模环境,需要在每个ESXi主机上单独配置。vDS和Nexus 1000v具备更多高级网络特性, 但需要额外License。本文介绍在vSS环境下的虚拟网络防护。

vSS有三种类型的端口:

  • vNIC: 虚拟机的网络接口
  • VMKernel: 用于ESXi主机与外界物理网络或者VMware其他基础设施交互,如vMotion, vSAN等
  • uplink: 连接虚拟交换机与主机物理网卡,将虚拟网络和物理网络联通

vSS通过端口组(Port Group)将vNIC端口分组,针对端口组,可以设置不同的VLAN ID,安全参数、流量整形参数等。在创建虚拟机时需要指定虚拟网络接口属的端口组。

vSphere虚拟网络的架构示意图如下: