Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

クライアントアーキテクチャ

最終更新 Markdown で表示Agent セットアップ

このガイドでは、Cloudflare One Client(旧称 WARP)がデバイスのオペレーティングシステムと連携し、Traffic and DNS mode でトラフィックをルーティングする仕組みを説明します。

DNS only mode では、IP トラフィックの説明は当てはまりません。Traffic only mode では、DNS トラフィックの説明は当てはまりません。

クライアントのトラフィックフロー

Cloudflare One Client を使うと、組織はエンドユーザーデバイスがアクセスできるアプリケーションを細かく制御できます。クライアントは、デバイスからの DNS とネットワークトラフィックを Cloudflare のグローバルネットワークへ転送し、クラウド上で Zero Trust ポリシーを適用します。すべての OS で、WARP デーモンはデバイスと Cloudflare のあいだに次の 3 つの接続を維持します。

接続 プロトコル 用途
WARP トンネル(WireGuard または MASQUE UDP ネットワークポリシーの適用、HTTP ポリシーの適用、プライベートネットワークアクセスのために、IP パケットを Gateway へ送ります。
DoH HTTPS DNS ポリシーの適用のために、DNS リクエストを Gateway へ送ります。DoH 接続は WARP トンネル内で維持されます。
デバイスオーケストレーション HTTPS ユーザー登録、デバイスポスチャの確認、デバイスクライアントプロファイル設定の適用を行います。
flowchart LR
subgraph Device["デバイス"]
W[Cloudflare One Client] -.-> D
D[DNS プロキシ]
W -.-> V[仮想インターフェイス]
end
subgraph Cloudflare
A[Zero Trust アカウント]
subgraph Gateway
N[L3/L4 ファイアウォール]
G[DNS リゾルバー]
end
end
W<--"デバイス
オーケストレーション"-->A
subgraph tunnel["WARP トンネル"]
 ip@{ shape: text, label: "ネットワークトラフィック" }
  dns@{ shape: text, label: "DNS トラフィック" }
end
V --- ip-->N
D --- dns-->G
N --> O[(アプリケーション)]

Split Tunnel の構成で、どの IP トラフィックを WARP トンネルへ送るかを決めます。Local Domain Fallback の構成で、どの DNS リクエストを DoH 経由で Gateway へ送るかを決めます。デバイスオーケストレーション API エンドポイントへのトラフィックは、接続が常に WARP トンネルの外で動作するため、Split Tunnel ルールに従いません。

次に、Cloudflare One Client がオペレーティングシステムを設定し、Local Domain Fallback と Split Tunnel のルーティングルールを適用する仕組みを説明します。実装の詳細は、デスクトップクライアントとモバイルクライアントで異なります。

Windows、macOS、Linux

デスクトップクライアントは 2 つのコンポーネントで構成されます。デバイス上のクライアント機能をすべて扱うサービス / デーモンと、ユーザーがデーモンを操作しやすくする GUI ラッパーです。

DNS トラフィック

Cloudflare One Client を接続すると、クライアントはデバイス上にローカル DNS プロキシを作成し、ポート 53(DNS トラフィック用のポート)で次の IP アドレスにバインドします。

  • IPv4: 127.0.2.2127.0.2.3
  • IPv6:
    • macOS と Linux: fd01:db8:1111::2fd01:db8:1111::3
    • Windows: ::ffff:127.0.2.2

続いて Cloudflare One Client は、すべての DNS リクエストをこれらの IP アドレスへ送るようにオペレーティングシステムを設定します。デバイス上のすべてのネットワークインターフェイスは、DNS 解決にこのローカル DNS プロキシを使います。つまり、すべての DNS トラフィックは Cloudflare One Client が扱います。

Local Domain Fallback の構成に応じて、Cloudflare One Client はリクエストを Gateway へ転送して DNS ポリシーを適用するか、プライベート DNS リゾルバーへ転送します。

flowchart LR
D{{DNS リクエスト}}-->L["ローカル DNS プロキシ <br> (127.0.2.2 と 127.0.2.3)"]-->R{Local Domain Fallback 対象?}
R -- はい --> F[プライベート DNS リゾルバー]
R -- いいえ --> G[Cloudflare Gateway]

オペレーティングシステムが Cloudflare One Client のローカル DNS プロキシを使っていることは、次の方法で確認できます。

macOS では、ターミナルを開いて scutil --dns を実行します。DNS サーバーは、Cloudflare One Client のローカル DNS プロキシ IP になっている必要があります。

scutil --dns
DNS configuration (for scoped queries)
resolver #1
  search domain[0] : <DNS-SEARCH-DOMAIN>
  nameserver[0] : 127.0.2.2
  nameserver[1] : 127.0.2.3
  if_index : 15 (en0)
  flags    : Scoped, Request A records
  reach    : 0x00030002 (Reachable,Local Address,Directly Reachable Address)
resolver #2
  nameserver[0] : 127.0.2.2
  nameserver[1] : 127.0.2.3
  nameserver[2] : fd01:db8:1111::2
  nameserver[3] : fd01:db8:1111::3
  if_index : 23 (utun3)
  flags    : Scoped, Request A records, Request AAAA records
  reach    : 0x00030002 (Reachable,Local Address,Directly Reachable Address)

Windows では、PowerShell ウィンドウを開いて ipconfig を実行します。DNS サーバーは、Cloudflare One Client のローカル DNS プロキシ IP になっている必要があります。

ipconfig
Windows IP Configuration

Unknown adapter CloudflareWARP:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : Cloudflare WARP Interface Tunnel
   Physical Address. . . . . . . . . :
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes
   IPv6 Address. . . . . . . . . . . : 2606:4700:110:8f79:145:f180:fc4:8106(Preferred)
   Link-local IPv6 Address . . . . . : fe80::83b:d647:4bed:d388%49(Preferred)
   IPv4 Address. . . . . . . . . . . : 172.16.0.2(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.255
   Default Gateway . . . . . . . . . :
   DNS Servers . . . . . . . . . . . : 127.0.2.2
                                       127.0.2.3
   NetBIOS over Tcpip. . . . . . . . : Enabled

Linux では、/etc/resolv.conf ファイルを確認します。DNS サーバーは、Cloudflare One Client のローカル DNS プロキシ IP になっている必要があります。

cat /etc/resolv.conf
# This file was generated by cloudflare-warp.
nameserver 127.0.2.2
nameserver 127.0.2.3
nameserver fd01:db8:1111::2
nameserver fd01:db8:1111::3
search <DNS-SEARCH-DOMAIN>
options edns0
options trust-ad

IP トラフィック

Cloudflare One Client を接続すると、トラフィックを WARP トンネルの内側と外側のどちらへ送るかを制御するために、デバイス上で次の 3 つの変更を行います。

flowchart LR
P{{IP パケット}}-->R["OS ルーティングテーブル"]-->F["OS ファイアウォール"] --> S{Split Tunnels の除外対象?}
S -- はい --> A[(アプリケーション)]
S -- いいえ --> U["仮想インターフェイス<br> (172.16.0.2)"] --> G[Cloudflare Gateway]

仮想インターフェイス

仮想インターフェイスを使うと、オペレーティングシステムは NIC などの物理インターフェイスを、IP トラフィックのルーティング用に論理的に分割できます。Cloudflare One Client の仮想インターフェイスが、デバイスと Cloudflare のあいだの WireGuard / MASQUE 接続を維持します。デフォルトでは、WireGuard を使うデバイスの IPv4 アドレスは 172.16.0.2 に固定されます。MASQUE を使うデバイスには、CGNAT IP 空間(100.96.0.0/12)から 一意の IP が割り当てられます。デフォルトの仮想インターフェイス IP は、カスタムデバイス IP で上書きできます。

オペレーティングシステム上のすべてのネットワークインターフェイスを確認するには:

Windows では ipconfig を実行します。Cloudflare One Client がオンのとき、デバイス IP が付いた CloudflareWARP アダプターが表示されます。

ipconfig
Windows IP Configuration

Unknown adapter CloudflareWARP:

   Connection-specific DNS Suffix  . :
   Description . . . . . . . . . . . : Cloudflare WARP Interface Tunnel
   Physical Address. . . . . . . . . :
   DHCP Enabled. . . . . . . . . . . : No
   Autoconfiguration Enabled . . . . : Yes
   IPv6 Address. . . . . . . . . . . : 2606:4700:110:8f79:145:f180:fc4:8106(Preferred)
   Link-local IPv6 Address . . . . . : fe80::83b:d647:4bed:d388%49(Preferred)
   IPv4 Address. . . . . . . . . . . : 172.16.0.2(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.255
   Default Gateway . . . . . . . . . :
   DNS Servers . . . . . . . . . . . : 127.0.2.2
                                       127.0.2.3
   NetBIOS over Tcpip. . . . . . . . : Enabled

macOS では ifconfig を実行します。Cloudflare One Client がオンのとき、デバイス IP が付いた utun インターフェイスが表示されます。

ifconfig
<redacted>
utun3: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1280
	inet 172.16.0.2 --> 172.16.0.2 netmask 0xffffffff
	inet6 fe80::f6d4:88ff:fe82:6d9e%utun3 prefixlen 64 scopeid 0x17
	inet6 2606:4700:110:8c7d:7369:7526:a59b:5636 prefixlen 128
	nd6 options=201<PERFORMNUD,DAD>

Linux では ifconfig または ip addr を実行します。Cloudflare One Client がオンのとき、デバイス IP が付いた utun インターフェイスが表示されます。

ip addr
<redacted>
3: CloudflareWARP: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc mq state UNKNOWN group default qlen 500
    link/none
    inet 172.16.0.2/32 scope global CloudflareWARP
       valid_lft forever preferred_lft forever
    inet6 2606:4700:110:8a2e:a5f7:a8de:a1f9:919/128 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::117e:276b:8a79:c498/64 scope link stable-privacy
       valid_lft forever preferred_lft forever

上の例では、デバイスの IPv4 アドレスは 172.16.0.2 です。

ルーティングテーブル

Cloudflare One Client は、どの IP トラフィックを Gateway へ送るかを制御するために、システムのルーティングテーブルを編集します。ルーティングテーブルは、特定の IP アドレス宛のパケットをどのネットワークインターフェイスが扱うかを示します。デフォルトでは、Split Tunnel の除外リストにある IP とドメイン(デバイスのデフォルトインターフェイスを使う)を除き、すべてのトラフィックが Cloudflare One Client の仮想インターフェイス経由でルーティングされます。

ルーティングテーブルが Split Tunnel ルールと一致していることは、次の方法で確認できます。

macOS でルーティングテーブル全体を表示するには、netstat -r を実行します。

ドメインまたは IP アドレスでルーティングテーブルを検索することもできます。この例では、google.com へのトラフィックが、このデバイス上の Cloudflare One Client の仮想インターフェイスである utun3 経由で送られていることがわかります。

route get google.com
   route to: lga25s81-in-f14.1e100.net
destination: 136.0.0.0
       mask: 248.0.0.0
  interface: utun3
      flags: <UP,DONE,PRCLONING>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0      1280         0

一方、この DHCP アドレスは Cloudflare One Client から除外され、デフォルトインターフェイスを使います。

route get 169.254.0.0
   route to: 169.254.0.0
destination: 169.254.0.0
       mask: 255.255.0.0
  interface: en0
      flags: <UP,DONE,CLONING,STATIC>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0      1500   -210842

Windows でルーティングテーブル全体を表示するには、netstat -r を実行します。

IP アドレスでルーティングテーブルを検索することもできます。この例では、1.1.1.1 へのトラフィックが Cloudflare One Client の仮想インターフェイス経由で送られていることがわかります。

Find-NetRoute -RemoteIPAddress "1.1.1.1" | Select-Object InterfaceAlias -Last 1
InterfaceAlias
--------------
CloudflareWARP

一方、この DHCP アドレスは Cloudflare One Client から除外され、デフォルトインターフェイスを使います。

Find-NetRoute -RemoteIPAddress "169.254.0.0" | Select-Object InterfaceAlias -Last 1
InterfaceAlias
--------------
Wi-Fi

Linux でルーティングテーブル全体を表示するには、ip -6 route show table all または ip -4 route show table all を実行します。

IP アドレスでルーティングテーブルを検索することもできます。この例では、1.1.1.1 へのトラフィックが Cloudflare One Client の仮想インターフェイス経由で送られていることがわかります。

ip route get 1.1.1.1
1.1.1.1 dev CloudflareWARP table 65743 src 172.16.0.2 uid 1000
    cache

一方、この DHCP アドレスは Cloudflare One Client から除外され、デフォルトインターフェイスを使います。

ip route get 169.254.0.0
169.254.0.0 dev ens18 src 172.24.8.6 uid 1000
    cache

システムファイアウォール

Cloudflare One Client は、Split Tunnel ルールを強制するために、オペレーティングシステムのファイアウォールを変更します。サービスがルーティングテーブルを迂回し、別のインターフェイスから直接トラフィックを送ろうとした場合の保護層になります。たとえば、203.0.113.0 宛のトラフィックを Gateway で検査する必要がある場合、utun 以外のすべてのインターフェイスで 203.0.113.0 をブロックするファイアウォールルールを作成します。

iOS、Android、ChromeOS

iOS と Android / ChromeOS では、Cloudflare One Agent は VPN クライアントとして自身をインストールし、すべてのトラフィックをキャプチャしてルーティングします。アプリは、iOS と Android の公式 VPN フレームワーク上に構築されています。詳細は、Apple の NetworkExtension ドキュメント と Google の Android 開発者ドキュメント を参照してください。

ChromeOS はネイティブの Chrome アプリを動かすのではなく、仮想マシン内で Android アプリを実行します。

役に立ちましたか?