【Azure】NSG(ネットワークセキュリティグループ)を使ってみる
構成図
NSGを使って特定のサブネットからのアクセスのみを許可するように設定してみます。

仮想ネットワーク(VNet)とサブネットを作成する
構成図の通り、Azure Portalから下記2つの仮想ネットワークを作成します。
| VNetA | |
|---|---|
| 仮想ネットワーク名 | VNetA |
| 地域 | Japan East |
| IPアドレス | 10.1.0.0/16 |
| 1つ目のサブネットのIPアドレス(subnetA-1) | 10.1.0.0/24 |
| 2つ目のサブネットのIPアドレス(subnetA-2) | 10.1.1.0/24 |
| VNetB | |
|---|---|
| 仮想ネットワーク名 | VNetA |
| 地域 | Japan East |
| IPアドレス | 10.2.0.0/16 |
| サブネットのIPアドレス(subnetB-1) | 10.2.0.0/24 |
ACIを作成する
作成した各サブネット内に配置するACIを作成します。
| コンテナインスタンスA1 | ||
|---|---|---|
| コンテナ名 | testcontainera001 | |
| 地域 | Japan East | |
| イメージのソース | クイックスタート イメージ | |
| イメージ | mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine(Linux) | |
| サイズ | 1vcpu,1.5Gibメモリ,0gpu | |
| ネットワークの種類 | プライベート | |
| 仮想ネットワーク | VNetA | 先ほど作成した仮想ネットワークA |
| サブネット | SubnetA-1(10.1.0.0/24) | |
| ポート | 80 / TCP |
| コンテナインスタンスA2 | ||
|---|---|---|
| コンテナ名 | testcontainera002 | |
| 地域 | Japan East | |
| イメージのソース | クイックスタート イメージ | |
| イメージ | mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine(Linux) | |
| サイズ | 1vcpu,1.5Gibメモリ,0gpu | |
| ネットワークの種類 | プライベート | |
| 仮想ネットワーク | VNetA | 先ほど作成した仮想ネットワークA |
| サブネット | SubnetA-2(10.1.1.0/24) | |
| ポート | 80 / TCP |
| コンテナインスタンスB1 | ||
|---|---|---|
| コンテナ名 | testcontainerb001 | |
| 地域 | Japan East | |
| イメージのソース | クイックスタート イメージ | |
| イメージ | mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine(Linux) | |
| サイズ | 1vcpu,1.5Gibメモリ,0gpu | |
| ネットワークの種類 | プライベート | |
| 仮想ネットワーク | VNetB | 先ほど作成した仮想ネットワークB |
| サブネット | SubnetB-1(10.2.0.0/24) | |
| ポート | 80 / TCP |
VNetAとVNetBをピアリングする
【Azure】VNetピアリングを試してみるをご参照ください。
NSG(ネットワークセキュリティグループ)を設定する
さて、VNetAとVNetBがピアリング済みですので、現段階ではVNetAのACI1およびACI2からVNetBのACI1への通信は可能です。
ここで、サブネットBに特定のIPアドレスからのアクセスのみを許可するNSGを設定します。

これによって、VNetBのACI1にはVNetAのACI1からのみ通信が可能となります。
NSGを作成する
VNetAのSubnetA-1のIPアドレスのみ通信を許可するNSGを作成します。
| 基本 | ||
|---|---|---|
| 名前 | subnetb001-nsg | |
| 場所 | Japan East |

デフォルトの受信(インバウンド)ルールとして、
- 同一VNetからのアクセスを許可(AllowVnetInBound)
- Azureロードバランサからのアクセスを許可(AllowAzureLoadBalancerInBound)
- 上記以外のアクセスを拒否
というルールが設定されています。
受信セキュリティ規則を追加する
VNetAのACI1が属するサブネットのIPアドレス範囲からの受信を許可するルールを追加します。
| 受信セキュリティ規則の追加 | ||
|---|---|---|
| ソース | IP Addresses | |
| ソース IP アドレス/CIDR 範囲 | 10.1.0.0/24 | 受信を許可したいIPアドレスの範囲 |
| ソースポート範囲 | * | |
| 宛先 | Any | 他にサービスタグ、アプリケーションセキュリティグループ等を選択可能。受信側でこのルールが適用される範囲を指定できる。今回は丸っとサブネット全体にルールを適用するのでAny |
| サービス | HTTP | |
| 宛先ポート範囲 | 80 | 自動で選択される |
| プロトコル | TCP | 自動で選択される |
| アクション | 許可 | |
| 優先度 | 100 | |
| 名前 | AllowCidrBlockHTTPInbound |

また、デフォルトで設定されているAllowVnetInBoundにより同一およびピアリングされたVNetからのアクセスは許可されています。
このため、上記で設定したIPアドレス範囲以外からのHTTPアクセスを拒否するルールも追加する必要があります。
| 受信セキュリティ規則の追加 | ||
|---|---|---|
| ソース | Any | |
| ソースポート範囲 | * | |
| 宛先 | Any | |
| サービス | HTTP | |
| 宛先ポート範囲 | 80 | 自動で選択される |
| プロトコル | TCP | 自動で選択される |
| アクション | 拒否 | |
| 優先度 | 110 | |
| 名前 | DenyAnyHTTPInbound |
この規則を追加すると下記の警告が出ますが、今回テストするにあたっては考慮不要と思われるため無視します。

サブネットにNSGを紐付ける
VNetB > SubnetB-1 を開きます。
ネットワークセキュリティグループで先ほど作成したsubnetb001-nsgを選択し、保存します。

動作をテストする
VNetAのACI1コンテナ → VNetBのACI1コンテナ
まず、NSGでアクセス許可した10.1.0.0/24のアドレス範囲に属するVNetAのACI1からVNetBへの通信を行います。

VNetAのACI1のIPアドレスは10.1.0.4です。
NSGでアクセス許可した10.1.0.0/24の範囲内のため、通信が成功することが期待されます。
az login
# VNetAのコンテナA1に入る
az container exec --resource-group AZ104-test-rg --name testcontainera001 --exec-command "/bin/sh"
# ピアリングしたVNetBのコンテナB("10.2.0.4")に対して、httpリクエストを実施
wget -qO- http://10.2.0.4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
# ...以下略
期待通り、nginxのデフォルトのWelcomeページが返却されました。
VNetAのACI2コンテナ → VNetBのACI1コンテナ
続いて、NSGでアクセス許可されていないアドレス範囲のVNetAのACI2から通信を行います。

VNetAのACI2のIPアドレスは、10.1.1.4です。
10.1.0.0/24の範囲外のため、通信は失敗するはずです。
az login
# VNetAのコンテナA2に入る
az container exec --resource-group AZ104-test-rg --name testcontainera002 --exec-command "/bin/sh"
# ピアリングしたVNetBのコンテナB("10.2.0.4")に対して、httpリクエストを実施
wget -qO- http://10.2.0.4
wget: can't connect to remote host (10.2.0.4): Operation timed out
期待通り、通信が通らずタイムアウトになりました。
Discussion