Skip navigation
2016

今年も、日本の vExpert によるアドベントカレンダーが始まります。

クリスマスの12/25 まで、VMwareにかかわる何かが1日1投稿される予定ですので、

お楽しみいただければと思います。

vExperts Advent Calendar 2016 - Adventar

 

今回は、PowerShell での VMware NSX 操作を簡易化する PowerNSX を紹介します。

使用例として、NSX の論理スイッチを作成して VM を接続してみます。

下記のような感じで、ls-test-01 という論理スイッチを作成して、photon01 と photon02 という VM を接続します。

vE-Advent2016-PowerNSX-1.png

 

 

PowerNSX について。

 

PowerNSX は、VMware NSX API を抽象化してくれる PowerShell モジュールです。
GitHub で公開されています。

GitHub - vmware/powernsx

 

VMware 社から公式にサポートされている製品ではありませんが、PowerCLI と組み合わせて使用できるのでとても便利です。

使用方法は、下記の Wiki が参考になります。

https://github.com/vmware/powernsx/wiki

 

PowerShell か PowerCLI のウインドウから下記のリンクにあるコマンドラインを実行することでインストールできます。

これは、インストールスクリプトをダウンロードして実行しています。

GitHubhttps://github.com/vmware/powernsx/wiki/Installing-PowerNSX

 

PowerShell コマンドレットは基本的に「Verb-Noun」という名前となっているので、

それをもとに PowerNSX モジュールに含まれるコマンドレットをざっくりまとめてみました。

NSX の機能に幅広く対応していて、便利そうな様子を感じていただけるのではないかと思います。

PS C:\work> gcm -Module PowerNSX | group Noun | select Name,{$_.Group.Verb -join ","} | sort Name


Name                               $_.Group.Verb -join ","

----                               -----------------------

NsxAddressSpec                     New

NsxBackingDVSwitch                 Get

NsxBackingPortGroup                Get

NsxCli                             Invoke

NsxCliDfwAddrSet                   Get

NsxCliDfwFilter                    Get

NsxCliDfwRule                      Get

NsxCluster                         Install,Remove

NsxClusterStatus                   Get

NsxClusterVxlanConfig              New,Remove

NsxController                      Get,New

NsxEdge                            Copy,Get,New,Remove,Repair,Set

NsxEdgeBgp                         Get,Set

NsxEdgeBgpNeighbour                Get,New,Remove

NsxEdgeCertificate                 Get,Remove

NsxEdgeCsr                         Get,New

NsxEdgeInterface                   Clear,Get,Set

NsxEdgeInterfaceAddress            Add,Get,Remove

NsxEdgeInterfaceSpec               New

NsxEdgeNat                         Get,Set

NsxEdgeNatRule                     Get,New,Remove

NsxEdgeOspf                        Get,Set

NsxEdgeOspfArea                    Get,New,Remove

NsxEdgeOspfInterface               Get,New,Remove

NsxEdgePrefix                      Get,New,Remove

NsxEdgeRedistributionRule          Get,New,Remove

NsxEdgeRouting                     Get,Set

NsxEdgeSelfSignedCertificate       New

NsxEdgeSsh                         Disable,Enable

NsxEdgeStaticRoute                 Get,New,Remove

NsxEdgeSubInterface                Get,New,Remove

NsxEdgeSubInterfaceSpec            New

NsxFirewallExclusionListMember     Add,Get,Remove

NsxFirewallRule                    Get,New,Remove

NsxFirewallSavedConfiguration      Get

NsxFirewallSection                 Get,New,Remove

NsxIpPool                          Get,New

NsxIpSet                           Get,New,Remove

NsxLoadBalancer                    Get,Set

NsxLoadBalancerApplicationProfile  Get,New,Remove

NsxLoadBalancerApplicationRule     Get,New

NsxLoadBalancerMemberSpec          New

NsxLoadBalancerMonitor             Get,New,Remove

NsxLoadBalancerPool                Get,New,Remove

NsxLoadBalancerPoolMember          Add,Get,Remove

NsxLoadBalancerStats               Get

NsxLoadBalancerVip                 Add,Get,Remove

NsxLogicalRouter                   Get,New,Remove

NsxLogicalRouterBgp                Get,Set

NsxLogicalRouterBgpNeighbour       Get,New,Remove

NsxLogicalRouterInterface          Get,New,Remove,Set

NsxLogicalRouterInterfaceSpec      New

NsxLogicalRouterOspf               Get,Set

NsxLogicalRouterOspfArea           Get,New,Remove

