有馬総一郎のブログ

(彼氏の事情)

2023年08月19日 11:23:19 JST - 4 minute read - Linux

CloudFlare Tunnelで自宅サーバーを公開する

Cloudflare Tunnelで自宅サーバーを公開する(FreeプランOK)というのがあったのでやってみた。詳しくは、この記事を見てもらえれば良い。

やる前はそれほどメリットあるのかな?と思っていたが、今は以下のメリットからやって良かったと思ってる。

  • 自宅サーバーに同じアドレスでLANからもWANからも繋げられる
  • 証明書更新の手間がない
  • DDNS(Dynamic DNSサービス)の更新がない
  • IPv6 DS-Liteのためルータがポートフォーワード出来なくても自宅サーバーに繋げられる

Cloudflare Tunnelやりかた

Via the dashboard · Cloudflare Zero Trust docs

  1. ウェブサイトのセキュリティとパフォーマンス改善 | Cloudflareでアカウントを作成。

  2. ドメイン登録する1

    .ukusが意外と安い。既に持っているなら、購入する必要はない。JCBのカードで支払おうとしたら、何故か上手くいかなかったので、PayPalで支払いした。

    Cloudflare Zero Trust
    Cloudflare Zero Trust

  3. Cloudflare Zero Trustサービスの利用を開始する。

    1. アカウントの選択

      Cloudflare Zero Trust
    2. チーム名(チームドメイン)を入力(例:arimasou16.cloudflareaccess.com)

      Cloudflare Zero Trust
    3. 料金プランの選択(FreeでOK)

  4. Zero TrustダッシュボードのサイドバーからAccess -> Tunnelsをクリックして、トンネルを作成する

    Cloudflare Tunnel
    1. トンネル名を入力

      Cloudflare Tunnel
    2. Cloudflare TunnelクライアントcloudflaredをインストールするOS、アーキテクチャーを選択する

    3. インストールのためのコマンドが表示されるので、それを自宅サーバーの端末で叩く

      Cloudflare Tunnel
    $ curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
      0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
    100 16.6M  100 16.6M    0     0  8645k      0  0:00:01  0:00:01 --:--:-- 27.1M
    $ sudo dpkg -i cloudflared.deb
    [sudo] arimasou16 のパスワード: 
    以前に未選択のパッケージ cloudflared を選択しています。
    (データベースを読み込んでいます ... 現在 164724 個のファイルとディレクトリがインストールされています。)
    cloudflared.deb を展開する準備をしています ...
    cloudflared (2023.7.3) を展開しています...
    cloudflared (2023.7.3) を設定しています ...
    man-db (2.10.2-1) のトリガを処理しています ...
    $ sudo cloudflared service install 1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX
    2023-07-28T00:15:13Z INF Using Systemd
    2023-07-28T00:15:16Z INF Linux service for cloudflared installed successfully
    
    Cloudflare Tunnel
  5. 作成したトンネルのPublic Hostname Pageでサブドメインやパス、タイプ、URLを入力する。1

    Subdomain Domain Path Type URL
    app 選択(sample.com) 空欄 http 192.168.0.2
    Cloudflare Tunnel

    httpにするとSSL暗号化通信出来ないんじゃないかと思うが、https://app.sample.comとSSLでアクセスすれば、ちゃんとSSL通信出来る。本当はhttps(だけ)にする方法があるだろうが、面倒そうなのでやってない2

  6. nginxの設定ファイルをhttpで編集し直して、再起動。

    -    listen 443 ssl default_server;
    -    listen [::]:443 ssl default_server;
    +    listen 80 default_server;
    +    listen [::]:80 default_server;
    ・・・省略・・・
    -    ssl_certificate /etc/lessl_certificatetsencrypt/live/ddns.sample.com/fullchain.pem;
    -    ssl_certificate_key /etc/letsencrypt/live/ddns.sample.com/privkey.pem;
    
  7. 自宅サーバーにアクセスしているアプリの設定を変更する。

    nextcloudサーバー

    /var/www/nextcloud/config/config.php

      'trusted_domains' => 
      array (
    -    0 => 'ddns.sample.com',
    +    0 => 'app.sample.com',
      ),
    ・・・省略・・・
    -  'overwrite.cli.url' => 'https://ddns.sample.com/nextcloud',
    +  'overwrite.cli.url' => 'https://app.sample.com/nextcloud',
    

    ただし、.well-knownの警告が出てしまうようになってしまった。設定は何も変えてないのだが、http側の設定にしたせいなんだろうか?解決法が分からないので放置している。

    nextcloudクライアント

    ~/.config/nextcloud/nextcloud.cfg

    -0\url=https://ddns.sample.com/nextcloud
    +0\url=https://app.sample.com/nextcloud
    

    joplin

    .env

    -APP_BASE_URL=https://ddns.sample.com/joplin
    +APP_BASE_URL=https://app.sample.com/joplin
    

CloudFlare Tunnel導入前、Androidのアプリなどで、ポート開放・ポートフォーワードをしているのに、WANから接続出来ない事象が発生していた。Firefoxなどでアクセスすると、ちゃんと繋がるので、アプリの問題かnginxの設定か何かかと思っていた。

しかし、今思えば、自宅サーバーにLANからドメインで接続出来るようにunboundを導入していたので、ddns.sample.com192.168.0.2にDNSキャッシュされてしまっていたのではないか?ちゃんと検証してないが、そんな気がしている。


  1. 作成前warning no dns record found for this domain. the policy may not execute as expected.という警告が出てたが、作成して時間が経てば消えた。 ↩︎ ↩︎

  2. Tunnel not working on HTTPs and onyl working on HTTP - Zero Trust / Cloudflare Tunnel - Cloudflare Communityという質問と答えがある。 ↩︎