Cloudflare Zero Trust を使って外から自宅ネットワークへのアクセスできるようにする。
自宅のネット回線として NURO 光を使っていて、最近 10G への契約変更と合わせて ONU (兼ルータ)を交換した。 機種としては ZTE F660A から SONY NSD-G3100T に変わったのだが、 それに伴って IPv4 サポートの方式がデュアルスタック方式から MAP-E 方式というのに変わった。
外から自宅ネットワーク(主に NAS )への接続のために IPv4 アドレスのポート転送で自宅サーバの Wireguard ポートをインターネット公開していたのだが、 その辺りの変更によってポート転送が使えなくなった。 1
もともと自宅サーバをポート転送でインターネット公開すること自体どうだろうなという感覚もぼんやりとはあったので、 丁度良い機会ということで Cloudflare Zero Trust でアクセスする形を試してみることにした。
構成
構成としてはこんな感じ。
設定作業
Cloudflare Tunnel ( cloudflared ) の設定
まずは Cloudflare と自宅ネットワークを繋ぐ Tunnel を作成する。
Tunnel の構築には cloudflared を適当なマシンで動かす。 コンテナで動かす方法もあるが、今回は直接インストールする。 ArchLinux の場合、作業時点で extra リポジトリにあった。
sudo pacman -S cloudflaredインストールが済んだら Zero Trust の認証をする。
こんな感じで実行するとブラウザでの認証を求められるので適宜進める。
完了すれば ~/.cloudflared/ にクレデンシャルファイルが生成される。
cloudflared tunnel login認証が済んだら実際に Tunnel を作成する。 Cloudflare の管理画面から進める事もできるっぽいが、今回は cloudflared から作成する。
cloudflared tunnel create my-tunnel-nameWARP から Tunnel への通信を許可するために設定ファイルを作る。
tunnel: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
credentials-file: /home/shida/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json
warp-routing:
enabled: trueTunnel にルーティングするアドレス帯を設定する。
cloudflared tunnel route ip add 192.168.50.0/24 my-tunnel-name
cloudflared tunnel route ip show一旦手動で connection を確立する。
cloudflared tunnel run my-tunnel-nameこの時点でトンネルは張れている
このまま進めてもいいが、最終的には常時動かす状態にしておきたいので、サービスとして登録しておく。
cloudflared は一旦停止して、設定ファイル等を /etc/cloudflared/ に移動、
sudo mkdir /etc/cloudflared
sudo mv ~/cloudflared/* /etc/cloudflared/ユニットファイルを作成、
[Unit]
Description=Cloudflare Tunnel
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/bin/cloudflared tunnel --config /etc/cloudflared/config.yml run my-tunnel-name
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.targetサービスとして起動。
sudo systemctl daemon-reload
sudo systemctl enable --now cloudflared.service
sudo systemctl status cloudflared.serviceTunnel の設定は終わり。
Cloudflare WARP の設定
次に WARP 接続部分の、 Cloudflare 側の設定をする。
基本的に WARP 接続に関する設定は Cloudflare 側でやって、端末にはそれを配布する感じになる。 なので端末側は Zero Trust 組織のデバイスとしての認証操作のみ。
設定に関してはウィザード形式で進められる。 どういう設定が必要なのかを見てみる意味で、最初のはこれに沿って設定するのが良さそう。 場所としては、Cloudflare のアカウントホームから Zero Trust の画面に行った後、
- 「チームとリソース」 > 「ユーザー」 > 「デバイスの登録」
あたりにある。
ウィザードの中ではこの辺の設定をしてる(はず)。 細かい設定をしたい場合は、ウィザードで作成後この辺を見て調整するなり、ウィザード通さずこの辺を直接設定したりすれば良いはず。
- Access ポリシーの作成
- 「Access コントロール」 > 「ポリシー」
- Zero Trust 全体で使う認証設定の作成
- デフォルトではメール認証になる、試してはないが他の IdP での認証も色々使えるっぽい
- Zero Trust の組織のデバイスと認証するための Access ポリシーの設定(紐付け)
- 「チームとリソース」 > 「デバイス」 > 「管理」 > 「デバイスの登録権限」 > 「管理」
- デバイスプロファイルの設定
- 「チームとリソース」 > 「デバイス」 > 「デバイス プロファイル」
- 何処宛の通信を WARP に流すかとかの制御
- 今回はほぼ全て WARP に流す形にしてるが、特定の通信(DNS のみ、トラフィックのみ、自宅ネットワーク宛だけ、とか)を WARP に流す形もできる
- 何処宛の通信を WARP に流すかとかの制御
- 「チームとリソース」 > 「デバイス」 > 「デバイス プロファイル」
各デバイスでの WARP Client の設定
最後に、 WARP 部分のデバイス側の設定をする。
iOS, Android ( Cloudflare One Agent )
Cloudflare でのアプリ機能の整理があったのか、調べてて若干混乱したが、今回の様に Tunnel へのルーティングを含む WARP 接続をする場合、今は 1.1.1.1 + WARP ではなく、 Cloudflare One Agent を使うっぽい。
設定に関しては、ハンバーガーメニューの中にそれっぽいものがあるので、そこから組織名(≠ トンネル名)を入力して、メールでのワンタイムコードでの認証をすれば終わり。 Cloudflare 側での設定が問題なくできていれば特段詰まるようなところはないはず。
Linux ( warp-cli )
Linux 用には warp-cli というのがある。
ArchLinux の場合、 AUR にパッケージがあるのでそれを使う。 公式から提供されてるのは Ubuntu, Debian, RHEL のパッケージのみだが、AUR パッケージでは Debian 用の deb パッケージを展開、再配置する感じの PKGBUILD になっていた。
インストール、
yay -S cloudflare-warp-bin認証、
warp-cli registration new team-name
warp-cli registration show有効化。
warp-cli connect
warp-cli statuswarp-svc.service が自動起動するようになってるので、手動制御したい場合は適宜設定する。
おわりに
設定してみた感想としては、
- 自宅ネットワークへのアクセスの口をインターネットに公開しておく必要が無いのは良い。
- cloudflared から先(NASとか)へのルーティングも cloudflared がよしなにやってくれるので、細かい設定しなくてもいい感じに動いてくれるのも良い。
- Wireguard でやってた みたいに cloudflared 動かしてるサーバでの転送設定も要らない。
- 暗号化含め通信経路の管理は Cloudflare にお任せにはなるので、通信内容は気を使う必要がある。
- 理屈の上では Cloudflare は通信内容見えるって事なので、実際に流す通信はちゃんと暗号化してやる必要がある。
- 宅内アプライアンスにも HTTPS でアクセスするとか、SMB でも暗号化強制するとか。
- 理屈の上では Cloudflare は通信内容見えるって事なので、実際に流す通信はちゃんと暗号化してやる必要がある。
- アクセスポリシーとかデバイスプロファイルとかの設定部分は今回 GUI でやったが、設定管理のために別の設定方法はもうちょっと調べたい。
- API もしくは Terraform での管理になるっぽい
- この辺りの事情もちょっと自分でも試して確認したい
- Cloudflare WARPの落とし穴 - 一般的なVPNだと思ってはいけない理由 #cloudflare - Qiita
- 自分の場合はどこかにアクセスする際に自分の IP 隠したいみたいな意図はあんまり無いが、なるほどなぁとなったので試したい、くらいの意図。
他、実際に2週間くらい使ってみた感想としては、
- 今回全ての通信を WARP に流すようにしたが、若干通信が不安定な気がする。
- 頻発するわけではないが、スマホでゲームしてる時の通信リトライとか、 ArchLinux でのパッケージダウンロードの失敗が増えた気がする。
- 何か設定が悪いのか、そういうものとして必要な通信のみ WARP に流す形にするのが良いのか、気の所為(別要因)なのか、この辺はもう少し調べても良いかもしれない。
-
正確には、できるのかもしれないが自分のこの辺の IPv6 周りの理解が怪しくちゃんと設定できる気がしない。 ↩︎