NsxLogicalRouterOspfInterface      Get,New,Remove

NsxLogicalRouterPrefix             Get,New,Remove

NsxLogicalRouterRedistributionRule Get,New,Remove

NsxLogicalRouterRouting            Get,Set

NsxLogicalRouterStaticRoute        Get,New,Remove

NsxLogicalSwitch                   Get,New,Remove

NsxMacSet                          Get,New,Remove

NsxManager                         New,Set

NsxManagerBackup                   Get

NsxManagerComponentSummary         Get

NsxManagerNetwork                  Get

NsxManagerSsoConfig                Get

NsxManagerSyslogServer             Get

NsxManagerSystemSummary            Get

NsxManagerTimeSettings             Get

NsxManagerVcenterConfig            Get

NsxObject                          Export,Import

NsxRestMethod                      Invoke

NsxSecurityGroup                   Get,New,Remove

NsxSecurityGroupEffectiveMembers   Get

NsxSecurityGroupMember             Add,Remove

NsxSecurityPolicy                  Get,Remove

NsxSecurityTag                     Get,New,Remove

NsxSecurityTagAssignment           Get,New,Remove

NsxSegmentIdRange                  Get,New,Remove

NsxServer                          Connect,Disconnect

NsxService                         Get,New,Remove

NsxServiceGroup                    Get,New,Remove

NsxServiceGroupMember              Add,Get

NsxSpoofguardNic                   Get

NsxSpoofguardNicApproval           Grant,Revoke

NsxSpoofguardPolicy                Get,New,Publish,Remove

NsxSslVpn                          Get,Set

NsxSslVpnAuthServer                Get,New

NsxSslVpnClientInstallationPackage Get,New,Remove

NsxSslVpnIpPool                    Get,New,Remove

NsxSslVpnPrivateNetwork            Get,New,Remove

NsxSslVpnUser                      Get,New,Remove

NsxTransportZone                   Get,New,Remove

NsxVdsContext                      Get,New,Remove

NsxWebRequest                      Invoke

NsxWhereVMUsed                     Find

PowerNsx                           Update

PowerNsxVersion                    Get

XML                                Format

XmlElement                         Add



 

 

NSX Manager への接続。

 

PowerNSX は、NSX Manager に接続して操作します。

そして、PowerCLI 実行のため vCenter にも接続する必要があります。

「Connect-NsxServer」で NSX Manager に接続するときに、

NSX Manager のひもづく vCenter にも接続することができます。


例では、下記のサーバに接続しています。
※これはうちの VC / NSX Manager なので、実際にためす場合はホスト名を置き換えていただければと思います。

  • NSX Manager:  nsxmgr01.godc.lab
  • vCenter: vc01.godc.lab

NSX 6.2.4 の Manager に接続されています。

PS> Connect-NsxServer nsxmgr01.godc.lab


コマンド パイプライン位置 1 のコマンドレット Connect-NsxServer

次のパラメーターに値を指定してください:

Credential  ★ここで NSX Manager のユーザ/パスワードを入力する。


PowerNSX requires a PowerCLI connection to the vCenter server NSX is registered against for proper operation.

Automatically create PowerCLI connection to vc01.godc.lab?

[Y] Yes  [N] No  [?] ヘルプ (既定値は "Y"): Y


警告: Enter credentials for vCenter vc01.godc.lab


コマンド パイプライン位置 1 のコマンドレット Get-Credential

次のパラメーターに値を指定してください:

Credential  ★ここで vCenter のユーザ/パスワードを入力する。


Version             : 6.2.4

BuildNumber         : 4292526

Credential          : System.Management.Automation.PSCredential

Server              : nsxmgr01.godc.lab

Port                : 443

Protocol            : https

ValidateCertificate : False

VIConnection        : vc01.godc.lab

DebugLogging        : False

DebugLogFile        : C:\Users\gowatana\AppData\Local\Temp\PowerNSXLog-admin@nsxmgr01.godc.lab-2016_11_30_08_39_13.log


 

NSX の操作。

 

それでは、PowerNSX のコマンドレットで論理スイッチを作成いて、VM を接続してみます。

NSX の「論理スイッチ」の実体は VXLAN に対応した分散ポートグループなので、PowerCLI ではポートグループとしてあつかっています。


まず、論理スイッチを作成する Transport Zone の名前を調べておきます。

PS> Get-NsxTransportZone | select name


name

----

transport-zone-01

 


この Transport Zone に、論理スイッチ「ls-test-01」を作成します。

PS> $tz = Get-NsxTransportZone transport-zone-01

