Debian 11 (bullseye) Linux に Cloudflare WARP を入れて接続体験を可視化する

# 目的
Debian 11 (bullseye) Linux に Cloudflare WARP を入れて世界各地にばら撒いた上で接続体験を可視化する必要があったので、その時のメモ。

# OS バージョン

```shell:
$ cat /etc/os-release 
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
```

# Cloudflare WARP インストール
以下のリンク先にある手順に沿ってインストールできます。

https://pkg.cloudflareclient.com/

```shell:
# Add cloudflare gpg key
curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg

# Add this repo to your apt repositories
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list

# Install
sudo apt-get update && sudo apt-get install cloudflare-warp
```

以下のコマンドでインストールされたバージョンが確認できます。

```shell:
$ warp-cli --version
warp-cli 2023.10.120
```

# 証明書インストール
Cloudflare WARP エージェントによる自動インストールを有効化した上で、以下のコマンドを実施します。

- [Install certificate using WARP · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/user-side-certificates/install-cert-with-warp/#linux)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/3c7edb4f-1be8-8cad-7541-df044b9ed576.png)


```shell:
cd /usr/local/share/ca-certificates
sudo mv managed-warp.pem managed-warp.crt
sudo update-ca-certificates
```
# サービストークン作成
UI によるインタラクティブな認証プロセスを省略したいため、サービストークンを作成します。

- [Service tokens · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/identity/service-tokens/#service-tokens)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/7a7eed48-aa96-6e0d-f97c-f2153e0bca4e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/b0884437-2341-4e63-494a-00057676ea0c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/fd806733-b1c7-5863-7ad2-01634f37f7af.png)

# Device enrollment permissions でサービストークンを許可
作成したサービストークンを使ってアカウント認証が許可されるように Device enrollment permissions を設定します。

- [Device enrollment permissions · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/deployment/device-enrollment/#check-for-service-token)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/69098684-9ccb-b750-d7f0-a12def89956d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/5f8094a4-d385-82c9-1b7f-3d5be9fe0b71.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/948fc164-dad8-fd91-6d51-afb6bdbb8f12.png)

# MDM ファイル作成
作成したサービストークンを使って自動認証されるように変数定義し MDM ファイルを作成します。

- [Managed deployment · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/deployment/mdm-deployment/#linux)

```shell:
export TEAM_NAME='YOUR_TEAM_NAME'
export CLIENT_ID='YOUR_CLIENT_ID'
export CLIENT_SECRET='YOUR_CLIENT_SECRET'
```

```shell:
cat << EOS | sudo tee /var/lib/cloudflare-warp/mdm.xml
<dict>
    <key>organization</key>
    <string>$TEAM_NAME</string>
    <key>service_mode</key>
    <string>warp</string>
    <key>onboarding</key> 
    <false />
    <key>switch_locked</key> 
    <false />
    <key>auto_connect</key> 
    <integer>0</integer> 
    <key>auth_client_id</key>
    <string>$CLIENT_ID</string>
    <key>auth_client_secret</key>
    <string>$CLIENT_SECRET</string>
</dict>
EOS
```

# SSH 接続元は Split Tunnel しておく

リモートから SSH ログインしている Linux サーバーに Cloudflare WARP を入れる場合には、SSH 接続元の IP アドレスは Split Tunnel しておきましょう。

そうしないと Cloudflare WARP が接続された途端に SSH 通信がつながらなくなってしまいます。

- [Split Tunnels · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/connections/connect-devices/warp/configure-warp/route-traffic/split-tunnels/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/3f0d409f-9b11-eef2-aaf6-1c53bdf42f9b.png)


# 接続確認
MDM ファイルが作成された時点で自動で読み取られるため、そのまま `warp-cli connect` により接続できます。

- [Authenticate and enroll the WARP client · Replace your VPN · Learning paths](https://developers.cloudflare.com/learning-paths/replace-vpn/connect-user-devices/enroll-warp-client/#enroll-via-the-cli)

```shell:
$ warp-cli get-organization
YOUR_TEAM_NAME

$ warp-cli status
Status update: Disconnected. Reason: Manual Disconnection
Success

$ warp-cli connect
Success

$ warp-cli status
Status update: Connected
Success

$ warp-cli disconnect
Success

$ warp-cli status
Status update: Disconnected. Reason: Settings Changed
Success
```

# まとめ
このようにして世界各所にばら撒くことができました。

- [Digital Experience Monitoring · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/insights/dex/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/2d5a825d-251e-df96-c38c-a80284b5062a.png)

これらの Cloudflare WARP 端末に対して HTTP や Traceroute のテストを仕込むことで、各端末での接続体験を可視化することができます。

- [Tests · Cloudflare Zero Trust docs](https://developers.cloudflare.com/cloudflare-one/insights/dex/tests/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/ccdb41c6-fe40-417f-4054-783d53ee7511.png)