DevUtils
技術ガイド
ネットワーク・プロトコル5分で読める

IPv4枯渇とIPv6移行、NATおよびパブリック/プライベートIPの仕組み

32ビットIPv4と128ビットIPv6の違い、CIDRサブネットマスク、RFC 1918プライベートIP、NATアドレス変換、リバースプロキシでのIP偽装防御、WebRTCのIP漏洩対策を解説します。

実践ツールを使ってみる

IPアドレス確認

データをサーバーに送信せず、すべてブラウザ内で安全に検証・実行できます。

ツールを開く

IPアドレス体系の基本:32ビットIPv4と128ビットIPv6の構造

IP(Internet Protocol)アドレスは、インターネット上のパケットが宛先の端末まで正確にルーティングされるように割り当てられるネットワーク層の識別子です。1981年にRFC 791で定義されたIPv4は32ビットの2進数で構成され、ドットで区切られた4つの10進数(192.0.2.1)で表記されます。IPv4で収容できるアドレスの総数は約43億個(2^32)に限られており、2011年にIANAの中央在庫は公式に枯渇しました。

モバイル機器やクラウドサーバーの急増に対応するため標準化されたのがIPv6(RFC 8200)です。アドレス長は128ビットへと飛躍的に拡張され、コロンで区切られた8個の16進数ブロック(2001:0db8:85a3:0000:0000:8a2e:0370:7334)で表されます。約3.4 × 10^38個(2^128)という天文学的なアドレス空間を提供し、事実上枯渇の心配がありません。

サブネットマスクとCIDR(Classless Inter-Domain Routing)表記法

現代のネットワークでは、IPアドレスの浪費を防ぐためにCIDR表記法(RFC 4632)が用いられます。IPアドレスの後ろにスラッシュ(/)とプレフィックス長を付け、上位何ビットがネットワーク部で、下位何ビットが個別のホスト部であるかを表します:

  • /24 サブネット(256個のアドレス): 一般的な小規模社内LANや家庭用ルーターの範囲(192.168.1.0/24)。上位24ビットが固定され、下位8ビットがホストに割り当てられます(利用可能な端末は254台)。
  • /16 サブネット(65,536個のアドレス): クラウド(AWS VPCなど)の大規模クラスタ設計で多用される範囲(10.0.0.0/16)。
  • /32 表記: 単一の特定の端末ホストそのものを指します。

パブリックIP vs プライベートIP(RFC 1918)とNAT(アドレス変換)

IPv4の延命のため、RFC 1918規格はインターネット上で直接ルーティングされない3つのプライベートIPアドレス帯を定めました:

  • 10.0.0.0/8(10.0.0.0 〜 10.255.255.255)
  • 172.16.0.0/12(172.16.0.0 〜 172.31.255.255)
  • 192.168.0.0/16(192.168.0.0 〜 192.168.255.255)

社内LAN内では数千台のPCがプライベートIPを使用しますが、外部のインターネットへ通信する際は、ルーターやNATゲートウェイがパケットの送信元IPとポートを1つの共有パブリックIPへ透過的に変換(NAPT / PAT)します。

Webサーバーが実際のクライアントIPを特定する方法とIP偽装のリスク

Cloudflare等のCDNやロードバランサー(ALB)の背後にあるバックエンドWebサーバーは、物理ソケット上ではプロキシサーバーのIPしか見えません。

プロキシは元の端末のパブリックIPをX-Forwarded-For: client, proxy1やCF-Connecting-IPといったヘッダーに格納して転送します。しかし、バックエンドが「接続元が本当に自社の正規プロキシか」を検証せずにこのヘッダーを鵜呑みにすると、悪意あるユーザーが偽のIPヘッダーを挿入してアクセス制限をすり抜けるIPスプーフィング攻撃に遭います。

リクエストが自社プロキシ経由であっても、X-Forwarded-Forの先頭の値はクライアントが送った値そのままです。各プロキシは自分が見たIPを末尾に追記するだけなので、リストを右から読み、自社プロキシではない最初のIPを採用してください。

JAVASCRIPTDevUtils Code Reference
// プロキシ環境で信頼できるクライアントIPを安全に取得する実装例
export function getTrustedClientIp(req, trustedProxySubnets) {
    const directSocketIp = req.socket.remoteAddress;

    // 直接接続元が既知のリバースプロキシである場合のみヘッダーを参照
    if (!isIpInSubnet(directSocketIp, trustedProxySubnets)) {
        return directSocketIp;
    }

    // プロキシはX-Forwarded-Forの末尾にIPを追記するため、先頭側の値は
    // クライアントが自由に偽装できます。右から順に読み、自社プロキシ以外の最初のIPを返します。
    const hops = (req.headers['x-forwarded-for'] || '')
        .split(',')
        .map((ip) => ip.trim())
        .filter(Boolean);
    for (let i = hops.length - 1; i >= 0; i--) {
        if (!isIpInSubnet(hops[i], trustedProxySubnets)) {
            return hops[i];
        }
    }
    return directSocketIp;
}

WebRTCによるプライベートIP漏洩とブラウザのプライバシー保護

ブラウザ間のP2P通信規格であるWebRTCは、NAT越えを実現するためにSTUNサーバーを使用して接続候補(ICE Candidate)を収集します。かつてこの仕組みにより、VPNを使用している場合でもローカルのプライベートIPがWebサイトのJavaScriptへ漏洩するプライバシー上の欠陥がありました。最新ブラウザはmDNS(マルチキャストDNS)ホスト名による難読化を導入してこれを防止しています。自身のIPアドレスと接続情報はDevUtils My IPツールで安全に確認できます。

タグ:ネットワークIPv4IPv6NATセキュリティ
実践ツールを使ってみる

IPアドレス確認

現在のパブリックIPアドレス、プロバイダ情報、位置の確認ツール。

ツールを開く