PS> New-NsxLogicalSwitch -TransportZone $tz -Name ls-test-01


objectId              : virtualwire-28

objectTypeName        : VirtualWire

vsmUuid               : 4209B0DF-0305-4636-49B2-75A0D86FC009

nodeId                : 1a3405be-3b88-47a4-a293-33d295087e10

revision              : 2

type                  : type

name                  : ls-test-01

description           :

clientHandle          :

extendedAttributes    :

isUniversal           : false

universalRevision     : 0

tenantId              :

vdnScopeId            : vdnscope-2

vdsContextWithBacking : vdsContextWithBacking

vdnId                 : 5001

guestVlanAllowed      : false

controlPlaneMode      : UNICAST_MODE

ctrlLsUuid            : 4caa5832-0d33-404c-b596-5f1c4c5ae9c6

macLearningEnabled    : false

 

 

論理スイッチの一覧が簡単に取得できます。直前で作成した ls-test-01 も表示されています。

PS> Get-NsxLogicalSwitch | select objectId,name,vdnId


objectId       name            vdnId

--------       ----            -----

virtualwire-18 ls-transit-001  5000

virtualwire-24 ls-tenant01-ext 5011

virtualwire-25 ls-tenant01-int 5012

virtualwire-26 ls-tenant02-ext 5013

virtualwire-27 ls-tenant02-int 5014

virtualwire-28 ls-test-01      5001

 

 

論理スイッチに VM を接続します。

今回、論理スイッチに接続する VM は「photon01」と「photon02」の 2台です。

PS> Get-VM -Name photon0[12] | sort Name


Name                 PowerState Num CPUs MemoryGB

----                 ---------- -------- --------

photon01             PoweredOn  1        2.000

photon02             PoweredOn  1        2.000


 

作成した論理スイッチ「ls-test-01」の実体となる分散ポートグループを調べます。

分散ポートグループは、「vxw-dvs-69-virtualwire-28-sid-5001-ls-test-01」 という名前で自動作成されています。

PS> Get-NsxLogicalSwitch -Name ls-test-01 | Get-NsxBackingPortGroup | select VDSwitch,Name


VDSwitch Name

-------- ----

vds01    vxw-dvs-69-virtualwire-28-sid-5001-ls-test-01

 


この論理スイッチ(分散ポートグループ)に、VM の1つ目の vNIC「Network adapter 1 」を接続します。

PS> $pg = Get-NsxLogicalSwitch -Name ls-test-01 | Get-NsxBackingPortGroup

PS> Get-VM -Name photon0[12] | sort Name | Get-NetworkAdapter -Name "Network adapter 1" | Set-NetworkAdapter -Portgroup $pg -Confirm:$false


 

Name                 Type       NetworkName  MacAddress         WakeOnLan

                                                                  Enabled

----                 ----       -----------  ----------         ---------

Network adapter 1    Vmxnet3    vxw-dvs-6... 00:50:56:89:e9:b7      False

Network adapter 1    Vmxnet3    vxw-dvs-6... 00:50:56:89:00:cf      False

 


それぞれの VM の「Network adapter 1」に分散ポートグループが接続されました。

PS> Get-VM -Name photon0[12] | sort Name | Get-NetworkAdapter | ft -AutoSize Parent,Name,NetworkName


Parent   Name              NetworkName

------   ----              -----------

photon01 Network adapter 1 vxw-dvs-69-virtualwire-28-sid-5001-ls-test-01

photon01 Network adapter 2 dvpg-vlan-0005

photon02 Network adapter 1 vxw-dvs-69-virtualwire-28-sid-5001-ls-test-01

photon02 Network adapter 2 dvpg-vlan-0005

 


分散ポートグループに対応する論理スイッチ「ls-test-01 」に、VM「photon01」 と「photon02」 が接続されたことが分かります。

PS C:\work> Get-NsxLogicalSwitch -Name ls-test-01 | Get-NsxBackingPortGroup | Get-VM


Name                 PowerState Num CPUs MemoryGB

----                 ---------- -------- --------

photon01             PoweredOn  1        2.000

photon02             PoweredOn  1        2.000

 

 

一般的な GUI 操作で使用する vSphere Web Client で見ると、このような状態になります。

vE-Advent2016-PowerNSX-2.png


NSX の操作は、vSphere Web Client からの操作だと画面遷移が多く煩雑になりやすいと思います。

一方、手作業で NSX API を実行するには、オブジェクト ID の確認や XML の作成などが面倒です。

