🔌 IPv6リンクローカルだけのホストをインターネットへ出すには

IPv6Link-LocalNAT64/DNS64Proxy

結論: IPv6リンクローカル(fe80::/10)だけを持つホストのパケットはルータを越えてはいけないため、IPレイヤのルーティングではインターネットに到達できません。実現するには、次のいずれかの方法を用います。

  1. ULA + DNS64/NAT64(推奨) — ホストは fd00::/8 などの ULA のみを持ち、ゲートウェイが v6→v4 変換して外の IPv4 インターネットへ接続。
  2. アプリ層プロキシ — 同一リンク上に HTTP/HTTPS プロキシや SOCKS5 を立て、クライアントは IPv6リンクローカルでプロキシへ接続。プロキシ経由で外に出る。

🗺️ 想定トポロジ

 [HOSTA/B] ---[L2]--- [INSIDE GW] --- (outside: IPv4-only) --- Internet
    |  IPv6: fe80::/64  (リンクローカルのみ)      ^
    |                                              |
    +-- 同一リンク上で到達できるのはINSIDE GWまで --+
リンクローカルは同一リンク内限定。デフォルトゲートウェイの next-hop をリンクローカルに指定すること自体は可ですが、送信元がリンクローカルのままではルータ転送不可です。

✅ 方法1:ULA + DNS64/NAT64(推奨)

クライアントは ULA のみ。ゲートウェイは inside で IPv6/IPv4 デュアル、outside は IPv4 のみで構いません。

構成イメージ

     ┌──────────────────────────────────────────────────────────┐
     │  Inside (dual)                               Outside (IPv4-only) │
     │                                                                │
     │  [HOSTA/B]  ULA: fd00:1::/64                                   │
     │      |                                                         │
     │  ┌───┴──── L2 ───┐                                            │
     │  │ [Gateway]  v6: fd00:1::1 / v4: 192.0.2.2                    │
     │  │   - DNS64 (e.g., Unbound)                                   │
     │  │   - NAT64 (e.g., Jool/Tayga) → 64:ff9b::/96                 │
     │  └───────────────┬─────────────────────────────────────────────┘
     │                  NAT44/MASQUERADE → Internet (IPv4-only)
     └──────────────────┘

RA/DHCPv6(dnsmasq例)

# /etc/dnsmasq.d/ipv6.conf
interface=eth0
enable-ra
# ULAを配布(SLAAC)
dhcp-range=::,constructor:eth0,ra-only,64,12h
# DNSはゲートウェイのULAに
dhcp-option=option6:dns-server,[fd00:1::1]

DNS64(Unbound例)

# /etc/unbound/unbound.conf.d/dns64.conf
server:
  interface: fd00:1::1
  do-ip6: yes
  module-config: "dns64 validator iterator"

dns64:
  prefix: 64:ff9b::/96

NAT64(Jool例)

# 例:プールは Well-Known Prefix を使用
jool instance add --netfilter --pool6 64:ff9b::/96
jool -t nat64 --enable

# outside側は従来のIPv4 NAT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
メリット: クライアントは v6-only でOK(v4不要)/outsideはIPv4-onlyでOK/大半のアプリが透過的に動作
デメリット: ゲートウェイでDNS64/NAT64の用意が必要

🧰 方法2:アプリ層プロキシ(リンクローカル接続)

IPレイヤの転送は諦め、同一リンク上のプロキシへリンクローカルで接続します。

Squid(ゲートウェイ側)

# squid.conf(リンクローカルにバインド)
http_port [fe80::1%eth0]:3128
acl localv6 localnet
http_access allow localv6

クライアント設定例(ブラウザ)

# URL欄/OS設定でプロキシ指定
http://[fe80::1%eth0]:3128
# Windows 例: %Ethernet / macOS: %en0 / Linux: %eth0 など

SOCKS5 例(danted)

# /etc/danted.conf(要件に合わせて調整)
logoutput: /var/log/danted.log
internal: [fe80::1%eth0] port = 1080
external: eth1  # IPv4 アップリンク側
method: username none
clientmethod: none
user.notprivileged: nobody
メリット: クライアントはLLAのみのまま/構築が比較的容易
デメリット: プロキシ対応アプリに限定/名前解決の所在(クライアント or プロキシ)を要設計

🔎 よくある質問

質問回答
デフォルトゲートウェイにリンクローカルを指定しても良い? はい、next-hop としての指定は可能です。ただし送信元アドレスがLLAのままではルータは転送しません。ULAやGUAを持たせる必要があります。
outsideがIPv4-onlyでも大丈夫? 方法1(DNS64/NAT64)なら問題ありません。ゲートウェイが v6→v4 変換します。
名前解決は? 方法1ではDNS64がAAAAを合成、方法2ではクライアントまたはプロキシ側で行います。

📘 まとめ

リンクローカルのみではルーティング不可。
すべてのアプリをシンプルに動かすなら ULA + DNS64/NAT64
最小構成でブラウジング等なら アプリ層プロキシ が実用的です。
このページは、既存の社内ドキュメントの体裁に合わせた高コントラスト&プレーン背景で作成しています。