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を採用してください。
// プロキシ環境で信頼できるクライアント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ツールで安全に確認できます。
IPアドレス確認
現在のパブリックIPアドレス、プロバイダ情報、位置の確認ツール。