このガイドでは、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 のルーティングルールを適用する仕組みを説明します。実装の詳細は、デスクトップクライアントとモバイルクライアントで異なります。
デスクトップクライアントは 2 つのコンポーネントで構成されます。デバイス上のクライアント機能をすべて扱うサービス / デーモンと、ユーザーがデーモンを操作しやすくする GUI ラッパーです。
Cloudflare One Client を接続すると、クライアントはデバイス上にローカル DNS プロキシを作成し、ポート 53(DNS トラフィック用のポート)で次の IP アドレスにバインドします。
- IPv4:
127.0.2.2と127.0.2.3 - IPv6:
- macOS と Linux:
fd01:db8:1111::2とfd01:db8:1111::3 - Windows:
::ffff:127.0.2.2
- macOS と Linux:
続いて Cloudflare One Client は、すべての DNS リクエストをこれらの IP アドレスへ送るようにオペレーティングシステムを設定します。デバイス上のすべてのネットワークインターフェイスは、DNS 解決にこのローカル DNS プロキシを使います。つまり、すべての DNS トラフィックは Cloudflare One Client が扱います。
Local Domain Fallback の構成に応じて、Cloudflare One Client はリクエストを Gateway へ転送して DNS ポリシーを適用するか、プライベート DNS リゾルバーへ転送します。
- Gateway へのリクエストは、WARP トンネル内の DoH 接続 経由で送られます。
- プライベート DNS リゾルバーへのリクエストは、Split Tunnel の構成に応じて、トンネルの内側または外側で送られます。詳細は Cloudflare One Client が 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 --dnsDNS 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 になっている必要があります。
ipconfigWindows 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. . . . . . . . : EnabledLinux では、/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-adCloudflare One Client を接続すると、トラフィックを WARP トンネルの内側と外側のどちらへ送るかを制御するために、デバイス上で次の 3 つの変更を行います。
- 仮想ネットワークインターフェイス を作成します。
- Split Tunnel ルールに従って、オペレーティングシステムの ルーティングテーブル を変更します。
- Split Tunnel ルールに従って、オペレーティングシステムの ファイアウォール を変更します。
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 アダプターが表示されます。
ipconfigWindows 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. . . . . . . . : EnabledmacOS では 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 -210842Windows でルーティングテーブル全体を表示するには、netstat -r を実行します。
IP アドレスでルーティングテーブルを検索することもできます。この例では、1.1.1.1 へのトラフィックが Cloudflare One Client の仮想インターフェイス経由で送られていることがわかります。
Find-NetRoute -RemoteIPAddress "1.1.1.1" | Select-Object InterfaceAlias -Last 1InterfaceAlias
--------------
CloudflareWARP一方、この DHCP アドレスは Cloudflare One Client から除外され、デフォルトインターフェイスを使います。
Find-NetRoute -RemoteIPAddress "169.254.0.0" | Select-Object InterfaceAlias -Last 1InterfaceAlias
--------------
Wi-FiLinux でルーティングテーブル全体を表示するには、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.11.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.0169.254.0.0 dev ens18 src 172.24.8.6 uid 1000
cacheCloudflare One Client は、Split Tunnel ルールを強制するために、オペレーティングシステムのファイアウォールを変更します。サービスがルーティングテーブルを迂回し、別のインターフェイスから直接トラフィックを送ろうとした場合の保護層になります。たとえば、203.0.113.0 宛のトラフィックを Gateway で検査する必要がある場合、utun 以外のすべてのインターフェイスで 203.0.113.0 をブロックするファイアウォールルールを作成します。
iOS と Android / ChromeOS では、Cloudflare One Agent は VPN クライアントとして自身をインストールし、すべてのトラフィックをキャプチャしてルーティングします。アプリは、iOS と Android の公式 VPN フレームワーク上に構築されています。詳細は、Apple の NetworkExtension ドキュメント ↗ と Google の Android 開発者ドキュメント ↗ を参照してください。
ChromeOS はネイティブの Chrome アプリを動かすのではなく、仮想マシン内で Android アプリを実行します。