ネットワーク構成図とは
ネットワーク構成図は、システムを構成するサーバー・機器間の通信経路と、セキュリティ境界(ファイアウォール・DMZ・VPC)を可視化した設計書です。セキュリティ設計・インフラ調達・ファイアウォール設定・疎通確認テスト計画の基準文書として使用されます。
ネットワーク構成図は「論理構成図」と「物理構成図」の2層で整理するのが一般的です。論理構成図ではセグメント分割・通信フロー・セキュリティゾーンを示し、物理構成図では実際のスイッチ・ルーター・ケーブル配線を示します。クラウド環境では論理構成図(VPC・サブネット・セキュリティグループ)が主体となります。
💡 ネットワーク構成図の用途
① セキュリティ審査・ペネトレーションテストの前提資料 ② ファイアウォール申請書の根拠資料 ③ 疎通確認テスト計画書の通信経路一覧 ④ 障害発生時の影響範囲特定 ⑤ 監査対応時の提出資料
① ネットワークセグメント設計
ネットワークをセキュリティポリシーに基づいてセグメント(ゾーン)に分割します。一般的には以下のセグメント構成が採用されます。
| セグメント名 | 役割 | 配置するサーバー例 | 外部アクセス |
|---|---|---|---|
| DMZ(非武装地帯) | インターネットと内部ネットワークの中間地帯。外部公開サービスを配置。 | Webサーバー・リバースプロキシ・FTP/SFTPサーバー | インターネットから直接アクセス可能 |
| AP層セグメント | アプリケーションビジネスロジックを処理する内部セグメント。DMZからのみアクセス可。 | APサーバー・バッチサーバー | DMZのみからアクセス可 |
| DB層セグメント | データを永続化する最も保護されたセグメント。AP層からのみアクセス可。 | DBサーバー・ファイルサーバー | AP層のみからアクセス可 |
| 管理セグメント | 運用管理用のセグメント。ジャンプサーバー・監視サーバーを配置。 | ジャンプサーバー(踏み台)・監視サーバー・ログサーバー | 特定の管理端末のみからアクセス可 |
② VLAN・サブネット設計
各セグメントに対してVLAN IDとIPアドレス範囲(サブネット)を割り当てます。将来の拡張を見込んで、アドレス空間に余裕を持たせた設計にします。
| セグメント | VLAN ID | サブネット(例) | 割当可能ホスト数 | ゲートウェイ |
|---|---|---|---|---|
| DMZ | 100 | 192.168.10.0/24 | 254 | 192.168.10.1 |
| AP層 | 200 | 192.168.20.0/24 | 254 | 192.168.20.1 |
| DB層 | 300 | 192.168.30.0/24 | 254 | 192.168.30.1 |
| 管理 | 400 | 192.168.40.0/25 | 126 | 192.168.40.1 |
⚠️ RFC 1918 プライベートアドレスの選択
VPN接続や他システムとの連携がある場合、アドレス範囲が重複しないよう注意してください。特に 192.168.0.0/24 や 10.0.0.0/8 は既存社内ネットワークと重複しやすいため、使用前に必ず確認します。クラウド(AWS VPC)との接続がある場合はCIDRブロックの重複排除が特に重要です。
③ ファイアウォール・セキュリティグループ設計
セグメント間の通信を制御するファイアウォールルールを定義します。「デフォルト拒否・必要な通信のみ許可(Deny All, Permit by Exception)」の原則に従います。
ファイアウォールルールの定義には以下の要素が必要です。
- 送信元(Source):通信を発信するIPアドレスまたはセグメント
- 宛先(Destination):通信先のIPアドレスまたはセグメント
- プロトコル:TCP / UDP / ICMP など
- ポート番号(宛先):許可する宛先ポート番号
- アクション:ALLOW / DENY
- 方向:Inbound / Outbound
- 用途・理由:なぜこのルールが必要か(ルールの根拠)
④ ポート開放マトリクスの定義
ネットワーク構成図に加えて、「どのサーバーからどのサーバーへ、どのポートで通信するか」をマトリクス形式で整理します。このマトリクスはファイアウォール申請書の根拠となり、疎通確認テストの計画書にもそのまま流用できます。
| No. | 送信元 | 宛先 | プロトコル | ポート | 用途 |
|---|---|---|---|---|---|
| 1 | インターネット | Webサーバー (DMZ) | TCP | 443 (HTTPS) | 利用者からのWeb アクセス |
| 2 | インターネット | Webサーバー (DMZ) | TCP | 80 (HTTP→リダイレクト) | HTTP→HTTPS リダイレクト |
| 3 | Webサーバー (DMZ) | APサーバー | TCP | 8080 (AJP/HTTP) | WebサーバーからAPへのリクエスト転送 |
| 4 | APサーバー | DBサーバー | TCP | 5432 (PostgreSQL) | アプリからDBへの接続 |
| 5 | APサーバー | Redisサーバー | TCP | 6379 (Redis) | セッション・キャッシュアクセス |
| 6 | 管理端末 | 全サーバー | TCP | 22 (SSH) | 管理者によるサーバー操作 |
| 7 | 監視サーバー | 全サーバー | UDP | 161 (SNMP) | リソース監視 |
| 8 | APサーバー | 外部メールサーバー | TCP | 587 (SMTP/TLS) | システムからのメール送信 |
⑤ ホスト名・IPアドレス命名規則
ホスト名とIPアドレスの命名規則を統一することで、運用・障害対応時の可読性が向上します。命名規則は以下の要素を含めることが推奨されます。
- システム識別子:システム略称(例:oms = 受注管理システム)
- サーバー役割:web / ap / db / batch / mgmt など
- 番号:01, 02 など(冗長構成の識別用)
- 環境識別子:prd(本番)/ stg(検証)/ dev(開発)
例:oms-web-01-prd(受注管理・Webサーバー・1号機・本番)
Python Tips — 疎通確認を自動化する
ポート開放マトリクスをもとに、疎通確認(ポートスキャン・Ping)を自動実行するスクリプトを紹介します。環境構築後の確認作業や、リリース前チェックに活用できます。
"""
ポート開放マトリクスに基づいて TCP 疎通確認を行うスクリプト。
pip install pandas openpyxl
"""
import socket
import subprocess
import platform
import pandas as pd
from dataclasses import dataclass
from datetime import datetime
@dataclass
class PortCheck:
"""疎通確認定義"""
src_desc: str # 送信元の説明
dst_host: str # 宛先ホスト名 or IPアドレス
dst_port: int # 宛先ポート番号
protocol: str # TCP / ICMP
description: str # 用途説明
def check_tcp_port(host: str, port: int, timeout: float = 5.0) -> tuple[bool, str]:
"""
TCP ポート疎通確認。
Returns: (成功フラグ, メッセージ)
"""
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(timeout)
result = sock.connect_ex((host, port))
sock.close()
if result == 0:
return True, "OPEN"
else:
return False, f"CLOSED (errno={result})"
except socket.gaierror as e:
return False, f"DNS ERROR: {e}"
except Exception as e:
return False, f"ERROR: {e}"
def check_icmp_ping(host: str) -> tuple[bool, str]:
"""
ICMP Ping 疎通確認。
"""
param = "-n" if platform.system() == "Windows" else "-c"
try:
result = subprocess.run(
["ping", param, "1", "-W", "2", host],
capture_output=True, text=True, timeout=10
)
if result.returncode == 0:
return True, "REACHABLE"
else:
return False, "UNREACHABLE"
except Exception as e:
return False, f"ERROR: {e}"
def run_port_checks(checks: list[PortCheck]) -> pd.DataFrame:
"""
疎通確認リストを実行して結果DataFrameを返す。
"""
records = []
for chk in checks:
if chk.protocol.upper() == "ICMP":
ok, msg = check_icmp_ping(chk.dst_host)
else:
ok, msg = check_tcp_port(chk.dst_host, chk.dst_port)
records.append({
"送信元": chk.src_desc,
"宛先ホスト": chk.dst_host,
"ポート": chk.dst_port if chk.protocol != "ICMP" else "-",
"プロトコル": chk.protocol,
"結果": "✅ OK" if ok else "❌ NG",
"詳細": msg,
"用途": chk.description,
"確認日時": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
})
return pd.DataFrame(records)
# ── 疎通確認定義リスト(ポートマトリクスを反映) ────────────────
checks = [
PortCheck("本サーバー", "192.168.10.11", 443, "TCP", "Webサーバー HTTPS"),
PortCheck("本サーバー", "192.168.20.21", 8080, "TCP", "APサーバー HTTP"),
PortCheck("本サーバー", "192.168.30.31", 5432, "TCP", "DBサーバー PostgreSQL"),
PortCheck("本サーバー", "192.168.30.32", 6379, "TCP", "Redis"),
PortCheck("本サーバー", "192.168.10.11", 0, "ICMP", "Webサーバー Ping"),
]
if __name__ == "__main__":
df = run_port_checks(checks)
print(df.to_string(index=False))
# Excelに出力
df.to_excel("port_check_result.xlsx", index=False)
print("\nport_check_result.xlsx に出力しました")
# NG件数を表示
ng_count = (df["結果"] == "❌ NG").sum()
print(f"\n疎通確認結果: {len(df)}件中 {ng_count}件NG")
✅ 活用シーン
ポート開放マトリクスをCSV/Excelで管理しておき、上記スクリプトに読み込ませることで、環境構築後の疎通確認テストを自動化できます。結果をExcelに出力することで、インフラ担当者へのレポートにもそのまま使えます。CI/CDパイプラインに組み込めば、デプロイ後の自動疎通確認も実現できます。
定義チェックリスト
| チェック項目 | 確認ポイント |
|---|---|
| □ セグメント分割が完了しているか | DMZ・AP・DB・管理セグメントの役割と境界が定義されているか |
| □ VLAN IDとサブネットが割り当てられているか | 全セグメントにVLAN IDとIPアドレス範囲が定義されているか |
| □ ポート開放マトリクスが完備されているか | 必要な全通信経路(送信元・宛先・ポート・プロトコル)が網羅されているか |
| □ 不要な通信が遮断されているか | Deny Allが基本方針となっているか。不必要なポートが開放されていないか |
| □ 外部公開ポートが最小化されているか | インターネット側に開放するポートは80/443のみに絞られているか |
| □ 命名規則が統一されているか | ホスト名・IPアドレスの命名規則が文書化されているか |
| □ セキュリティ審査を受けているか | ネットワーク設計がセキュリティ担当者にレビューされているか |