ネットワーク構成図とは

ネットワーク構成図は、システムを構成するサーバー・機器間の通信経路と、セキュリティ境界(ファイアウォール・DMZ・VPC)を可視化した設計書です。セキュリティ設計・インフラ調達・ファイアウォール設定・疎通確認テスト計画の基準文書として使用されます。

ネットワーク構成図は「論理構成図」と「物理構成図」の2層で整理するのが一般的です。論理構成図ではセグメント分割・通信フロー・セキュリティゾーンを示し、物理構成図では実際のスイッチ・ルーター・ケーブル配線を示します。クラウド環境では論理構成図(VPC・サブネット・セキュリティグループ)が主体となります。

💡 ネットワーク構成図の用途

① セキュリティ審査・ペネトレーションテストの前提資料 ② ファイアウォール申請書の根拠資料 ③ 疎通確認テスト計画書の通信経路一覧 ④ 障害発生時の影響範囲特定 ⑤ 監査対応時の提出資料

① ネットワークセグメント設計

ネットワークをセキュリティポリシーに基づいてセグメント(ゾーン)に分割します。一般的には以下のセグメント構成が採用されます。

セグメント名役割配置するサーバー例外部アクセス
DMZ(非武装地帯) インターネットと内部ネットワークの中間地帯。外部公開サービスを配置。 Webサーバー・リバースプロキシ・FTP/SFTPサーバー インターネットから直接アクセス可能
AP層セグメント アプリケーションビジネスロジックを処理する内部セグメント。DMZからのみアクセス可。 APサーバー・バッチサーバー DMZのみからアクセス可
DB層セグメント データを永続化する最も保護されたセグメント。AP層からのみアクセス可。 DBサーバー・ファイルサーバー AP層のみからアクセス可
管理セグメント 運用管理用のセグメント。ジャンプサーバー・監視サーバーを配置。 ジャンプサーバー(踏み台)・監視サーバー・ログサーバー 特定の管理端末のみからアクセス可

② VLAN・サブネット設計

各セグメントに対してVLAN IDとIPアドレス範囲(サブネット)を割り当てます。将来の拡張を見込んで、アドレス空間に余裕を持たせた設計にします。

セグメントVLAN IDサブネット(例)割当可能ホスト数ゲートウェイ
DMZ100192.168.10.0/24254192.168.10.1
AP層200192.168.20.0/24254192.168.20.1
DB層300192.168.30.0/24254192.168.30.1
管理400192.168.40.0/25126192.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)TCP443 (HTTPS)利用者からのWeb アクセス
2インターネットWebサーバー (DMZ)TCP80 (HTTP→リダイレクト)HTTP→HTTPS リダイレクト
3Webサーバー (DMZ)APサーバーTCP8080 (AJP/HTTP)WebサーバーからAPへのリクエスト転送
4APサーバーDBサーバーTCP5432 (PostgreSQL)アプリからDBへの接続
5APサーバーRedisサーバーTCP6379 (Redis)セッション・キャッシュアクセス
6管理端末全サーバーTCP22 (SSH)管理者によるサーバー操作
7監視サーバー全サーバーUDP161 (SNMP)リソース監視
8APサーバー外部メールサーバーTCP587 (SMTP/TLS)システムからのメール送信

⑤ ホスト名・IPアドレス命名規則

ホスト名とIPアドレスの命名規則を統一することで、運用・障害対応時の可読性が向上します。命名規則は以下の要素を含めることが推奨されます。

  • システム識別子:システム略称(例:oms = 受注管理システム)
  • サーバー役割:web / ap / db / batch / mgmt など
  • 番号:01, 02 など(冗長構成の識別用)
  • 環境識別子:prd(本番)/ stg(検証)/ dev(開発)

例:oms-web-01-prd(受注管理・Webサーバー・1号機・本番)

Python Tips — 疎通確認を自動化する

ポート開放マトリクスをもとに、疎通確認(ポートスキャン・Ping)を自動実行するスクリプトを紹介します。環境構築後の確認作業や、リリース前チェックに活用できます。

Python — TCP疎通確認バッチ
"""
ポート開放マトリクスに基づいて 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アドレスの命名規則が文書化されているか
□ セキュリティ審査を受けているかネットワーク設計がセキュリティ担当者にレビューされているか