Cloudflare を使って WARP する (飛ぶぞ)


Cloudflare WARP クライアントをつかった WARP の方法を列記します。
（WARP ＝ Cloudflare 経由で通信のプライバシーを保護する）


#DNS を WARP

端末に設定されたフルリゾルバに DNS クエリ（UDP/TCP 53）を送信する代わりに、Cloudflare との暗号化チャネル上で DNS クエリを送信します。

暗号化チャネルは選択が可能です。

| Protocol | SNI                 | Port |
|:--------|:-------------------|:--------|
| TLS      | cloudflare-dns.com  | TCP 853  |
| HTTPS    | cloudflare-dns.com  | TCP 443  |

WARP クライアントの設定は **1.1.1.1** を選択します。

![Screen Shot 2021-12-05 at 17.27.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/2032df41-e7ea-8520-d94b-8c1706190103.png)

_Preferences > Connection > DNS Protocol_ で **TLS** を選択してみます。

![Screen Shot 2021-12-05 at 17.33.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/39c68136-f318-9d84-78c7-f22b393c8751.png)

DNS クエリを送信し、パケットをキャプチャすると UDP 53 での送信はされず、下記の SNI を使い TLS コネクション (Port 853 TCP) 上でやり取りされていることが確認できます。

![Screen Shot 2021-12-05 at 17.29.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/21a73317-0f17-2b11-d752-7b0b3bab997e.png)

**HTTPS** を選択すると、違うポート (Port 443 TCP) で TLS コネクションが張られます。

![Screen Shot 2021-12-05 at 17.41.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/3c9a9a05-cebd-ce80-3743-1c6bac4d2869.png)



#全部を WARP
DNS を含めたすべてのアプリケーション通信を Cloudflare との暗号化チャンネル経由やり取りすることができます。

WARP クライアントの設定は下記の **1.1.1.1 with WARP** を選択します。

![Screen Shot 2021-12-05 at 17.58.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/6eced366-f4c5-4745-0212-948a1b076e3f.png)

_Preferences > Connection > DNS Protocol_ では **WARP** が選択されています。

![Screen Shot 2021-12-05 at 17.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/e6eca566-85f4-1470-efa4-c29935747501.png)

パケットキャプチャを見てみると、すべての通信が WARP トンネル (WireGuard プロトコル Port 2408 UDP) で Cloudflare 経由でやり取りされています。

![Screen Shot 2021-12-05 at 18.04.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/9dcf6116-50f3-a717-0f75-7f7fb64116fa.png)

##例外
実際にはすべてのプロトコルではなく、宛先に応じて WARP トンネルインタフェースの利用が選択されています。ローカルインターフェスに直接送信される宛先は下記で確認できます。

_Preferences > Advanced > Network_

![Screen Shot 2021-12-05 at 18.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/33c8463b-5cf9-17c6-9e6d-43bf7b6ce49f.png)

| 設定項目| 内容 | 
|:-|:-|
|  Split Tunnels | 指定する IP やドメインあての通信は WARP せず、ローカルインターフェースに投げる |
| Local Domain Fallback  |  指定するドメインはローカルのフルリゾルバで名前解決をする（DNS の WARP をやめる） |

###Split Tunnels

![Screen Shot 2021-12-05 at 18.06.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/e66a7e20-f692-da03-1843-c1494bd923d2.png)

Domain を追加してみます。
![Screen Shot 2021-12-05 at 20.31.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/80e5f328-5d23-916e-aaab-113b965c29d4.png)


当該ドメインのホストに HTTP リクエストをすると、WARP トンネルインターフェースでなく、ローカルインターフェースから直接アクセスがされています。
![Screen Shot 2021-12-05 at 18.09.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/15200093-920a-13b2-7c62-eac4de63b445.png)

###Local Domain Fallback

![Screen Shot 2021-12-05 at 18.14.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/b8e8e2ad-64b3-45cb-2e93-25560f9a7ff8.png)

デフォルトで登録してある *.intranet のホストに DNS クエリを投げると、ローカルのリゾルバに直接クエリが送信されており、暗号化されていないクエリの内容を確認することができます。
![Screen Shot 2021-12-05 at 18.15.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/013f3c7f-4067-5ac1-07f8-e547909f72ef.png)


#特定プロトコルを WARP

Proxy Mode を選択することで、特定のプロトコルを Cloudflare 経由で WARP させることができます。
Proxy Protocol は HTTP および SOCKS5 を利用することができます。
Cloudflare との Proxy 接続は WARP トンネル上で行われるため、暗号化されます。

_Preferences > Advanced > Network > Configure Proxy Mode_ で設定を行います。

![Screen Shot 2021-12-05 at 18.17.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/d6bddf7a-9aa6-9427-c531-aba3d560a427.png)

デフォルトでは Port 40000 (TCP) がリスナーとして指定されています。
**Enable proxy mode on this device** を有効化します。

![Screen Shot 2021-12-05 at 18.18.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/3af095c5-f3b8-8445-3b9c-72641df06b00.png)

有効にすると、下記の **WARP via Local Proxy** が出現するので、選択します。

![Screen Shot 2021-12-05 at 18.22.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/a2d3e8d7-5d51-8370-73ce-8ccf8087a398.png)

転送できるアプリケーションと Proxy プロトコルの関係は以下のとおりです。

| Proxy プロトコル | 転送することのできるアプリケーション |Cloudflare とのやり取り|
|:-|:-|:-|
|  HTTP | HTTPS (HTTP は転送しません、HTTP の場合は SOCKS5 を利用します) |WARP トンネルで暗号化|
|  SOCKS5 | TCP |WARP トンネルで暗号化|


##HTTP Proxy
![Screen Shot 2021-12-05 at 18.29.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/2ab7ef3a-a0a7-2036-e8f5-d3d4b33772be.png)

##SOCKS5 Proxy
![Screen Shot 2021-12-05 at 21.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/0026aa4d-cb1e-9e6c-fa9a-409e03340ef3.png)

curl の --socks5 オプションの場合、宛先ホストの DNS 解決をローカルで行うため下記の DNS クエリが確認されました。
![Screen Shot 2021-12-05 at 21.09.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2218045/175de9d5-eba4-9acb-e998-fdcd199fa675.png)
 
#まとめ
以上、Cloudflare WARP クライアントを使って WARP する方法について簡単に紹介しました。
**1.1.1.1 for Families** でのコンテンツフィルタリングやマウルウェア防御、**Cloudflare for Teams** をつかったさらなるパーソナライゼーションには触れていませんが、ご興味があればぜひともお試しください。

#リンク
##1.1.1.1
https://1.1.1.1/
https://developers.cloudflare.com/1.1.1.1/
https://www.cloudflare.com/ja-jp/learning/dns/dns-over-tls/
https://blog.cloudflare.com/announcing-warp-for-linux-and-proxy-mode/
https://blog.cloudflare.com/introducing-1-1-1-1-for-families/
##Cloudflare for Teams
https://www.cloudflare.com/ja-jp/teams/
https://developers.cloudflare.com/cloudflare-one/