2222 words
11 minutes
Cloudflare Tunnelを利用して自宅VPNを整備しよう

自宅VPNの必要性#

自宅のVPNが必要になる理由は二つあります。

一つは海外から日本のウェブサイトを閲覧する際にISPでブロックが書けられてしまうことに対する対策。そしてもう一つは外部から自宅のネットワークにアクセスする必要性が生じる場合がある、ということです。

例えば、macOSの画面共有機能は同一ネットワークでなければ動きませんし、ルータを外部に公開していなければ自宅のルータの設定を外部から変更することもできません。

また、外部に公開していないLAN内のサーバーにもアクセスできません。

もともと、うちのサーバーは全部サブドメインを使って外部に公開していたのですが、そうするとそれぞれに認証をかけなければならない上にいちいちドメインを取るのもめんどくさいです。

それを解決するのがCloudflare WARPでした。

WARPが必要となったわけ#

現在は自宅のルータでVPNを作成してそれを経由して外部から内部のPCを操作したり、Cloudflaredで公開しているドメインを利用してアクセスしたりしています。

でもこれをやると家にある外部から弄りたいサーバーの数だけサブドメインを用意する必要があり、とてもめんどくさいです。

そこで、LAN内に完全に信頼されたサーバーを一つ用意して、内部へのアクセスは全てそれを経由すればそれ以外のサーバーはサブドメインも不要でcloudflaredも不要になるというわけです。

で、この完全に信頼されたサーバーを一つ用意するのがCloudflare WARPの出番なんじゃないかと思っています(違ったらすみません

この役目は今までバッファローのルーターが担っていたのですが、IPv6だとL2TP/IPSecが利用できないので中途半端な環境になっていました。

設定方法#

設定自体は拍子抜けするほど簡単でした。

また、以下の記事を大変参考にさせていただきました。

まあここでは既にCloudflaredが導入済みでTunnelも貼っているサーバーがLAN内に一台あり、それをWARPサーバーを兼用することを考えます。

まず、Tunnelの設定からPrivate Networkのタブを開き、192.168.13.0/24のようにcloudflaredが動作しているサーバーのIPセグメントを入力します。

セグメントがわからない場合はサーバーでip aと入力すれば表示されます。

セグメントを追加したらTunnel側の設定は終わりです。TunnelのステータスがHEALTHYになっていることは確認しましょう。

ドメイン確認#

通常取得しているドメインではなくSettings>Custom Pagesに表示されているcloudflareaccess.comが末尾についているドメイン名をメモします。

ネットワーク設定#

これを設定しなくても別に繋がったのですが、これをやっている記事もいくつか見かけたので書いておきます。

Settings>Network>FirewarllからProxyを有効化します。

TCPの項目だけ有効化されていたら良いらしいのですが、

  • TCP
  • UCP
  • ICMP
  • Allow WARP to WARP connection

について有効化しておきました。

WARP設定#

Settings>WARP Clientから接続できる端末を制限します。まあCloudflare Accessみたいな感じです。

Device enrollmentからManageをクリックして設定します。

自分はDiscord OIDCを利用しているのでAuthenticationの項目のIdentity providersでこれをチェックします。また、これしかない場合にはAccept all available identity providersでも良いかもしれません。

人によってはGoogle認証などを利用する場合もあると思うので、そこは適時上手いことやってください。

で、多分なんですけどこれとは別にRulesからポリシーの設定も必要です。

というのも、現状だとDiscord OIDCが利用できるすべてのユーザーがログインできてしまうので、OIDCで認証した上でどういうユーザーだけ利用できるようにするかというルール設定が必要になるわけですね。

もしAccessを利用していてグループを作成したことがあるのであれば特に設定しなくてもAssign a groupからログインを許可したいグループを指定すればよいです。

うちの場合はOIDCでログインしつつIDが特定の値のユーザーを許可するように設定しました。

また、WARPの認証が通ればCloudflare Accessを通じてアプリケーションにアクセスできるようになる設定もありましたが、今回はオフにしています。

デバイス設定#

ひょっとしたらこれより下の設定は用途によっては要らないかもしれません。

Split Tunnelを設定するとローカルアドレスに接続できるようにDNSだけプライベートになりますが、そもそも設定しなければローカルアドレスに接続できつつIPアドレスも含めて完全にプライベートになります。

Split Tunnelsを設定しなければYour Internet is privateと表示されて全てプライベートになります(非ログインでWARPを使ったのと同じ状態になる)のですが、設定して隔離してしまうとYour DNS queries and included routes are protectedと表示されて診断くんなどでIPアドレスが見えていることが確認できます

なので自分はとりあえずSplit Tunnelsは切っているのですが、こうするとWARPを繋いでいるときにそのマシンが物理的に存在するプライベートアドレスにアクセスできなくなるのでひょっとしたらその辺が問題なのかもしれません。

というのも、自分の環境だとパソコンAからリモートデスクトップでLAN内のパソコンBにアクセスしているのですが、パソコンAにWARPを通すとBを見つけられなくなる、といった感じです。

なので外出先から繋ぐような場合にはローカルアドレスを参照するようなことがないと思うので、常にWARPは有効にしておいていいと思います。

最後に、このままではローカルIPにアクセスできないのでSettings>WARP Client>Device SettingsからDefaultのプロファイルを開いて追加設定をします。

Split TunnelsからInclude IPs and domainsにチェックを入れManageを選択します。

SelectorからIP Addressesを選択して最初に入力したのと同じ値192.168.13.0/24を入れます。

最後に保存して完了です。

WARP Client#

WARPのクライアントはiOSやmacOSで1.1.1.1という名前でリリースされているのでそれをインストールします。

WARPを直接繋がずにバーガーメニューからアカウントの項目を選択して自分のアカウントのxxxxxx.cloudflareaccess.comxxxxxxの部分を入力します。

すると設定した(私の場合はDiscord OIDC)か起動するのでログインして接続します。

接続ができると、ローカルアドレス192.168.13.1にアクセスできるようになっているはずです。

ちなみに#

DNSを設定するだけなので地域制限回避とかには使えないっぽいです。

EPGStationを自宅で動かしているのですがCloudflare Tunnelを使っているのですが、これをするとapi/configが500エラーを返すようになってしまうのでWARPを利用して自宅VPNとして繋ぐようにしています。

https://github.com/l3tnun/EPGStation/issues/670

作者の方はどうもCloudflare Accessに対応する気はないようなので、根本的に解決するならフォークなりするなりして改良するしかないのかもしれません。

最後に#

そういえば立てているCloudflare TunnelとWARPは何も関連付けていないのですが、ひょっとしてWARPで認証すると立ち上がってるCloudflare Tunnelのサーバー全部が利用できたりするんでしょうか(すごい

そういうときは確かにアドレスを分けておかないと複数のTunnelでプライベートアドレスが被った場合などに大変だなと思いました。

Cloudflare Tunnelを利用して自宅VPNを整備しよう
https://fuwari.vercel.app/posts/2024/12/vpn/
Author
tkgling
Published at
2024-12-02