動かざることバグの如し

近づきたいよ 君の理想に

Cloudflare WARPで外出先から自宅サーバーにSSHする

やりたいこと

外出先でMacOSから自宅サーバーのUbuntuにsshしたい。外出先でも開発したい

環境

  • ネットワーク: 192.168.16.0/24
  • MacOS
  • Ubuntu 192.168.16.12

手順

ITエンジニアだしなるべくコマンドで設定していく。

まずMacのcloudflaredをCloudflareアカウントに認証させる。

cloudflared tunnel login

ブラウザが開くのでCloudflareにログインし、使用するゾーンを選択する。完了すると ~/.cloudflared/cert.pem が生成される。

既存トンネルの確認

❯ cloudflared tunnel list
You can obtain more detailed information for each tunnel with `cloudflared tunnel info <name/uuid>`
ID                                   NAME   CREATED              CONNECTIONS                                 
***** myhome 2024-07-24T17:47:22Z 1xnrt05, 1xnrt10, 1xnrt13, 1xnrt15, 1xnrt16 

myhome というトンネルが既に存在して接続中だった。自宅サーバー側でcloudflaredが動いている状態。

cloudflared tunnel info myhome

3. IPルートの追加

WARPからプライベートネットワークへ到達させるにはトンネルにIPルートを紐付ける必要がある。

cloudflared tunnel route ip add 192.168.16.0/24 myhome

4. 自宅サーバー側でwarp-routingを有効化

自宅サーバー(192.168.16.12)ではcloudflaredがDockerコンテナとして動いており、設定ファイルなしのトークン方式だった。warp-routingを有効にするにはconfig.ymlをマウントして再作成する必要がある。

192.168.16.12で設定ファイルを作成

cat > /home/thr3a/cloudflared-config.yml << 'EOF'
warp-routing:
  enabled: true
EOF

コンテナを止めて設定ファイルをマウントした状態で再起動:

docker stop cloudflare && docker rm cloudflare
docker run -d \
  --name cloudflare \
  --restart always \
  -v /home/thr3a/cloudflared-config.yml:/etc/cloudflared/config.yml \
  cloudflare/cloudflared:latest \
  tunnel --no-autoupdate run --config /etc/cloudflared/config.yml --token <TOKEN>

ログで "warp-routing":{"enabled":true} が確認できれば成功。

5. Zero Trust設定(API経由)

ダッシュボードのGUIでも設定できるが、再現性のためAPIで行う。

事前にCloudflare APIトークンを作成しておく。権限は Account > Zero Trust > Edit が必要。Read権限のみだとSplit Tunnel設定の変更でエラーになるので注意(実際に嵌った)。

ACCOUNT_ID="*****"
CF_TOKEN="<APIトークン>"

Split Tunnelの除外設定を削除

デフォルトでは 192.168.0.0/16 などのプライベートIPがWARPの除外リストに入っており、VPN経由でルーティングされない。このエントリを削除する。

# 現在のSplit Tunnel設定を確認
curl -s "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/devices/policy/exclude" \
  -H "Authorization: Bearer ${CF_TOKEN}"

確認して 192.168.0.0/16 が含まれていれば、そのエントリを除いたリストでPUTする。

デバイス登録ポリシー確認

curl -s "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/devices/policy" \
  -H "Authorization: Bearer ${CF_TOKEN}"

自分のメールアドレスがEnrollment許可リストに入っていることを確認。

6. WARPクライアントのインストールと登録

MacにWARPクライアントをインストール:

brew install --cask cloudflare-warp

Zero Trust組織に登録する。

warp-cli registration new thr3a

ブラウザが開いて thr3a.cloudflareaccess.com の認証画面が表示される。自分のメールアドレスでログインして「Open Cloudflare WARP」を押す。

登録確認の確認

warp-cli registration show
# Account type: Team / Organization: thr3a が表示されればOK

7. 接続してSSH確認

warp-cli connect
warp-cli status
# Status update: Connected / Network: healthy

ssh 192.168.16.12

8. TLS検査の無効化

WARPを有効にした状態でcurlするとSSLエラーが出た:

curl: (60) SSL certificate problem: self signed certificate in certificate chain

Cloudflare GatewayがHTTPSトラフィックを検査しようとするせい。CloudflareのルートCA証明書をインストールするか、TLS検査自体を無効化するかどちらかで対応できる。今回はTLS検査を無効化した:

curl -s -X PATCH \
  "https://api.cloudflare.com/client/v4/accounts/${ACCOUNT_ID}/gateway/configuration" \
  -H "Authorization: Bearer ${CF_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{"settings":{"tls_decrypt":{"enabled":false}}}'

外出先での使い方

家のネットワーク内では切断状態でもSSHできてしまうため、動作確認するにはスマホのモバイル回線でテザリングしてからWARP有効でSSHするのが確実。