VMware Cloud Director 10.4(VCD)で、PowerCLI を使用して NSX(NSX-T)Edge Gateway の NAT ルールを操作してみます。しかしながら PowerCLI では NAT ルールを操作するコマンドレットが用意されていないようなので、PowerShell の Invoke-WebRequest で REST API をコールして操作しました。
VCD の REST API のリファレンスは下記です。
- VMware Cloud Director OpenAPI - Edge Gateway NAT Rule
https://developer.vmware.com/apis/vmware-cloud-director/v37.2/edge-gateway-nat-rule/
今回の内容です。
今回の環境
NAT ルールは、前回(下記)までに展開した vApp 仮想マシンがある前提で作成していますが、実際のところは仮想マシンが存在しなくても作成できます。
PowerShell / PowerCLI 操作の開始前の時点では、Edge Gateway には 2つの NAT ルールを作成してあります。
作成する NAT ルール
今回は、DNAT ルールを作成します。今回も、パラメータを記載したファイルを、スクリプトとは別に用意しておきます。
- この後のスクリプトで、このファイルを共通利用します。
- NAT ルールの下記の3項目以外は固定値にしてあります。
config_dnat-192.168.31.110.ps1
$vdc_name = "org-vdc-01" $edge_gateway_name = "org-01-edge-01" $nat_rule_name = "dnat-192.168.31.110" $external_addresses = "192.168.31.110" $internal_addresses = "10.0.1.110"
Edge Gateway NAT ルールの取得
NAT ルールを取得するスクリプトは、下記のように作成してみました。
11_get_edge_gateway_nat_rules.ps1
- L16~: VDC サーバーに HTTPS 接続する際の証明書エラーは無視します。
- L27~: Edge Gateway と NAT ルールを取得するファンクションです。
- L37: Connect-CIServer による接続で取得した SessionSecret を利用します。
- L39: PowerCLI モジュールではなく、PowerShell に標準で含まれている Invoke-WebRequest で VCD の REST API(VMware Cloud Director OpenAPI)をコールしています。
スクリプトの実行前に、PowerCLI の Connect-CIServer で VDC サーバーに接続しておきます。
PS C:\> Connect-CIServer -Server lab-vcd-31.vcd.go-lab.jp -Org demo-org-01 -User org-01-admin -Password VMware1!
スクリプトにパラメータ ファイルを指定して実行すると、指定しておいた VDC と Edge Gateway の NAT ルールが表示されます。事前にテナント ポータルで確認したように、2件の NAT ルールが表示されています。
PS C:\> .\11_get_edge_gateway_nat_rules.ps1 .\config_dnat-192.168.31.110.ps1 id : d7496134-248a-428a-95de-3d3323ae9daa name : dnat-01 description : enabled : True ruleType : DNAT type : DNAT applicationPortProfile : externalAddresses : 192.168.31.102 internalAddresses : 10.0.1.100 dnatExternalPort : logging : False systemRule : False snatDestinationAddresses : firewallMatch : MATCH_INTERNAL_ADDRESS priority : 0 version : @{version=0} appliedTo : id : a7d04cb5-b5f1-4fdd-b5ef-2adba00680ec name : snat-01 description : enabled : True ruleType : SNAT type : SNAT applicationPortProfile : externalAddresses : 192.168.31.101 internalAddresses : 10.0.0.0/16 dnatExternalPort : logging : False systemRule : False snatDestinationAddresses : firewallMatch : MATCH_INTERNAL_ADDRESS priority : 0 version : @{version=0} appliedTo :
Edge Gateway NAT ルールの作成(DNAT)
DNAT 作成については、下記のようなスクリプトを用意してみました。
ちなみに、これ以降のスクリプトで前掲のスクリプトとファンクション「get_edge_gateway_nat_rules」などが重複しています。これは別ファイルに分割してもかまいません。
12_add_edge_gateway_nat_rule.ps1
- L33~: NAT ルールを定義する JSON は、処理を単純化するためあえて固定値にしています。
- L89: NAT ルールの追加処理でも、専用のコマンドレットではなく Invoke-WebRequest を利用しました。
- L96: NAT ルールの名前は一意ではないので、すでに同名ルールが存在する場合は、処理を中断しておきます。
スクリプトを実行すると、下記のように NAT ルールが作成されます。
PS C:\> .\12_add_edge_gateway_nat_rule.ps1 .\config_dnat-192.168.31.110.ps1 Create Edge NAT Rule JSON: dnat-192.168.31.110 { "name": "dnat-192.168.31.110", "description": null, "enabled": true, "ruleType": "DNAT", "type": "DNAT", "applicationPortProfile": null, "externalAddresses": "192.168.31.110", "internalAddresses": "10.0.1.110", "dnatExternalPort": null, "logging": false, "systemRule": false, "snatDestinationAddresses": null, "firewallMatch": "BYPASS", "priority": 0 } Add Edge Firewall Rule: dnat-192.168.31.110 StatusCode:202
VCD のテナント ポータルで Edge Gateway を確認すると、DNAT ルールが追加作成されています。
Edge Gateway NAT ルールの削除
DNAT 作成については、下記のようなスクリプトを用意してみました。ルール取得 / 削除と同様に、 Invoke-WebRequest を利用しました。
13_delete_edge_gateway_nat_rule.ps1
スクリプトを実行すると、下記のように NAT ルールが削除されます。
PS C:\> .\13_delete_edge_gateway_nat_rule.ps1 .\config_dnat-192.168.31.110.ps1 NAT Rule IDs: 3acd872f-c278-419d-a324-b9525605398a Delete NAT Rule ID:3acd872f-c278-419d-a324-b9525605398a
以上、PowerShell で NAT ルールを操作してみる話でした。