この例のような感じで、PowerNSX を使用すると(特に PowerShell / PowerCLI 経験があれば)簡単に
NSX をコマンドライン操作できるようになります。


以上、PowerNSX の紹介でした。

NSX for vSphere 6.2.4 の分散ファイアウォール(DFW)は、マルチテナント機能を持っていません。

DFW で設定する FW ルールは、デフォルトでは NSX Manager で管理する DFW 環境すべてに適用されます。

そこで、DFW ルールの「適用先」を指定することでルールの適用先をしぼり、マルチテナントっぽくしてみました。

※vForum 2016 Tokyo の SDDCブースあたりで聞いた話を、実際にためしてみました・・・

 

完成イメージ。

いきなりですが、最初に DFW ルールの完成イメージです。

  • テナントを2つあるものとします。(tenant01 と tenant02)
  • テナントごとに、DFW ルールのセクション(dfw-tenant-01 と dfw-tenant-02)を作成してみました。
  • セクションに含まれるルールには、必ず「適用先」にセキュリティグループを含めます。
    それぞれのセキュリティグループには、テナント内の全 VM を含むようにします。
    FW ルールは上から評価されるため、別テナントの FW ルールのが適用されてしまわないように
    かならず「適用先」を設定するようにします。
  • Default でブロックするルールは、デフォルト セクションで設定することができますが、
    わかりやすいのであえてテナントごとに追加してみました。

dfw-mt-1-01.png

 

テナント / VM 構成について。

今回の構成では、2つテナントを用意してみました。
DFW の機能には関係ありませんが、わかりやすくテナントごとにフォルダ分けしてあります。

セキュリティグループで管理しやすいように、VMの名前を工夫しています。

  • tenant01 の VM → t01-~
  • tenant02 の VM → t02-~

dfw-mt-2-01.png

 

セキュリティグループの構成について。

テナントごとに、テナント内の全 VM を含むセキュリティグループを作成してみました。

それぞれのセキュリティグループには、3台の VM が含まれています。

dfw-mt-3-01.png

 

今回はテナントごとに VM 名の先頭文字列を決めてあるので、
セキュリティグループの「動的メンバーシップの定義」 で、
「仮想マシン名」 の 「先頭が」 「t01-」(tenant02では、「t02-」) と設定しています。

これで、命名規則どおりの VM であれば、セキュリティグループに自動追加されるようになります。

dfw-mt-3-02.png

 

DFW ルールの「適用先」 の設定について。

例として、tenant02 の DFW ルールの1つに、セキュリティグループ 「secgr-tenant-02」 を設定してみます。


DFW ルールの適用先は、デフォルトでは「Distributed Firewall」 となっています。

ここに、セキュリティグループを設定してみます。

dfw-mt-4-01.png

 

編集ボタンをクリックすると、

「Distributed Firewall がインストールされているすべてのクラスタにこのルールを適用します。」にチェックが入っています。

dfw-mt-4-02.png

 

このチェックを外すと適用先のオブジェクトタイプが選択できるようになるので、
「Security Group」 を選択します。

dfw-mt-4-03.png

 

セキュリティグループを選択しました。

dfw-mt-4-04.png

 

「変更の発行」 をクリックすると、DFW のルールが反映されます。

dfw-mt-4-05.png

 

テナントごとに DFW ルールの適用先が揃えて、下記のような感じにします。

ここで表示されている「ルール ID」は、あとで DFW の適用状態の確認で使用します。

dfw-mt-4-06.png

 

ちなみに、セキュリティグループのリンクをクリックすると、所属している VM を確認することができます。

dfw-mt-4-07.png

 

DFW ルールの適用状態を確認してみる。

DFW ルールが適用されているか、ESXi に SSH ログインして見てみます。

summarize-dvfilter コマンドで VM (vNIC)ごとの DVFilter の名前を確認して、

それをもとに vsipioctl コマンドでルールを確認します。

 

まず、tenant01 に含まれる、t01-web01 という VM のDFW ルールを見てみます。

vNIC は 2つありますが、片方を確認すれば十分とおもわれるので eth0 のに設定されたルールを見てみます。

[root@hv-i21:~] summarize-dvfilter | grep t01-web01 -A5

world 7733173 vmm0:t01-web01 vcUuid:'50 09 f2 fe 1b 1d 2d e5-f8 33 8c 17 4f d0 91 2e'

port 50331775 t01-web01.eth0

  vNic slot 2

   name: nic-7733173-eth0-vmware-sfw.2

   agentName: vmware-sfw

   state: IOChain Attached

   vmState: Detached

