Azure Load Balancerの受信NAT規則とは?特定VMへ安全にアクセスする設定手順を徹底解説
生徒
「Azureで複数の仮想マシン(VM)を作ったのですが、外から特定の1台だけにリモートデスクトップで接続したいときはどうすればいいですか?」
先生
「その場合は、Azure Load Balancer(アジュール ロード バランサー)の『受信NAT規則(じゅしんナットきそく)』を使うのが便利ですよ。パブリックIPアドレスを節約しつつ、特定のパソコンに道を作ってあげる仕組みです。」
生徒
「受信NAT規則を使うと、安全にアクセスできるんですか?」
先生
「はい!ポート番号を変換して通すので、セキュリティを高めながら管理アクセスが可能になります。具体的な手順を一緒に学んでいきましょう!」
1. Azure Load Balancerと受信NAT規則の基本
Azure Load Balancer(アジュール ロード バランサー)は、インターネットからの通信を複数の仮想マシン(かそうましん)に振り分ける装置のような役割をします。通常は、Webサイトへのアクセスを均等に分散するために使われますが、今回紹介する受信NAT規則(じゅしんナットきそく)は少し使い道が異なります。
NAT(ナット)とは「Network Address Translation」の略で、ネットワーク住所変換(ねっとわーくじゅうしょへんかん)という意味です。受信NAT規則を使うと、ロードバランサーが受け取った特定のポート番号への通信を、背後にある特定の仮想マシンへと転送できます。例えば、「50001番ポートに来たら1号機へ」「50002番ポートに来たら2号機へ」といった個別の交通整理ができるようになるのです。
これにより、仮想マシンごとにパブリックIPアドレスを割り当てる必要がなくなり、コスト削減とセキュリティ向上を同時に実現できます。クラウド管理において、この「入り口を一つにまとめる」考え方は非常に重要です。
2. 受信NAT規則を活用するメリット
なぜ、わざわざ受信NAT規則(じゅしんナットきそく)を使うのでしょうか。主なメリットは以下の3点です。
- パブリックIPアドレスの節約: 通常、仮想マシンに外から接続するには、マシンごとにIPアドレスが必要です。しかし、ロードバランサーのIPアドレス1つだけで、複数のマシンを管理できるようになります。
- セキュリティの強化: 仮想マシンを直接インターネットにさらさず、ロードバランサーを盾にできます。また、標準的なポート番号(RDPの3389など)を外に見せず、独自の番号に変更して待ち受ける「ポート変換」が可能です。
- 管理の簡略化: 接続先を一箇所に集約できるため、ネットワークセキュリティグループ(NSG)の設定変更などが管理しやすくなります。
管理者がサーバーのメンテナンスを行う際、安全な経路を確保するための「裏口」をしっかり守りながら作るようなイメージですね。
3. ネットワーク構成の準備とデータベース確認
設定を始める前に、現在の環境を整理しておきましょう。今回は、ロードバランサーの後ろに2台の仮想マシンがある構成を想定します。管理データベースで、どのポートをどのマシンに割り当てるか管理している状態を見てみましょう。
以下は、社内の資産管理システムで管理しているポート割り当て表の例です。
id | vm_name | internal_port | external_port | status
---+--------------+---------------+---------------+--------
1 | WebServer01 | 3389 | 50001 | active
2 | WebServer02 | 3389 | 50002 | active
3 | DBServer01 | 22 | 50022 | inactive
4 | AppServer01 | 3389 | 50003 | pending
この表に基づき、SQLを使って設定対象の情報を抽出するプログラムを考えてみます。例えば、有効な(active)設定のみを取り出すクエリは以下のようになります。
SELECT vm_name, external_port
FROM vm_management_table
WHERE status = 'active';
実行結果は以下の通りです。
vm_name | external_port
-------------+--------------
WebServer01 | 50001
WebServer02 | 50002
このように、外部からアクセスする際のポート番号(external_port)をあらかじめ決めておくことが、受信NAT規則設定の第一歩となります。
4. Azureポータルでの受信NAT規則設定手順
それでは、具体的にAzureポータル(あじゅーるぽーたる)での操作手順を解説します。初心者の方でも迷わないように、順を追って説明しますね。
- Azureポータルにサインインし、「ロードバランサー」を選択します。
- 設定対象のロードバランサーをクリックし、左側のメニューから「受信NAT規則」を選択します。
- 「+ 追加」ボタンを押して、新しい規則を作成します。
- 名前: わかりやすい名前(例:RDP-VM01)を入力します。
- フロントエンドIPアドレス: ロードバランサーのパブリックIPを選択します。
- ポート: 外部からアクセスする際の番号(例:50001)を入力します。
- ターゲット仮想マシン: 接続先となる仮想マシンを選択します。
- ターゲットポート: 仮想マシン内部で待ち受けている番号(RDPなら3389)を入力します。
この設定により、「ロードバランサーのIP:50001」への通信が、自動的に「仮想マシン01の3389」へと転送されるようになります。まさに魔法のような転送処理ですね。
5. 接続テストのためのスクリプト作成
設定が完了したら、正しくポートが開放されているか確認する必要があります。簡単なC#プログラムを使って、特定のポートが通信可能かどうかをチェックするツールを作ってみましょう。
using System;
using System.Net.Sockets;
class PortChecker
{
static void Main()
{
string ip = "13.xx.xx.xx"; // ロードバランサーのIP
int port = 50001; // 受信NATで設定した外部ポート
using (TcpClient client = new TcpClient())
{
try
{
client.Connect(ip, port);
Console.WriteLine("接続成功!ポートは開いています。");
}
catch (Exception)
{
Console.WriteLine("接続失敗。設定を確認してください。");
}
}
}
}
実行結果は以下のようになります。
接続成功!ポートは開いています。
もし失敗する場合は、Azureの「ネットワークセキュリティグループ(NSG)」で、そのポートの受信が許可されているかを確認してください。ロードバランサーの設定だけでなく、仮想マシン側の「門番」も通してあげる必要があるのです。
6. Linux VMへのSSHアクセス設定例
WindowsのRDPだけでなく、Linux(りなっくす)の仮想マシンに対してSSH(えすえすえいち)で接続したい場合も、受信NAT規則は非常に有効です。通常、SSHは22番ポートを使いますが、これをそのまま公開するのは少し危険です。
例えば、外部ポート「50022」を受信NAT規則に設定し、内部の「22」に転送するように設定します。設定後、手元のパソコン(ターミナル)から以下のコマンドで接続を確認できます。
ssh -p 50022 azureuser@13.xx.xx.xx
Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.0-1040-azure x86_64)
azureuser@vm01:~$
このように、標準の22番ポートではない番号を指定して接続することで、無差別な攻撃(ブルートフォース攻撃など)を受けるリスクを大幅に下げることができます。セキュリティの基本は「推測されにくい設定にすること」です。
7. 受信NAT規則の運用上の注意点
非常に便利な受信NAT規則(じゅしんナットきそく)ですが、運用する上で気をつけるべきポイントがいくつかあります。
まず、ポート番号の重複です。1つのパブリックIPアドレスに対して、同じ外部ポート番号を複数の規則で使うことはできません。どのマシンにどの番号を割り当てたか、先ほど紹介したデータベースや管理表でしっかり記録しておきましょう。
次に、アイドルタイムアウトの設定です。Azure Load Balancerは、一定時間通信がないと接続を切断してしまうことがあります。長い作業を行う場合は、接続を維持する「キープアライブ」の設定を検討してください。
また、大規模な環境では、1台ずつ規則を作るのは大変です。その場合は「受信NATプール」という機能を使うと、範囲(レンジ)でポートを自動割り当てすることも可能です。しかし、初心者のうちは、1台ずつ手動で設定する「受信NAT規則」の方が、仕組みを理解しやすいためおすすめです。
8. 自動化に向けた簡単なコード例
最後に、将来的にたくさんの仮想マシンを管理することを見越して、設定情報を整理するロジックをC#で書いてみましょう。リストを使って、複数のNAT規則を管理するイメージです。
using System;
using System.Collections.Generic;
class NatRule
{
public string Name { get; set; }
public int ExternalPort { get; set; }
public string TargetVm { get; set; }
}
class Program
{
static void Main()
{
var rules = new List<NatRule>
{
new NatRule { Name = "RDP-VM1", ExternalPort = 50001, TargetVm = "VM01" },
new NatRule { Name = "RDP-VM2", ExternalPort = 50002, TargetVm = "VM02" },
new NatRule { Name = "SSH-VM1", ExternalPort = 50022, TargetVm = "VM01" }
};
foreach (var rule in rules)
{
Console.WriteLine($"規則名: {rule.Name} | 外部ポート: {rule.ExternalPort} | 転送先: {rule.TargetVm}");
}
}
}
このプログラムを実行すると、管理している規則が一覧で表示されます。
規則名: RDP-VM1 | 外部ポート: 50001 | 転送先: VM01
規則名: RDP-VM2 | 外部ポート: 50002 | 転送先: VM02
規則名: SSH-VM1 | 外部ポート: 50022 | 転送先: VM01
このように、システム化して管理することで、設定ミスを防ぎ、より安全なネットワーク運用が可能になります。Azure Load Balancerの機能を使いこなし、クラウドエンジニアとしての第一歩を踏み出しましょう!
まとめ
アジュール(Azure)のネットワーク構築において、Azure Load Balancer(ロードバランサー)の受信NAT規則(じゅしんナットきそく)は、非常に強力で利便性の高い機能です。この記事では、複数の仮想マシン(かそうましん)に対して、たった一つのパブリックIPアドレスを共有しながら、特定のポート番号を介して安全に個別アクセスを実現する方法を詳しく解説してきました。クラウド環境では、セキュリティを確保しつつコストを抑える運用が求められますが、受信NAT規則はこの両方の課題を解決する優れた手段となります。
受信NAT規則の重要性と活用シーン
通常、インターネットからAzure上の仮想マシンに接続する場合、マシンごとにグローバルなIPアドレスを割り当てる必要があります。しかし、これではIPアドレスの管理が煩雑になり、さらに各マシンが直接インターネットにさらされるため、攻撃のリスクが高まってしまいます。そこで、受信NAT規則を活用することで、ロードバランサーが「玄関口」となり、外部からの通信を適切な「部屋(仮想マシン)」へ案内する役割を担います。
例えば、リモートデスクトップ接続(RDP)やSSH(えすえすえいち)によるメンテナンス作業を行う際、標準的なポート番号をそのまま使わず、高い番号(例:50001番など)へ変換して公開することで、不正アクセスの試行を大幅に減らすことができます。これは「セキュリティ・バイ・オブスキュリティ(隠蔽によるセキュリティ)」の一環としても非常に有効な手法です。
設定データの管理とSQLによる確認
運用規模が大きくなると、どの仮想マシンにどのポートを割り当てたかを正確に把握しておく必要があります。管理台帳としてデータベースを利用している場合、現在の設定状況を常に最新に保つことが重要です。以下に、ポート割り当て情報を管理するテーブルの例と、最新の状態を反映させるための操作イメージを示します。
【更新前の管理テーブル状態】
id | vm_name | internal_port | external_port | status | description
---+----------------+---------------+---------------+------------+------------------
1 | WebServer01 | 3389 | 50001 | active | RDP for Maintenance
2 | WebServer02 | 3389 | 50002 | active | RDP for Maintenance
3 | DBServer01 | 22 | 50022 | inactive | SSH for Admin
4 | AppServer01 | 3389 | 50003 | pending | New Setup
5 | BackupNode01 | 22 | 50122 | active | Log Transfer
ここで、新しく追加したバックアップノードの状態を確認したり、特定のポート範囲を使用しているサーバーを抽出したりする際には、SQL(エスキューエル)を活用します。例えば、SSH接続(ポート22)を利用しているアクティブなサーバー一覧を取得するクエリは次のようになります。
SELECT vm_name, external_port, description
FROM load_balancer_nat_rules
WHERE internal_port = 22 AND status = 'active';
【SQL実行結果】
vm_name | external_port | description
-------------+---------------+------------------
BackupNode01 | 50122 | Log Transfer
C#によるポートフォワーディング情報のプログラム管理
インフラの構成情報をプログラムで扱うことで、設定の自動化や整合性チェックが容易になります。C#(シーシャープ)を用いて、ロードバランサーの受信NAT規則をオブジェクトとして定義し、それらをリスト形式で一括処理するロジックをより具体的に記述してみましょう。
using System;
using System.Collections.Generic;
using System.Linq;
namespace AzureConfigManager
{
// NAT規則を定義するクラス
public class AzureNatRule
{
public int Id { get; set; }
public string RuleName { get; set; }
public string TargetVmName { get; set; }
public int FrontEndPort { get; set; }
public int BackEndPort { get; set; }
public bool IsEnabled { get; set; }
}
class Program
{
static void Main(string[] args)
{
// 設定済み規則のリスト作成
List<AzureNatRule> currentRules = new List<AzureNatRule>
{
new AzureNatRule { Id = 1, RuleName = "Inbound_RDP_01", TargetVmName = "VM-WEB-01", FrontEndPort = 50001, BackEndPort = 3389, IsEnabled = true },
new AzureNatRule { Id = 2, RuleName = "Inbound_RDP_02", TargetVmName = "VM-WEB-02", FrontEndPort = 50002, BackEndPort = 3389, IsEnabled = true },
new AzureNatRule { Id = 3, RuleName = "Inbound_SSH_01", TargetVmName = "VM-LNX-01", FrontEndPort = 50022, BackEndPort = 22, IsEnabled = false }
};
// 有効な規則だけをフィルタリングして表示
var activeRules = currentRules.Where(r => r.IsEnabled).ToList();
Console.WriteLine("--- 現在有効な受信NAT規則一覧 ---");
foreach (var rule in activeRules)
{
Console.WriteLine($"[ID:{rule.Id}] 名称:{rule.RuleName} / 転送先:{rule.TargetVmName} / ポート:{rule.FrontEndPort}->{rule.BackEndPort}");
}
}
}
}
【実行結果】
--- 現在有効な受信NAT規則一覧 ---
[ID:1] 名称:Inbound_RDP_01 / 転送先:VM-WEB-01 / ポート:50001->3389
[ID:2] 名称:Inbound_RDP_02 / 転送先:VM-WEB-02 / ポート:50002->3389
トラブルシューティングと運用のコツ
受信NAT規則を設定しても接続できない場合、以下のポイントを順番に確認してください。
- ネットワークセキュリティグループ(NSG)の確認: ロードバランサー側の設定だけでなく、仮想マシンのNIC(ニック)またはサブネットに適用されているNSGで、ターゲットポート(3389や22など)の受信が許可されているか。
- OS内部のファイアウォール: Windows FirewallやLinuxのiptables/ufwなどが通信をブロックしていないか。
- サービスの起動状態: 接続先の仮想マシン内で、リモートデスクトップサービスやSSHデーモンが正しく動作しているか。
これらの確認を怠ると、せっかくのNAT設定も機能しません。また、Azureのコマンドラインインターフェース(Azure CLI)を使って、疎通確認をコマンドで行う習慣をつけると、より迅速な対応が可能になります。
# 特定のIPとポートに対して接続テストを行うコマンド例
nc -zv 13.xx.xx.xx 50001
Connection to 13.xx.xx.xx 50001 port [tcp/*] succeeded!
最後に、クラウド技術は日々進化していますが、この「アドレス変換とポート転送」という基礎概念は、形を変えても生き残り続ける重要な知識です。Azure Load Balancerを使いこなすことは、より複雑なトラフィック制御や高度なセキュリティ設計へと進むための大きな一歩となります。
生徒
「先生、受信NAT規則のおかげで、1つのIPアドレスから複数のサーバーに別々のポートで入れるようになりました!これならIPアドレスの料金も節約できますね。」
先生
「その通りです!賢い使い方ですね。でも、ポート番号を外部に公開していることには変わりないので、パスワードを強くしたり、特定の接続元IPアドレスからしか入れないように制限したりすることも忘れないでくださいね。」
生徒
「なるほど。ネットワークセキュリティグループ(NSG)と組み合わせて、二重に守るのが大切なんだ。もし設定が上手くいかないときは、さっきのC#のツールやコマンドで、どこで止まっているか探してみます!」
先生
「素晴らしい意気込みですね。一つひとつの仕組みを丁寧に確認していけば、どんな複雑なネットワークトラブルも解決できるようになりますよ。これからもアジュールのマスターを目指して頑張りましょう!」
生徒
「はい!ありがとうございました!」