やりたいこと
外出先で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するのが確実。