--

port 50331776 t01-web01.eth1

  vNic slot 2

   name: nic-7733173-eth1-vmware-sfw.2

   agentName: vmware-sfw

   state: IOChain Attached

   vmState: Detached

[root@hv-i21:~]

 

フィルタ名をもとに、DFW ルールを確認します。

今回設定したルールは ID が 1008 ~ 1013 なので、赤字の部分のみが関係します。

tenant01 むけに設定したルール (1009、1011、1012) だけが設定されていることが分かります。

[root@hv-i21:~] vsipioctl getrules -f nic-7733173-eth0-vmware-sfw.2

ruleset domain-c7 {

  # Filter rules

rule 1009 at 1 inout protocol any from any to addrset ip-virtualwire-26 accept;

  rule 1011 at 2 inout protocol any from addrset ip-virtualwire-25 to addrset ip-virtualwire-25 accept;

  rule 1012 at 3 inout protocol any from any to any drop;

  rule 1007 at 4 inout protocol udp from addrset ip-securitygroup-10 to addrset ip-vm-465 port 67 accept;

  rule 1006 at 5 inout inet protocol udp from addrset ip-securitygroup-10 to any port 67 reject;

  rule 1005 at 6 in inet protocol udp from any to addrset ip-vm-465 port 67 reject;

  rule 1003 at 7 inout protocol ipv6-icmp icmptype 136 from any to any accept;

  rule 1003 at 8 inout protocol ipv6-icmp icmptype 135 from any to any accept;

  rule 1002 at 9 inout protocol udp from any to any port 68 accept;

  rule 1002 at 10 inout protocol udp from any to any port 67 accept;

  rule 1001 at 11 inout protocol any from any to any accept;

}


ruleset domain-c7_L2 {

  # Filter rules

  rule 1004 at 1 inout ethertype any from any to any accept;

}


[root@hv-i21:~]

 

次に、tenant02 に含まれる、t02-web01 という VM のDFW ルールを見てみます。

こちらも vNIC が 2つありますが、eth0 のに設定されたルールだけ見てみます。

[root@hv-i23:~] summarize-dvfilter | grep t02-web01 -A5

world 7676381 vmm0:t02-web01 vcUuid:'50 09 46 a8 08 76 3f da-7c 6e ec 30 3b 28 67 c0'

port 50331717 t02-web01.eth0

  vNic slot 2

   name: nic-7676381-eth0-vmware-sfw.2

   agentName: vmware-sfw

   state: IOChain Attached

   vmState: Detached

--

port 50331718 t02-web01.eth1

  vNic slot 2

   name: nic-7676381-eth1-vmware-sfw.2

   agentName: vmware-sfw

   state: IOChain Attached

   vmState: Detached

[root@hv-i23:~]

 

フィルタ名をもとに、DFW ルールを確認します。

tenant01 むけに設定したルール (1008、1010、1013) だけが設定されていることが分かります。

[root@hv-i23:~] vsipioctl getrules -f nic-7676381-eth0-vmware-sfw.2

ruleset domain-c7 {

  # Filter rules

  rule 1008 at 1 inout protocol any from any to addrset ip-virtualwire-26 accept;

  rule 1010 at 2 inout protocol any from addrset ip-virtualwire-27 to addrset ip-virtualwire-27 accept;

  rule 1013 at 3 inout protocol any from any to any drop;

  rule 1007 at 4 inout protocol udp from addrset ip-securitygroup-10 to addrset ip-vm-465 port 67 accept;

  rule 1006 at 5 inout inet protocol udp from addrset ip-securitygroup-10 to any port 67 reject;

  rule 1005 at 6 in inet protocol udp from any to addrset ip-vm-465 port 67 reject;

  rule 1003 at 7 inout protocol ipv6-icmp icmptype 136 from any to any accept;

  rule 1003 at 8 inout protocol ipv6-icmp icmptype 135 from any to any accept;

  rule 1002 at 9 inout protocol udp from any to any port 68 accept;

  rule 1002 at 10 inout protocol udp from any to any port 67 accept;

  rule 1001 at 11 inout protocol any from any to any accept;

}


ruleset domain-c7_L2 {

  # Filter rules

  rule 1004 at 1 inout ethertype any from any to any accept;

}


[root@hv-i23:~]

 

DFW をマルチテナント環境っぽく使用することは可能ですが、

このような感じで、オブジェクト名やグルーピングなどで工夫が必要そうです。

 

以上、DFW ルールをマルチテナントっぽく設定してみる話でした。