• 转:使用Json Template在Azure China创建ARM类型的虚拟机

    前面几篇文章介绍过Azure的两种VM的模式,包括ASM和ARM。并且介绍了如何用Azure CLI和PowerShell创建虚拟机。本文将介绍如何采用Json的Template来创建基于ARM的VM。
    当然采用Json Template的方式创建虚拟机是几种方式中最好的,这样可以便于批量部署、Json文件可以重用。
    ARM的Template的格式采用的是Json的格式。其需要的几个部分如下:

    需要定义的有:parameters,variables,resources和outputs。但只有resources是必须的。
    由于Template的内容比较复杂,一般都采用复制已有的Template Jason文件修改的方式。
    目前,在Github上有大量的Azure ARM Jason Template,可以下载修改使用。
    具体的网址在:
    https://github.com/Azure/azure-quickstart-templates
    比如我们要创建一台CentOS 6.5的Linux虚拟机。在上面的链接中,没有相应的template。我们通过一台Ubuntu的Template进行修改。
    首先下载两个Jason文件:
    https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-vm-simple-linux/azuredeploy.json
    https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/101-vm-simple-linux/azuredeploy.parameters.json
    第一个文件是部署文件,第二个文件是参数文件。
    我们首先看部署文件:
    一、修改parameter中的内容
    1 把Ubuntu版本改成CentOS版本:

    复制代码
        "ubuntuOSVersion": {
          "type": "string",
          "defaultValue": "14.04.2-LTS",
          "allowedValues": [
            "12.04.5-LTS",
            "14.04.2-LTS",
            "15.10"
          ],
    复制代码

     
    改成

    复制代码
        "CentOSVersion": {
          "type": "string",
          "defaultValue": "6.5",
          "allowedValues": [
            "6.5",
            "6.6",
            "7.0",
            "7.1"
          ],
    复制代码

     
    2 把metadata的描述更改

    "metadata": {
        "description": "The Ubuntu version for the VM. This will pick a fully patched image of this given Ubuntu version. Allowed values: 12.04.5-LTS, 14.04.2-LTS, 15.10."
    }

     
    改为:

    "metadata": {
        "description": "The CentOS version for the VM. This will pick a fully patched image of this given CentOS version. Allowed values: 6.5, 6.6, 7.0, 7.1."
    }

     
    二、修改variables中的内容
    原始的变量定义如下:

    复制代码
      "variables": {
        "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'salinuxvm')]",
        "dataDisk1VhdName": "datadisk1",
        "imagePublisher": "Canonical",
        "imageOffer": "UbuntuServer",
        "OSDiskName": "osdiskforlinuxsimple",
        "nicName": "myVMNic",
        "addressPrefix": "10.0.0.0/16",
        "subnetName": "Subnet",
        "subnetPrefix": "10.0.0.0/24",
        "storageAccountType": "Standard_LRS",
        "publicIPAddressName": "myPublicIP",
        "publicIPAddressType": "Dynamic",
        "vmStorageAccountContainerName": "vhds",
        "vmName": "MyUbuntuVM",
        "vmSize": "Standard_D1",
        "virtualNetworkName": "MyVNET",
        "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]",
        "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]",
        "apiVersion": "2015-06-15"
      },
    复制代码

     
    更改为:

    复制代码
      "variables": {
        "storageAccountName": "[concat(uniquestring(resourceGroup().id), 'salinuxvm')]",
        "dataDisk1VhdName": "datadisk1",
        "imagePublisher": "OpenLogic",
        "imageOffer": "CentOS",
        "OSDiskName": "osdiskforlinuxsimple",
        "nicName": "myVMNic",
        "addressPrefix": "10.0.0.0/16",
        "subnetName": "Subnet",
        "subnetPrefix": "10.0.0.0/24",
        "storageAccountType": "Standard_LRS",
        "publicIPAddressName": "myPublicIP",
        "publicIPAddressType": "Dynamic",
        "vmStorageAccountContainerName": "vhds",
        "vmName": "MyCentOSVM",
        "vmSize": "Standard_A1",
        "virtualNetworkName": "MyVNET",
        "vnetID": "[resourceId('Microsoft.Network/virtualNetworks',variables('virtualNetworkName'))]",
        "subnetRef": "[concat(variables('vnetID'),'/subnets/',variables('subnetName'))]",
        "apiVersion": "2015-06-15"
      },
    复制代码

     
    修改完部署文件后,修改参数文件:
    参数文件如下:

    复制代码
    {
      "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "azureUser"
        },
        "adminPassword": {
          "value": "GEN-PASSWORD"
        },
        "dnsLabelPrefix": {
          "value": "GEN-UNIQUE"
        },
        "ubuntuOSVersion": {
          "value": "14.04.2-LTS"
        }
      }
    }
    复制代码

     
    更改为:

    复制代码
    {
      "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "adminUsername": {
          "value": "hengwei"
        },
        "adminPassword": {
          "value": "abc@123456"
        },
        "dnsLabelPrefix": {
          "value": "hwvm"
        },
        "CentOSVersion": {
          "value": "6.5"
        }
      }
    }
    复制代码

     
     
    并把两个文件上传到Github上,链接如下:
    https://raw.githubusercontent.com/hengv/Hengwei/Azure/101-simple-linux/azuredeploy.json
    https://raw.githubusercontent.com/hengv/Hengwei/Azure/101-simple-linux/azuredeploy.parameters.json
    下面可以通过PowerShell命令通过Jason Template创建VM了:

    复制代码
    New-AzureRmResourceGroup -Name hw01 -Location chinaeast
    ResourceGroupName : hw01
    Location          : chinaeast
    ProvisioningState : Succeeded
    Tags              :
    ResourceId        : /subscriptions/xxxxxxxx/resourceGroups/hw01
    复制代码
    复制代码
    New-AzureRmResourceGroupDeployment -Name hwvm01 -ResourceGroupName hw01 -TemplateUri https://raw.githubusercontent.com/hengv/Hengwei/Azure/101-simple-linux/azuredeploy.json -TemplateParameterUri https://raw.githubusercontent.com/hengv/Hengwei/Azure/101-simple-linux/azuredeploy.parameters.json -Mode Incremental
    DeploymentName          : hwvm01
    ResourceGroupName       : hw01
    ProvisioningState       : Succeeded
    Timestamp               : 2016/7/1 14:09:58
    Mode                    : Incremental
    TemplateLink            :
                              Uri            : https://raw.githubusercontent.com/hengv/Hengwei/Azure/101-simple-linux/azuredeploy.json
                              ContentVersion : 1.0.0.0
    Parameters              :
                              Name             Type                       Value
                              ===============  =========================  ==========
                              adminUsername    String                     hengwei
                              adminPassword    SecureString
                              dnsLabelPrefix   String                     hwvm
                              centOSVersion    String                     6.5
    Outputs                 :
                              Name             Type                       Value
                              ===============  =========================  ==========
                              hostname         String                     hwvm.chinaeast.cloudapp.azure.com
                              sshCommand       String                     ssh hengwei@hwvm.chinaeast.cloudapp.azure.com
    DeploymentDebugLogLevel :
    复制代码

     
    创建成功。
    再通过下面的命令查看:

    复制代码
    get-azurermvm
    RequestId                         : afe8fb47-4e2f-434f-aa40-4d230a549598
    StatusCode                        : OK
    ResourceGroupName                 : HW01
    Id                                : /subscriptions/xxxxxxxx/resourceGroups/HW01/providers/Microsoft.Compute/virtualMachines/MyCentOSVM
    Name                              : MyCentOSVM
    Type                              : Microsoft.Rest.Azure.AzureOperationResponse`1[Microsoft.Rest.Azure.IPage`1[Microsoft.Azure.Management.Compute.Models.VirtualMachine]]
    Location                          : chinaeast
    Tags                              : {}
    DiagnosticsProfile                :
      BootDiagnostics                 :
        Enabled                       : True
        StorageUri                    : https://eyyvnizdwsddusalinuxvm.blob.core.chinacloudapi.cn/
    HardwareProfile                   :
      VmSize                          : Standard_A1
    NetworkProfile                    :
      NetworkInterfaces[0]            :
        Id                            : /subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Network/networkInterfaces/myVMNic
    OSProfile                         :
      ComputerName                    : MyCentOSVM
      AdminUsername                   : hengwei
      LinuxConfiguration              :
        DisablePasswordAuthentication : False
    ProvisioningState                 : Succeeded
    StorageProfile                    :
      ImageReference                  :
        Publisher                     : OpenLogic
        Offer                         : CentOS
        Sku                           : 6.5
        Version                       : latest
      OsDisk                          :
        OsType                        : Linux
        Name                          : osdisk
        Vhd                           :
          Uri                         : https://eyyvnizdwsddusalinuxvm.blob.core.chinacloudapi.cn/vhds/osdiskforlinuxsimple.vhd
        Caching                       : ReadWrite
        CreateOption                  : FromImage
      DataDisks[0]                    :
        Lun                           : 0
        Name                          : datadisk1
        Vhd                           :
          Uri                         : https://eyyvnizdwsddusalinuxvm.blob.core.chinacloudapi.cn/vhds/datadisk1.vhd
        Caching                       : None
        CreateOption                  : Empty
        DiskSizeGB                    : 100
    DataDiskNames[0]                  : datadisk1
    NetworkInterfaceIDs[0]            : /subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Network/networkInterfaces/myVMNic
    复制代码
    复制代码
    Get-AzureRmNetworkInterface
    Name                 : myVMNic
    ResourceGroupName    : hw01
    Location             : chinaeast
    Id                   : /subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Network/networkInterfaces/myVMNic
    Etag                 : W/"1e379401-4980-42c6-ba83-9e26f19133bd"
    ResourceGuid         : c4e50ac6-fdb1-416c-a5b2-d71baace6b55
    ProvisioningState    : Succeeded
    Tags                 :
    VirtualMachine       : {
                             "Id": "/subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Compute/virtualMachines/MyCentOSVM"
                           }
    IpConfigurations     : [
                             {
                               "Name": "ipconfig1",
                               "Etag": "W/\"1e379401-4980-42c6-ba83-9e26f19133bd\"",
                               "Id": "/subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Network/networkInterfaces/myVMNic/ipConfigurations/ipconfig1",
                               "PrivateIpAddress": "10.0.0.4",
                               "PrivateIpAllocationMethod": "Dynamic",
                               "Subnet": {
                                 "Id": "/subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Network/virtualNetworks/MyVNET/subnets/Subnet"
                               },
                               "PublicIpAddress": {
                                 "Id": "/subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Network/publicIPAddresses/myPublicIP"
                               },
                               "ProvisioningState": "Succeeded",
                               "LoadBalancerBackendAddressPools": [],
                               "LoadBalancerInboundNatRules": [],
                               "ApplicationGatewayBackendAddressPools": []
                             }
                           ]
    DnsSettings          : {
                             "DnsServers": [],
                             "AppliedDnsServers": []
                           }
    EnableIPForwarding   : False
    NetworkSecurityGroup : null
    Primary              : True
    复制代码
    复制代码
    Get-AzureRmPublicIpAddress
    Name                     : myPublicIP
    ResourceGroupName        : hw01
    Location                 : chinaeast
    Id                       : /subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Network/publicIPAddresses/myPublicIP
    Etag                     : W/"0d4e57f8-25a1-4bf7-bec9-e98785ed8179"
    ResourceGuid             : f8216ff0-06a6-478b-8270-f18fc717c0f7
    ProvisioningState        : Succeeded
    Tags                     :
    PublicIpAllocationMethod : Dynamic
    IpAddress                : 42.159.235.75
    IdleTimeoutInMinutes     : 4
    IpConfiguration          : {
                                 "Id": "/subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Network/networkInterfaces/myVMNic/ipConfigurations/ipconfig1"
                               }
    DnsSettings              : {
                                 "DomainNameLabel": "hwvm",
                                 "Fqdn": "hwvm.chinaeast.cloudapp.chinacloudapi.cn"
    复制代码

     

    复制代码
    Get-AzureRmVirtualNetwork
    Name              : MyVNET
    ResourceGroupName : hw01
    Location          : chinaeast
    Id                : /subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Network/virtualNetworks/MyVNET
    Etag              : W/"888d8b21-091b-4f40-b2ba-284f16c0f641"
    ResourceGuid      : a69ef02a-728e-4212-8c2a-7a7c0f4bb881
    ProvisioningState : Succeeded
    Tags              :
    AddressSpace      : {
                          "AddressPrefixes": [
                            "10.0.0.0/16"
                          ]
                        }
    DhcpOptions       : null
    Subnets           : [
                          {
                            "Name": "Subnet",
                            "Etag": "W/\"888d8b21-091b-4f40-b2ba-284f16c0f641\"",
                            "Id": "/subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Network/virtualNetworks/MyVNET/subnets/Subnet",
                            "AddressPrefix": "10.0.0.0/24",
                            "IpConfigurations": [
                              {
                                "Id": "/subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Network/networkInterfaces/myVMNic/ipConfigurations/ipconfig1"
                              }
                            ],
                            "ProvisioningState": "Succeeded"
                          }
                        ]
    复制代码
    复制代码
    Get-AzureRmStorageAccount
    ResourceGroupName   : hw01
    StorageAccountName  : eyyvnizdwsddusalinuxvm
    Id                  : /subscriptions/xxxxxxxx/resourceGroups/hw01/providers/Microsoft.Storage/storageAccounts/eyyvnizdwsddusalinuxvm
    Location            : chinaeast
    Sku                 : Microsoft.Azure.Management.Storage.Models.Sku
    Kind                : Storage
    Encryption          :
    AccessTier          :
    CreationTime        : 2016/7/1 14:07:14
    CustomDomain        :
    LastGeoFailoverTime :
    PrimaryEndpoints    : Microsoft.Azure.Management.Storage.Models.Endpoints
    PrimaryLocation     : chinaeast
    ProvisioningState   : Succeeded
    SecondaryEndpoints  :
    SecondaryLocation   :
    StatusOfPrimary     : Available
    StatusOfSecondary   :
    Tags                : {}
    Context             : Microsoft.WindowsAzure.Commands.Common.Storage.AzureStorageContext
    复制代码

     

  • 转:ARM模式下从已有的VHD文件创建新的虚拟机

    Azure在ASM模式下可以通过Portal界面的Caputure或Save-AzureVMImage等方式创建VM的Image模板,实现对已有VM的快速重新部署。
    在Azure的ARM下,要实现类似的功能,可以通过采用JSON的Template部署的方式实现。本文将介绍这一方法。
    1 通过PowerShell列出需要复制的虚拟机,并记录其OSDisk的链接:

    复制代码
    get-azurermvm
    RequestId                         : 984a6daa-c8cf-4f4f-8edc-d9cceabf3d95
    StatusCode                        : OK
    ResourceGroupName                 : HWNOSQL
    Id                                : /subscriptions/xxxx/resourceGroups/HWNOSQL/providers/Microsoft.Compute/virtualMachines/hwnosql
    Name                              : hwnosql
    Type                              : Microsoft.Rest.Azure.AzureOperationResponse`1[Microsoft.Rest.Azure.IPage`1[Microsoft.Azure.Management.Compute.Models.VirtualMa
    chine]]
    Location                          : chinaeast
    Tags                              : {}
    DiagnosticsProfile                :
      BootDiagnostics                 :
        Enabled                       : True
        StorageUri                    : https://hwnosql969.blob.core.chinacloudapi.cn/
    Extensions[0]                     :
      Id                              : /subscriptions/xxxx/resourceGroups/HWNOSQL/providers/Microsoft.Compute/virtualMachines/hwnosql
    /extensions/Microsoft.Insights.VMDiagnosticsSettings
    HardwareProfile                   :
      VmSize                          : Standard_A1
    NetworkProfile                    :
      NetworkInterfaces[0]            :
        Id                            : /subscriptions/xxxx/resourceGroups/hwnosql/providers/Microsoft.Network/networkInterfaces/hwnos
    ql966
    OSProfile                         :
      ComputerName                    : hwnosql
      AdminUsername                   : hengwei
      LinuxConfiguration              :
        DisablePasswordAuthentication : False
    ProvisioningState                 : Succeeded
    StorageProfile                    :
      ImageReference                  :
        Publisher                     : OpenLogic
        Offer                         : CentOS
        Sku                           : 7.2
        Version                       : latest
      OsDisk                          :
        OsType                        : Linux
        Name                          : hwnosql
        Vhd                           :
          Uri                         : https://hw01sa01.blob.core.chinacloudapi.cn/vhds/hwnosql2016722122351.vhd
        Caching                       : ReadWrite
        CreateOption                  : FromImage
    NetworkInterfaceIDs[0]            : /subscriptions/xxxx/resourceGroups/hwnosql/providers/Microsoft.Network/networkInterfaces/hwnos
    ql966
    复制代码

     
    其中https://hw01sa01.blob.core.chinacloudapi.cn/vhds/hwnosql2016722122351.vhd 是其OSDisk的链接。
    2 用AzCopy复制此vhd文件到另外一个Container:

    复制代码
    C:\Users\hengz>set key="xxxxxxxxxxxx=="
    C:\Users\hengz>azcopy /source:https://hw01sa01.blob.core.chinacloudapi.cn/vhds /dest:https://hw01sa01.blob.core.chinacloudapi.cn/vhd /destkey:%key% /sourcekey:%key% /pattern:hwnosql2016722122351.vhd
    Finished 1 of total 1 file(s).
    [2016/08/25 16:55:00] Transfer summary:
    -----------------
    Total files transferred: 1
    Transfer successfully:   1
    Transfer skipped:        0
    Transfer failed:         0
    Elapsed time:            00.00:00:03
    复制代码

     
    3 在GitHub上的quickstart template找到相应的脚本:
    https://github.com/Azure/azure-quickstart-templates/tree/master/101-vm-from-user-image
    其中有两个文件是我们需要的,一个是azuredeploy.json, 另外一个是azuredeploy.parameters.json。
    浏览azuredeploy.json,没有什么需要我们更改的。
    浏览azuredeploy.parameters.json,更改所需内容:

    复制代码
    {
      "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "customVmName": {
          "value": "hwcopyimageVM"
        },
        "userImageStorageAccountName": {
          "value": "hw01sa01"
        },
        "adminUsername": {
          "value": "hengwei"
        },
        "adminPassword": {
          "value": "xxxxxxxx"
        },
        "osDiskVhdUri": {
          "value": "https://hw01sa01.blob.core.chinacloudapi.cn/vhd/hwnosql2016722122351.vhd"
        },
        "dnsLabelPrefix": {
          "value": "hwcopyimagevm"
        },
        "osType": {
          "value": "Linux"
        },
        "vmSize": {
          "value": "Standard_A1"
        },
        "newOrExistingVnet": {
          "value": "existing"
        },
        "newOrExistingVnetName": {
          "value": "hw01vnet"
        },
        "newOrExistingSubnetName": {
          "value": "Subnet-1"
        }
      }
    }
    复制代码

     
    4 通过PowerShell命令部署新的虚拟机:

    复制代码
    New-AzureRmResourceGroupDeployment -Name hwdpmt01 -ResourceGroupName hw01 -Mode Incremental -TemplateFile D:\Hengwei\Documents\GitHub\azure-quickstart-templates\101-vm-from-user-image\azuredeploy.json -TemplateParameterFile D:\Hengwei\Documents\GitHub\azure-quickstart-templates\101-vm-from-user-image\azuredeploy.parameters.json
    DeploymentName          : hwdpmt01
    ResourceGroupName       : hw01
    ProvisioningState       : Succeeded
    Timestamp               : 2016/8/25 9:10:23
    Mode                    : Incremental
    TemplateLink            :
    Parameters              :
                              Name             Type                       Value
                              ===============  =========================  ==========
                              customVmName     String                     hwcopyimageVM
                              userImageStorageAccountName  String                     hw01sa01
                              osDiskVhdUri     String                     https://hw01sa01.blob.core.chinacloudapi.cn/vhd/hwnosql2016722122351.vhd
                              dnsLabelPrefix   String                     hwcopyimagevm
                              adminUserName    String                     hengwei
                              adminPassword    SecureString
                              osType           String                     Linux
                              vmSize           String                     Standard_A1
                              newOrExistingVnet  String                     existing
                              newOrExistingVnetName  String                     hw01vnet
                              newOrExistingSubnetName  String                     Subnet-1
    Outputs                 :
    DeploymentDebugLogLevel :
    复制代码

     
    至此,部署完成。

  • 转:超详细的三部曲:搭建Nessus漏洞检测系统

    Nessus 被认为是目前全世界最多人使用的系统漏洞扫描与分析软件。总共有超过75,000个机构使用Nessus 作为扫描该机构电脑系统的软件。自从1998年开发至今已谕十年, 故为一架构成熟的软件
    需要的软件包如下:
    Nessus-3.2.0-es5.i386
    NessusClient-3.2.1-es5.i386
     
    安装软件包
    1 安装服务器端、客户端rpm包(安装过程中会初始化服务器端插件)
    wps_clip_image-8972

    2 添加执行程序路径、帮助文件路径。
    Nessus的相关执行程序默认位于/opt/nessus/sbin 和/opt/nessus/bin/目录,帮组文件默认位于/opt/nessus/man/目录。
    可分别调整环境变量PATH和MANPATH,以方便执行Nessus相关程序及查看帮助。
    这种是一次性的,也就是说重启后将不再生效
    wps_clip_image-28503
    下面这种是永久生效的:
     

    
    
    1. #vi ~/.bash_profile
    2. export PATH=/opt/nessus/sbin:/opt/nessus/bin:$PATH
    3. export MANPATH=/opt/nessus/man:’manpath’
    4. :wq!

     
    wps_clip_image-30806

    添加完以后,wq!强制保存退出

    配置服务端

    安装好nessus后,系统中将增加一个名为nessusd的服务。只需要添加一个用于扫描的用户,并启动nessusd服务,服务端就基本配置完成。
    Ps:Nessus还提供了一系列的脚本程序用于简化操作呢
    1启动Nessusd服务
    wps_clip_image-15080
    2 添加扫描用户
    执行nessus-adduser脚本,将会进入添加用户的交互式界面,需要依次指定用户名、认证方式、扫面规则等。主要步骤:
    a.输入新添加的用户名,该用户不需要是本地系统用户 (例如scaner1)
    b.选择认证方式(证书或密码),默认使用密码认证。
    c.如果选择使用密码认证,则重复输入两次密码确认 (例如pwd123)
    d.设置扫描权限规则(可以为空),即允许该用户扫描哪些网段或主机。每行设置一条扫描规则,一般使用”accept|deny IP/mask”的形式,“default deny|accept”的形式用于定义默认规则。规则设置完毕后,按ctrl+D 组合键提交。
    f.再次确认以上信息无误后,直接回车完成用户的添加。
    wps_clip_image-9457

    3管理扫描用户
    Nessus-rmuser脚本可用于删除用户,而nessus-chpasswd用于修改用户密码。
    —————–至此,Nessus已经配置完毕,可以使用了——————————

    使用Nessus用户端

    1运行客户端
    用户端需要在x-window图形环境中运行。
    确认当前在图形界面,执行命令:NessusClient& ,(注意大小写)即可打开用户端。
    wps_clip_image-12871
    wps_clip_image-17896

    2连接服务端
    单机左下方的“connect”,在弹出的对话框中点击左下方的“+”号按钮,设置好连接名称、需要登陆的NessusD服务器地址,以及使用的扫描用户名、密码。单击”save”保存。如下图所示:
    wps_clip_image-159453添加扫描目标
    选择“connection Manger”对话框中,选择刚刚创建的New connection进行连接。连接成功后,在scan选项卡中,单击“network(s) to scan”栏下方的“+”号按钮,设置需要扫描的主机或网络地址,如单个主机192.168.1.10,单击save保存。
    wps_clip_image-18634
    4执行漏洞扫描
    返回到scan选项卡,从左侧列表中选择刚设置的扫描用户,在右侧列表中选择Default scan policy 默认扫描策略,单机下方的scan now 按钮。如下图
    wps_clip_image-26127
    wps_clip_image-20690
    5获取及分析漏洞检测报告
    扫描完成后,可以通过“report”选项卡查看检测结果。针对目标主机的灭一个的每一项扫描内容,都可以获取摘要信息、具体描述、风险、建议解决方法等。如下图
    wps_clip_image-7679
    对于风险程度较高的安全隐患,会以高亮的颜色标出(橙色、红色)。Nessus会根据已知的风险评估给出相应的解决办法。
    例如主机开启了pop3服务,会建议关闭服务。
    单击右侧的“export”按钮可以将检测的结果到导出为html文件保存,方便在浏览器中查看

  • 转:Windows Azure Application Gateway 应用程序网关

    原文:http://winhe.blog.51cto.com/7547741/1742487

     本文主要介绍Windows Azure 应用程序网关三种主要功能介绍:Http负载平衡基于cookie会话连接SSL卸载

    技术分享
    Azure应用程序网关(Azure Application Gateway
    基础环境准备,在虚拟网络中为应用程序网关创建一个子网,在本文中使用AppGateway-1子网。
    技术分享

    New-AzureApplicationGateway -Name WinAppGW -VnetName AppGatewayVnet -Subnets AppGateway-1

    #新建应用程序网关,命名为WinAppGW ,放置在虚拟网络AppGatewayVnet 子网AppGateway-1
    #此时不会开始计收网关的费用。计费将在后面已成功启动网关时开始
    技术分享

    Get-AzureApplicationGateway

    #获取网关的详细信息
    技术分享

    Start-AzureApplicationGateway -Name WinAppGW

    #尝试启动网关,提示“由于没有进行任何配置,无法启动”
    技术分享
    既然这样,我们先配置“Http负载平衡”的功能。
    Part.1HTTP load balancingHttp负载平衡)

    1.  对比Azure负载平衡器 VS Azure应用程序网关
    Azure Load Balancer,工作在传输层工作,TCP/UDP,提供4负载均衡
    Azure Application Gateway 提供Http流量的路由规则,进一步对7http流量进行负载均衡
    技术分享
    2.Application Gateway 通过配置,可以将Http流量路由至虚拟机、云服务、web app外部IP
    3.实验过程:
     
    使用两台虚拟机作为后端web服务器集群:winappgatevm-1(10.0.0.4)winappgatevm-2(10.0.1.4)
     
    技术分享
    管理配置应用程序网关需要使用xml文件,使用如下xml文件,配置80端口的负载平衡:

    <?xml version=”1.0″ encoding=”utf-8″?>

    <ApplicationGatewayConfiguration xmlns:i=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://schemas.microsoft.com/windowsazure”>

    <!–FrontendPorts用来定义应用程序网关上的公网端口,我们要测试http负载均衡,所以定义FrontendPort180端口–>

    <FrontendPorts>

            <FrontendPort>

                <Name>FrontendPort1</Name>

                <Port>80</Port>

            </FrontendPort>

        </FrontendPorts>

    <!–BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.410.0.1.4两个AzureVM–>

        <BackendAddressPools>

            <BackendAddressPool>

                <Name>BackendPool1</Name>

                <IPAddresses>

                    <IPAddress>10.0.0.4</IPAddress>

                    <IPAddress>10.0.1.4</IPAddress>

                </IPAddresses>

            </BackendAddressPool>

        </BackendAddressPools>

    <!–BackendHttpSettingsList用来定义端口、协议、cookie-based affinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-based affinity(如果启用Cookie Based Session Affinity,我的PC将会连续访问同一台后端的web服务器,将无法看出负载平衡的效果,所以暂时禁用)–>

        <BackendHttpSettingsList>

            <BackendHttpSettings>

                <Name>BackendSetting1</Name>

                <Port>80</Port>

                <Protocol>Http</Protocol>

                <CookieBasedAffinity>Disabled</CookieBasedAffinity>

            </BackendHttpSettings>

        </BackendHttpSettingsList>

        <!–HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort180),使用Http协议–>

        <HttpListeners>

            <HttpListener>

                <Name>HTTPListener1</Name>

                <FrontendPort>FrontendPort1</FrontendPort>

                <Protocol>Http</Protocol>

            </HttpListener>

        </HttpListeners>

            <!–HttpLoadBalancingRules用来定义负载均衡规则,此处我们定义一个规则名为HttpLBRule1,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1web服务器80端口、使用http协议、禁用cookie-based affinity),绑定HTTPListener1(监听FrontendPort180),使用Http协议),绑定BackendPool1(包含10.0.0.410.0.1.4两个AzureVM),所以HttpLoadBalancingRules可以说是所有信息的汇总->

        <HttpLoadBalancingRules>

            <HttpLoadBalancingRule>

                <Name>HttpLBRule1</Name>

                <Type>basic</Type>

                <BackendHttpSettings>BackendSetting1</BackendHttpSettings>

                <Listener>HTTPListener1</Listener>

                <BackendAddressPool>BackendPool1</BackendAddressPool>

            </HttpLoadBalancingRule>

        </HttpLoadBalancingRules>

    </ApplicationGatewayConfiguration>

    #通过Azure Powershell,使用如下命令上传xml文件到应用程序网关完成配置

    Set-AzureApplicationGatewayConfig -Name WinAppGW -ConfigFile D:\web-80app.xml

    #对应参数是应用程序网关的名字、xml文件的路径
    技术分享
    #网关设置好了之后,通过以下命令启动网关
    Start-AzureApplicationGateway -Name WinAppGW
    技术分享
     
    #获取网关详细信息,网关的公网IP已经生成:139.217.27.22
    Get-AzureApplicationGateway -Name WinAppGW
    技术分享
     
    我之前在winappgatevm-110.0.0.4)和winappgatevm-210.0.1.4)上分别配置了两个简单的网站,随着刷新页面,我们发现轮询的负载均衡已经生效。
     
    技术分享
    技术分享
    Part.2Cookie Based Session Affinity 基于cookie会话连接
    1.应用场景:某些应用需要相同用户需要连接到不变的后台虚拟机,例如购物车应用、网页邮件服务器,基于cookie会话连接功能,可以使同一个的客户端session请求route 到相同的后端服务器,实现此类需求。
    2.实验过程:
    为了测试基于cookie会话连接,我们使用如下xml文件:
    xml文件参考如下

    <?xml version=”1.0″ encoding=”utf-8″?>

    <ApplicationGatewayConfiguration xmlns:i=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://schemas.microsoft.com/windowsazure”>

    <!–FrontendPorts用来定义应用程序网关上的公网端口,我们要测试http负载均衡+Cookie Based Session Affinity ,所以定义FrontendPort180端口–>

    <FrontendPorts>

            <FrontendPort>

                <Name>FrontendPort1</Name>

                <Port>80</Port>

            </FrontendPort>

        </FrontendPorts>

    <!–BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.410.0.1.4两个AzureVM–>

        <BackendAddressPools>

            <BackendAddressPool>

                <Name>BackendPool1</Name>

                <IPAddresses>

                    <IPAddress>10.0.0.4</IPAddress>

                    <IPAddress>10.0.1.4</IPAddress>

                </IPAddresses>

            </BackendAddressPool>

        </BackendAddressPools>

    <!–BackendHttpSettingsList用来定义端口、协议、cookie-based affinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-based affinity(如果启用Cookie Based Session Affinity,我的PC将会连续访问同一台后端的web服务器,将无法看出负载平衡的效果,所以暂时禁用)–>

        <BackendHttpSettingsList>

            <BackendHttpSettings>

                <Name>BackendSetting1</Name>

                <Port>80</Port>

                <Protocol>Http</Protocol>

                <CookieBasedAffinity>Enabled</CookieBasedAffinity>

            </BackendHttpSettings>

        </BackendHttpSettingsList>

        <!–HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort180),使用Http协议–>

        <HttpListeners>

            <HttpListener>

                <Name>HTTPListener1</Name>

                <FrontendPort>FrontendPort1</FrontendPort>

                <Protocol>Http</Protocol>

            </HttpListener>

        </HttpListeners>

            <!–HttpLoadBalancingRules用来定义负载均衡规则,此处我们定义一个规则名为HttpLBRule1,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1web服务器80端口、使用http协议、禁用cookie-based affinity),绑定HTTPListener1(监听FrontendPort180),使用Http协议),绑定BackendPool1(包含10.0.0.410.0.1.4两个AzureVM),所以HttpLoadBalancingRules可以说是所有信息的汇总->

        <HttpLoadBalancingRules>

            <HttpLoadBalancingRule>

                <Name>HttpLBRule1</Name>

                <Type>basic</Type>

                <BackendHttpSettings>BackendSetting1</BackendHttpSettings>

                <Listener>HTTPListener1</Listener>

                <BackendAddressPool>BackendPool1</BackendAddressPool>

            </HttpLoadBalancingRule>

        </HttpLoadBalancingRules>

    </ApplicationGatewayConfiguration>

    按照Part.1Azure Powershell命令上传配置,我们发现我的PC可以访问139.217.27.22
    抓取访问139.217.27.22的数据包,返现服务器在三次握手后首次返回的http报文中带有Set-cookie的内容如下ARRAffinity=b2b030bd049b3ae07c0c65419246492734f60ad3ec994bb9cb6414062dc14199\r\n
    技术分享
    紧接着我再次访问139.217.27.22时,我的http请求中带着之前服务器给我返回的cookie,致使我不断的刷新也只会访问首次访问的服务器。Cookie依旧是 ARRAffinity=b2b030bd049b3ae07c0c65419246492734f60ad3ec994bb9cb6414062dc14199\r\n
    技术分享
    Part.3SSL OffloadSSL卸载)
    Application Gateway起到了SSL加解密的作用,客户端跟App Gateway之间SSL Session 交互,不需要跟后台的所有的web 服务器分别建立SSL session,所有的SSL行为和SSL证书统一在App Gateway 设备上统一管理维护,相当于为后端VM卸载掉SSL加密的任务量,释放了后端VM的消耗在SSL加密上的资源。
    首先你需要有一张CA颁发的服务器端的*.pfx证书,关于制作证书,不在此赘述。

    #上传证书到应用程序网关

    Add-AzureApplicationGatewaySslCertificate  -Name WinAppGW -CertificateName GWCert -Password qwer1234! -CertificateFile D:\httpscert.pfx

    #需要分别指定网关名称、证书名称、密码、证书路径
    技术分享
    接下来我们需要配置xml文件,参考如下:

    <?xml version=”1.0″ encoding=”utf-8″?>

    <ApplicationGatewayConfiguration xmlns:i=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://schemas.microsoft.com/windowsazure”>

       <FrontendIPConfigurations />

    <!–FrontendPorts用来定义应用程序网关上的公网端口,我们要测试SSL Offload,所以定义FrontendPort1443端口–>

        <FrontendPorts>

            <FrontendPort>

                <Name>FrontendPort1</Name>

                <Port>443</Port>

            </FrontendPort>

        </FrontendPorts>

    <!–BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.410.0.1.4两个AzureVM–>

        <BackendAddressPools>

            <BackendAddressPool>

                <Name>BackendPool1</Name>

                <IPAddresses>

                    <IPAddress>10.0.0.4</IPAddress>

                    <IPAddress>10.0.1.4</IPAddress>

                </IPAddresses>

            </BackendAddressPool>

        </BackendAddressPools>

    <!–BackendHttpSettingsList用来定义端口、协议、cookie-based affinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-based affinity–>

        <BackendHttpSettingsList>

            <BackendHttpSettings>

                <Name>BackendSetting1</Name>

                <Port>80</Port>

                <Protocol>Http</Protocol>

                <CookieBasedAffinity>Disabled</CookieBasedAffinity>

            </BackendHttpSettings>

        </BackendHttpSettingsList>

    <!–HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort1443),使用Https协议、证书名字是GWCert–>

        <HttpListeners>

            <HttpListener>

                <Name>HTTPListener1</Name>

                <FrontendPort>FrontendPort1</FrontendPort>

                <Protocol>Https</Protocol>

                <SslCert>GWCert</SslCert>

            </HttpListener>

        </HttpListeners>

    <!–HttpLoadBalancingRules用来定义负载均衡规则,此处我们定义一个规则名为HttpLBRule1,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1web服务器80端口、使用http协议、禁用cookie-based affinity),绑定HTTPListener1(监听FrontendPort1443),使用Https协议、证书名字是GWCert),绑定BackendPool1(包含10.0.0.410.0.1.4两个AzureVM),所以HttpLoadBalancingRules可以说是所有信息的汇总,让我们完成SSL Offload+负载均衡–>

        <HttpLoadBalancingRules>

            <HttpLoadBalancingRule>

                <Name>HttpLBRule1</Name>

                <Type>basic</Type>

                <BackendHttpSettings>BackendSetting1</BackendHttpSettings>

                <Listener>HTTPListener1</Listener>

                <BackendAddressPool>BackendPool1</BackendAddressPool>

            </HttpLoadBalancingRule>

        </HttpLoadBalancingRules>

    </ApplicationGatewayConfiguration>

    #通过修改好的xml配置应用程序网关,使我们的证书生效

    Set-AzureApplicationGatewayConfig -Name WinAppGW -ConfigFile D:\ssloffloadhttplb.xml

    技术分享
    访问 https://139.217.27.22/ ,已经可以访问,并且可以负载均衡。证书为自己手工制作的自签名证书,此处不受信可以也不影响https的测试访问。
    技术分享
    技术分享
    Part.4】细节强化
    1. 网关大小:Small, Medium and Large
    其中Small仅仅用于测试。
    2.限制
    Global:一个订阅50个应用程序网关,每个应用程序网关最多10个实例(此处实例是指后端的虚拟机个数)。
    China:一个订阅10个应用程序网关

    修改网关大小和后端实例实数参考:

    Update-AzureApplicationGateway -Name “WinAppGW” -InstanceCount 5 -GatewaySize “Large” -Description “Updated application gateway”

    技术分享
    3.监测
    应用程序网关每隔30秒发出probe报文来监视监控后端服务器的健康情况,返回code200-399确认http服务正常。如果发现某个后台服务器不能及时响应导致probe失败之后,此台后台的VM会从健康实例池中移除,直到其能及时响应probe探测为止。
    4.同时使 http 80负载平衡、https 443负载平衡生效的xml参考配置:

    <?xml version=”1.0″ encoding=”utf-8″?>

    <ApplicationGatewayConfiguration xmlns:i=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://schemas.microsoft.com/windowsazure”>

    <!–FrontendPorts用来定义应用程序网关上的公网端口,我们定义了http80端口、https443端口–>

        <FrontendPorts>

            <FrontendPort>

                <Name>FrontendPort1</Name>

                <Port>80</Port>

            </FrontendPort>

            <FrontendPort>

                <Name>FrontendPort2</Name>

                <Port>443</Port>

            </FrontendPort>

        </FrontendPorts>

    <!–BackendAddressPools用来定义后端web服务器集群的地址群,我们定义了BackendPool1,它包含10.0.0.410.0.1.4两个AzureVM–>

        <BackendAddressPools>

            <BackendAddressPool>

                <Name>BackendPool1</Name>

                <IPAddresses>

                    <IPAddress>10.0.0.4</IPAddress>

                    <IPAddress>10.0.1.4</IPAddress>

                </IPAddresses>

            </BackendAddressPool>

        </BackendAddressPools>

    <!–BackendHttpSettingsList用来定义端口、协议、cookie-based affinity,此处我们定义了BackendSetting1,它包含了web服务器80端口、使用http协议、禁用cookie-based affinity–>

        <BackendHttpSettingsList>

            <BackendHttpSettings>

                <Name>BackendSetting1</Name>

                <Port>80</Port>

                <Protocol>Http</Protocol>

                <CookieBasedAffinity>Disabled</CookieBasedAffinity>

            </BackendHttpSettings>

        </BackendHttpSettingsList>

    <!–HttpListeners用来定义监听器,它起到监听应用程序网关公网端口的作用,用来响应公网用户的请求,此处我们定义了HTTPListener1,监听FrontendPort180),使用Http协议;HTTPListener1、监听FrontendPort2443),使用Https协议,证书名字是GWCert–>

        <HttpListeners>

            <HttpListener>

                <Name>HTTPListener1</Name>

                <FrontendPort>FrontendPort1</FrontendPort>

                <Protocol>Http</Protocol>

            </HttpListener>

            <HttpListener>

                <Name>HTTPListener2</Name>

                <FrontendPort>FrontendPort2</FrontendPort>

                <Protocol>Https</Protocol>

                <SslCert>GWCert</SslCert>

            </HttpListener>

        </HttpListeners>

    <!–HttpLoadBalancingRules用来定义负载均衡规则,此处我们定义一个规则名为HttpLBRule1,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1web服务器80端口、使用http协议、禁用cookie-based affinity),绑定HTTPListener1(监听FrontendPort180),使用Http协议),绑定BackendPool1(包含10.0.0.410.0.1.4两个AzureVM;定义一个规则名为HttpLBRule2,它使用basic规则(轮询的负载分配机制),绑定BackendSetting1web服务器80端口、使用http协议、禁用cookie-based affinity),绑定HTTPListener2(监听FrontendPort1443),使用Https协议、证书名字是GWCert),绑定BackendPool1(包含10.0.0.410.0.1.4两个AzureVM. 所以HttpLoadBalancingRules可以说是所有信息的汇总,这两个规则可以完成 http 80网站负载均衡+SSL Offload负载均衡–>

        <HttpLoadBalancingRules>

           <HttpLoadBalancingRule>

                <Name>HttpLBRule1</Name>

                <Type>basic</Type>

                <BackendHttpSettings>BackendSetting1</BackendHttpSettings>

                <Listener>HTTPListener1</Listener>

                <BackendAddressPool>BackendPool1</BackendAddressPool>

            </HttpLoadBalancingRule>

            <HttpLoadBalancingRule>

                <Name>HttpLBRule2</Name>

                <Type>basic</Type>

                <BackendHttpSettings>BackendSetting1</BackendHttpSettings>

                <Listener>HTTPListener2</Listener>

                <BackendAddressPool>BackendPool1</BackendAddressPool>

            </HttpLoadBalancingRule>

        </HttpLoadBalancingRules>

    </ApplicationGatewayConfiguration>

  • 转:用Raspberry Pi搭建Azure(EventHub)

    Raspberry Pi是一款基于Linux的单板机电脑。它由英国的树莓派基金会所开发,目的是以低价硬件及自由软件刺激在学校的基本计算机科学教育。树莓派配备一枚博通(Broadcom)出产的ARM架构700MHz BCM2835处理器,256MB內存(B型已升级到512MB内存),使用SD卡当作存储媒体,且拥有一个Ethernet、两个USB接口、以及HDMI(支持声音输出)和RCA端子输出支持。树莓派只有一张信用卡大小,体积大概是一个火柴盒大小,可以运行像《雷神之锤III竞技场》的游戏和进行1080p视频的播放。操作系统采用开源的Linux系统如Debian、ArchLinux,自带的Iceweasel、KOffice等软件,能够满足基本的网络浏览、文字处理以及电脑学习的需要。
    当然Raspberry Pi也可以成为最佳的IOT的终端设备,通过传感器收集数据,以供后台系统进行分析等。
    在Bash Shell中编写Python2.7的程序,获得温度传感器数据:
    #!/usr/bin/python
    from sense_hat import SenseHat
    sense = SenseHat()
    sense.clear()
    temp = sense.get_temperature()
    print(temp)
    运行此程序,可以在屏幕上打印目前的温度。
    同样,可以通过get_humidity()和get_pressure()等方法获得其他传感器的数值。
    具体的Sense-hat的各种python方法,请参考:
    https://pythonhosted.org/sense-hat/api/
     
    二.在Azure上创建Event Hub、Stream Analytics和SQL Azure DB
    1.创建Event hub:

    选择Custom create:

    填写相应的信息后输入:

    这样就创建了Event Hub的一个PaaS的服务。在配置中,创建一个Shared Access Policies:

    Save以后可以获得其SharedAccessKey:

    2.创建SQL Azure Database
    在Azure管理界面中选择SQL DB。在Server中选择Add:

    输入用户名和密码。创建SQL Server。

    然后选择创建SQL Database:

    创建好后,把本机的地址加入SQL的白名单:

    使用SQL的客户端连接数据库:

    在Options中选择数据库:

    登陆后创建table:
    Create table [dbo].[hwtest1] (
    Time Datetime2 (6) Null,
    DeviceId Varchar (16) Null,
    Temperature Float (53) Null,
    Humidity Float (53) Null
    );
    GO
    Create clustered index [hwtest1] on [dbo].[hwtest1] ([DeviceId] ASC);
    3.创建Stream Analytics

    创建成功后,在Input中添加Input:

    选择Event Hub:

    然后添加Event Hub的设置:

    在事件格式中选择JSON和UTF8

    创建Output:

    选择SQL Database,添加SQL的配置:

    在Query的设置中加入下面的配置:

    这里的DeviceId,Temperature,Humidity等参数必须在Python程序、Stream Analytics和SQL中相同。否则数据将不能取到。
    Input、Output和Query设置好后就可以启动此Job了。
    三.将Raspberry Pi的数据上传到Azure的Event Hub
    在Raspberry Pi上安装Azure的SDK:
    pip install azure
    安装完成后,更改Azure Service Bus的endpoint。请参考:
    https://msdn.microsoft.com/en-us/library/azure/dn578439.aspx
    对于Python的endpoint更改:
    在/usr/local/lib/python2.7/dist-packages/azure/servicebus/constants.py
    修改31行的配置
    #SERVICE_BUS_HOST_BASE = ‘.servicebus.windows.net’
    SERVICE_BUS_HOST_BASE = ‘.servicebus.chinacloudapi.cn’
     
    创建Python程序:
    #!/usr/bin/python
    from azure.servicebus import ServiceBusService
    from sense_hat import SenseHat
    from time import sleep
    import json;
    sense = SenseHat()
    sbs = ServiceBusService(“hwtest”, shared_access_key_name=”hwtest”, shared_access_key_value=”xxxxxx=”)
    while True:
    temp1 = sense.get_temperature()
    humi = sense.get_humidity()
    press = sense.get_pressure()
    temp= {‘DeviceId’: ‘dev-01’, ‘Temperature’: temp1, ‘Humidity’: humi}
    sbs.send_event(‘hwtest’, json.dumps(temp))
    sleep(60)
    调试程序让其后台运行。
    四.查看数据
    Raspberry Pi运行后,数据将发送到Azure的Event Hub。
    在Pi上可以通过tcpdump查看是否有https的包发送:
    tcpdump port 443
     
    在Stream Analytics上可以查看事件的情况:

    如果既有input又有output,说明配置正常。
    在Sql客户端上查询:
    Select * from hwtest1;

    五.通过Excel和PowerBI对数据进行分析
    目前Raspberry Pi的数据已经上传到了Event Hub,经过Stream Analytics发送到了SQL Server的表中。用户的展现可以通过Exel,PowerBI实现。
    1.Exel的展现:
    在Excel中选择数据,选择”自其他来源”,选择”来自SQL Server”。

    设置SQL Server:

    选择相应的数据库和相应的表:

    导入数据后,可以选择”插入”,选择”数据透视图”:

    在进行相应的选择后,将显示数据透视图:

    2.通过PowerBI实现展现
    打开网站: http://powerbi.microsoft.com
    下载Desktop的软件,进行安装。
    在客户端软件上进行SQL的连接配置:


    此时可以看到SQL中的表:

    选择import:

    选择相应的配置,就可以把数据以折线的形式展现出来:

    至此,所有的工作结束。

  • 转:Web网站压力测试工具

    Web网站性能体现在并发用户数已经网站的吞吐量和时延。
    最简单的压力测试工具就是ab “Apache Benchmark”
    下面将介绍ab的安装和使用:
    1. ab的安装
    ab的安装非常简单,安装了httpd,就自带ab
    CentOS下的安装:
    yum install -y httpd
    Ubuntu下的安装:
    apt-get install apache2
    安装好后,就可以使用ab了。
    2. ab使用前的准备工作
    由于ab是压力测试工具,我们需要把允许打开文件的数量调大。可以修改/etc/security/limits.conf

    echo "* soft nofile 65535" >> /etc/security/limits.conf;echo "* hard nofile 65535" >> /etc/security/limits.conf

    更改了这个配置后,需要重新启动VM。
    或者采用临时命令:

    ulimit -n 65535

    这样更改不需要重启机器。
    3. 运行ab,或wrk
    网上有很多ab和wrk使用的介绍,这里就不细讲了。一般打流量的命令是:

    ab -c 5000 -r -n 40000000 http://xx.xx.xx.xx/

    其中-c表示并发连接数;-n表示总共的请求数量;-r表示出现错误不退出,这个参数可以保证测试的连续性。注意http链接最后一定要是”/”,否则报错。

    wrk -t1 -c6000 -d2000s http://x.x.x.x/

     
    4. 脚本
    为了保证测试的连续性,下面的小脚本可以检测ab测试程序是否在运行。如果有,表示正在测试,等待10s,继续检测;如果没有,表示ab已经测试结束,需要重新启动。具体脚本如下:

    复制代码
    #!/bin/bash
    while true
    do
      flag=`ps -ef | grep "ab -c" | grep -v grep| wc -l`
      [ "$flag" = 1 ] && continue || ab -c 5000 -r -n 40000000 http://x.x.x.x/
      sleep 10
    done
    复制代码

    wrk的脚本如下

    复制代码
    #!/bin/bash
    while true
    do
    flag=`ps -ef | grep "wrk -t" | grep -v grep| wc -l`
    [ "$flag" = 1 ] && continue || /root/wrk-master/wrk -t1 -c6000 -d2000s http://x.x.x.x/
    sleep 10
    done
    复制代码

     
    把此脚本后台运行。
    5. 时延测试
    在服务器压力上去后,服务器的带宽和时延的检测成为检测服务器能力的指标之一。
    带宽的检测,可以采用nload、Zabbix等工具。
    时延的检测,也可以采用Zabbix等带外方式。本文采用的是比较简单的time工具。
    由于time和一般的Shell命令不同,grep、awk等语句不能正常的抓取执行结果。我们一般采用把执行结果输出到文件,再检索文件的方式。并且time的重定向是stderr的定向。具体命令是:

    (time -p curl http://x.x.x.x > /dev/null) &>> out.txt

    然后再采用grep real out.txt来获取时延。
    6. 时延脚本
    可以通过下面的脚本收集时延:

    复制代码
    #!/bin/bash
    while true
      do
      (time -p curl http://x.x.x.x > /dev/null) &> out.txt
      grep real out.txt | awk '{print $0 "\t" strftime()}' >> delay.txt
      sleep 10
    done
    复制代码

    7. 服务器端查看同时在线人数的命令
    netstat -n | awk ‘/^tcp/ {++state[$NF]} END {for(key in state) print key,”t”,state[key]}’
    结果如下:
    TIME_WAIT t 32502
    FIN_WAIT1 t 4171
    FIN_WAIT2 t 267
    ESTABLISHED t 993
    SYN_RECV t 610
    CLOSING t 274
    LAST_ACK t 1
    或者用下面的命令:
    netstat -s | grep “connections established”
    4288 connections established
    8. 通过curl统计时延插入数据库

    复制代码
    #!/bin/bash
    while true
    do
      (time -p curl http://x.x.x.x > /dev/null) &> out.txt
      grep real out.txt | awk '{print $0 "\t" strftime()}' >> delay.txt
      time=$(TZ=Asia/Shanghai date "+%Y-%m-%d %H:%M:%S")
      webDelay=`grep real out.txt | awk '{print $2}'`
      hostn=`hostname`
      mysql -hxxxx -uxxxx -pxxxx -e "use delay; insert into delay2 (delay, time, host) values($webDelay,'$time','$hostn');"
    sleep 20
    done
    复制代码

    8.1 通过python脚本把时延插入数据库

    复制代码
    #!/usr/bin/env python
    import StringIO
    import pycurl
    import sys
    import os
    import time
    import MySQLdb
    import socket
    def getHTTPTime(url):
        crl = pycurl.Curl()
        #crl.setopt(pycurl.VERBOSE,1)
        crl.setopt(pycurl.FOLLOWLOCATION, 1)
        crl.setopt(pycurl.MAXREDIRS, 5)
        crl.fp = StringIO.StringIO()
        crl.setopt(pycurl.URL, url)
        crl.setopt(crl.WRITEFUNCTION, crl.fp.write)
        p = crl.perform()
        time = crl.getinfo(pycurl.TOTAL_TIME)
        return time
    url = "http://xx.xx.xx.xx/"
    myhost = socket.gethostname()
    host="xxx.mysqldb.chinacloudapi.cn"
    user="xxx"
    passwd="xxxxxx"
    db="delay"
    port=3306
    try:
      conn=MySQLdb.connect(host=host,user=user,passwd=passwd,port=port)
      conn.select_db(db)
      conn.select_db(db)
      cur=conn.cursor()
      while True:
        curtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())
        mytime = float(getHTTPTime(url))
        T = []
        T.append(mytime)
        T.append(curtime)
        T.append(myhost)
        cur.execute('insert into delay10  (delay, time, host) values(%s,%s,%s)',T);
        conn.commit()
        #aa=cur.execute('select id,delay,time from delay10')
        #print aa
        #for data in cur.fetchall():
        #  print data
        time.sleep(60)
    except MySQLdb.Error,e:
      print "Mysql Error %d: %s" % (e.args[0], e.args[1])
    复制代码

     
    9. 通过paping检测时延,并插入数据库

    复制代码
    #!/bin/bash
    while true
    do
      getDelay=`/root/paping -p 80 -c 1 x.x.x.x | grep time= | awk '{print $4}' | awk 'BEGIN{FS="="} {print $2}'`
      time=$(TZ=Asia/Shanghai date "+%Y-%m-%d %H:%M:%S")
      #webDelay=`echo ${a%ms*}`
      [ $getDelay ] && webDelay=$getDelay || webDelay=1000
      hostn=`hostname`
      mysql -hhwdelay.mysqldb.chinacloudapi.cn -uhwdelay%hengwei -pabc@123456 -e "use delay; insert into delay4 (delay, time, host) values('$webDelay','$time','$hostn');"
    sleep 20
    done
    复制代码

    10. php页面反应实际时延情况:

    复制代码
    <?php
        echo "xxx时延测试</br>";
        echo "大于1秒钟时延的统计";
        $mysql_server_name="xxxxxx"; //数据库服务器名称
        $mysql_username="xxxxx"; // 连接数据库用户名
        $mysql_password="xxxxx"; // 连接数据库密码
        $mysql_database="delay"; // 数据库的名字
        // 连接到数据库
        $conn=mysql_connect($mysql_server_name, $mysql_username,
                            $mysql_password);
         // 从表中提取信息的sql语句
        $strsql="select * from delay2 where delay > 1 order by id desc";
        // 执行sql查询
        $result=mysql_db_query($mysql_database, $strsql, $conn);
        // 获取查询结果
        $row=mysql_fetch_row($result);
        echo '<font face="verdana">';
        echo '<table border="1" cellpadding="1" cellspacing="2">';
        // 显示字段名称
        echo "</b><tr></b>";
        for ($i=0; $i<mysql_num_fields($result); $i++)
        {
          echo '<td bgcolor="#FF0000"><b>'.
          mysql_field_name($result, $i);
          echo "</b></td></b>";
        }
        echo "</tr></b>";
        // 定位到第一条记录
        mysql_data_seek($result, 0);
        // 循环取出记录
        while ($row=mysql_fetch_row($result))
        {
          echo "<tr></b>";
          for ($i=0; $i<mysql_num_fields($result); $i++ )
          {
            echo '<td bgcolor="#00FF00">';
            echo $row[$i];
            echo '</td>';
          }
          echo "</tr></b>";
        }
        echo "</table></b>";
        echo "</font>";
        // 释放资源
        mysql_free_result($result);
        // 关闭连接
        mysql_close($conn);
    ?>
    复制代码

    11. 多监测点合并网页:

    复制代码
    <!DOCTYPE html>
    <html>
      <head>
        <title>HWTEST.html</title>
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"/>
        <meta http-equiv="description" content="this is my page"/>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
        <link rel="stylesheet" type="text/css" href="./test.css">
      </head>
      <body>
      <!-- Logo div -->
      <div class="logo">
       <h1>xxx时延测试比较页面</h1>
      </div>
      <!-- Adv div -->
      <div class="ad">
        <div class="stuad">
        <h4>Azure上海VM检测Azure北京VM时延</br></h4>
        <h4>大于1秒钟时延的统计</h4>
        <?php
          $mysql_server_name="xxx.chinacloudapi.cn"; //数据库服务器名称
          $mysql_username="xxx"; // 连接数据库用户名
          $mysql_password="xxx"; // 连接数据库密码
          $mysql_database="delay"; // 数据库的名字
          // 连接到数据库
          $conn=mysql_connect($mysql_server_name, $mysql_username,
                              $mysql_password);
           // 从表中提取信息的sql语句
          $strsql="select id,delay,time from delay2 where delay > 1 order by id desc";
          //$strsql="select * from delay2 where delay > 1 order by id desc";
          // 执行sql查询
          $result=mysql_db_query($mysql_database, $strsql, $conn);
          // 获取查询结果
          $row=mysql_fetch_row($result);
          echo '<font face="verdana">';
    //    echo '<table border="1" cellpadding="1" cellspacing="2">';
          echo '<table border="1" cellpadding="1" cellspacing="2" align="center">';
          // 显示字段名称
          echo "</b><tr></b>";
          for ($i=0; $i<mysql_num_fields($result); $i++)
          {
            echo '<td bgcolor="#FF0000"><b>'.
            mysql_field_name($result, $i);
            echo "</b></td></b>";
          }
          echo "</tr></b>";
          // 定位到第一条记录
          mysql_data_seek($result, 0);
          // 循环取出记录
          while ($row=mysql_fetch_row($result))
          {
            echo "<tr></b>";
            for ($i=0; $i<mysql_num_fields($result); $i++ )
            {
              echo '<td bgcolor="#00FF00">';
              echo $row[$i];
              echo '</td>';
            }
            echo "</tr></b>";
          }
          echo "</table></b>";
          echo "</font>";
          // 释放资源
          mysql_free_result($result);
          // 关闭连接
          mysql_close($conn);
      ?>
        </div>
        <div class="ad2">
        <h4>家中采用curl检测页面时延</br></h4>
        <h4>大于1秒钟时延的统计</h4>
        <?php
          $mysql_server_name="xxx.chinacloudapi.cn"; //数据库服务器名称
          $mysql_username="xxx"; // 连接数据库用户名
          $mysql_password="xxx"; // 连接数据库密码
          $mysql_database="delay"; // 数据库的名字
          // 连接到数据库
          $conn=mysql_connect($mysql_server_name, $mysql_username,
                              $mysql_password);
           // 从表中提取信息的sql语句
          $strsql="select id,delay,time from delay3 where delay > 1 order by id desc";
          // 执行sql查询
          $result=mysql_db_query($mysql_database, $strsql, $conn);
          // 获取查询结果
          $row=mysql_fetch_row($result);
          echo '<font face="verdana">';
    //    echo '<table border="1" cellpadding="1" cellspacing="2">';
          echo '<table border="1" cellpadding="1" cellspacing="2" align="center" >';
          // 显示字段名称
          echo "</b><tr></b>";
          for ($i=0; $i<mysql_num_fields($result); $i++)
          {
            echo '<td bgcolor="#FF0000"><b>'.
            mysql_field_name($result, $i);
            echo "</b></td></b>";
          }
          echo "</tr></b>";
          // 定位到第一条记录
          mysql_data_seek($result, 0);
          // 循环取出记录
          while ($row=mysql_fetch_row($result))
          {
            echo "<tr></b>";
            for ($i=0; $i<mysql_num_fields($result); $i++ )
            {
              echo '<td bgcolor="#00FF00">';
              echo $row[$i];
              echo '</td>';
            }
            echo "</tr></b>";
          }
          echo "</table></b>";
          echo "</font>";
          // 释放资源
          mysql_free_result($result);
          // 关闭连接
          mysql_close($conn);
      ?>
        </div>
        <div class="house">
        <h4>家中采用paping测试</br></h4>
        <h4>大于100ms时延的统计</h4>
        <?php
          $mysql_server_name="xxx.chinacloudapi.cn"; //数据库服务器名称
          $mysql_username="xxx"; // 连接数据库用户名
          $mysql_password="xxx"; // 连接数据库密码
          $mysql_database="delay"; // 数据库的名字
          // 连接到数据库
          $conn=mysql_connect($mysql_server_name, $mysql_username,
                              $mysql_password);
           // 从表中提取信息的sql语句
          $strsql="select id,delay,time from delay4 where delay > 100 order by id desc";
          // 执行sql查询
          $result=mysql_db_query($mysql_database, $strsql, $conn);
          // 获取查询结果
          $row=mysql_fetch_row($result);
          echo '<font face="verdana">';
    //    echo '<table border="1" cellpadding="1" cellspacing="2">';
          echo '<table border="1" cellpadding="1" cellspacing="2" align="center" >';
          // 显示字段名称
          echo "</b><tr></b>";
          for ($i=0; $i<mysql_num_fields($result); $i++)
          {
            echo '<td bgcolor="#FF0000"><b>'.
            mysql_field_name($result, $i);
            echo "</b></td></b>";
          }
          echo "</tr></b>";
          // 定位到第一条记录
          mysql_data_seek($result, 0);
          // 循环取出记录
          while ($row=mysql_fetch_row($result))
          {
            echo "<tr></b>";
            for ($i=0; $i<mysql_num_fields($result); $i++ )
            {
              echo '<td bgcolor="#00FF00">';
              echo $row[$i];
              echo '</td>';
            }
            echo "</tr></b>";
          }
          echo "</table></b>";
          echo "</font>";
          // 释放资源
          mysql_free_result($result);
          // 关闭连接
          mysql_close($conn);
      ?>
        </div>
      </div>
      </body>
    </html>
    复制代码

    CSS文件:

    复制代码
    body{
    width:950px;
    margin: 0 auto;
    background-color: white;
    border: 1px solid red;
    font-size: 16px;
    }
    .logo{
    width: 950px;
    height: 68px;
    background-color: yellow;
    float: left;
    margin-top: 5px;
    text-align: center;
    }
    .ad{
    width: 950px;
    /*height: 212px;*/
    /*background-color: pink;*/
    margin-top: 5px;
    float: left;
    }
    .stuad{
    width: 310px;
    /*height: 196px;*/
    float: left;
    background-color: #ADFEDC;
    margin: 4px 0 0 4px;
    text-align: center;
    }
    .ad2{
    width: 310px;
    /*height: 196px;*/
    float: left;
    background-color: #D2A2CC;
    margin: 4px 0 0 4px;
    text-align: center;
    }
    .house{
    width: 310px;
    /*height: 196px;*/
    float: left;
    background-color: #FC7E8C;
    margin: 4px 0 0 4px;
    text-align: center;
    }
    复制代码

    12. 检测程序是否运行的脚本

    复制代码
    #!/bin/bash
    while true
    do
    cflag=`ps -ef | grep delay.sh | grep -v grep | wc -l`
    pflag=`ps -ef | grep mypachk.sh | grep -v grep | wc -l`
    echo $cflag  $pflag
    #[ "$flag" = 1 ] && continue || /root/delay.sh &
    [ "$cflag" = 0 ] && /root/delay.sh  || echo "curl is ok" >> record.txt
    [ "$pflag" = 0 ] && /root/mypachk.sh  || echo "paping is ok" >> record.txt
    sleep 600
    done
    复制代码