作成開始 : 2025年03月09日(日)    最終更新 : 2025年03月22日(土) 
IPoE(DS-Lite)で自宅Webサーバーを公開する。・・・Cloudflare Tunnel
2024年の5月頃、ネットゲームをしている息子から 「ネットもっと速くなんないの!?」と言われ、よく調べもせずに「NTT東日本 フレッツ光クロス(10Gbps)」に変更しました。
プロバイダは、
NTT東日本の取次で「AsahiNet」 にしました。
それまで、
「NTT東日本 フレッツ光ネクスト」と「ぷらら ダイナミックDNS」を使ってIPv4で自宅サーバー(Web、Mail)を公開していました。
しかし、
「AsahiNet」 の「NTT東日本 フレッツ光クロス・コース」では IPv6とIPv4 PPPoEの併用ができないことが分かりました。

VPSもレンタルサーバーもお高いのでコンテンツの公開は諦めました。
20年積み重ねてきたコンテンツと日記がパァになりました。

自宅サーバー時代に人気のあったコンテンツを
「AsahiNet」の「ホームページ・サービス」に移行しましたが、 100MBまで無料ですが、それを超えると5MBごとに 198円/月 の料金がかかります。
CGIも使えないし・・・

もうすっかり諦めていたのですが、何気なく検索していたら「
Cloudflare Zero Trust の Cloudflare Tunnel」を使えば自宅にあるサーバーを公開できることがわかりました。
しかも無料で!!!

Cloudflare の公式サイトは こちら

1.構成概要


Cloudflare から自宅間はTunnel を作って通信します。


これの利点としては・・・・

(1)ルータのポート開放がいらない。
(2)ルータにWebサーバーのIPアドレスを書かなくていい。
(3)CloudflareのDNSサーバにルータのグローバルIPアドレスを覚えさせなくてもよい。
(4)Freeプランが無料で使える。(一部有料あり)

欠点としては・・・
(1)接続元IPアドレスによる制限がwebサーバ側でかけられない
a.IPレイヤではlocalhostからの通信に見える
b.HTTP以後のレイヤであればCf-Connecting-Ipヘッダを読み込み、処理分岐させる事で対 処可能
     WebサーバーのCGIでリモートIPを取得したり、ログでリモートIPを取得する時に使えます。


2.登録・設定の流れ

(1)Cloudflareにアカウントを作成
(2)Zero Trust の登録
(3)Cloudflare Tunnel の設定
(3)ドメイン登録
(4)パブリックホスト名の作成

本当はこうかな!?

(1)Cloudflareにアカウントを作成
(2)ドメイン登録
(3)Cloudflare Tunnel の設定
(4)パブリックホスト名の作成



3.実際の設定
(1)Cloudflareにアカウントを作成

公式サイト https://www.cloudflare.com/ja-jp/ からサインアップします。


    ↑
直後の画面です。


    ↑
「開始する」をクリックします。


    ↑
「人間であることを確認します」にチェックを入れます。


    ↑
Email と Password を入力、「人間であることを確認します」にチェックを入れ「Sign up」をクリックします。

この後、既存のドメイン入力か新しくドメイン作成しますか・・・とか聞いてきますが、ここは一旦ログアウトしてログインすればダッシュ ボード画面になります。
自分はドメイン持っていないのでこの画面でドメイン作成しておけばよかったかな!!
(2)Zero Trust の登録

    ↑
左ペインから「Zero Trust」を選択します。


    ↑
Zero Trustのチーム名(テナントのようなもの)を適当に入力します。「次へ」をクリックします。


    ↑
「Free」を選択


    ↑
「支払いへ進む」をクリックします。


    ↑
「支払い方法を追加する」をクリックします。


    ↑
クレジットカードにしました。
カード番号、有効期限、セキュリティコードを入力し国を日本に選択しました。
請求先住所を入力しました。
アカウントの種類は Personal にしました。
「次へ」をクリックしました。


    ↑
「購入」をクリックします。


    ↑
Zero Trust のダッシュボードを表示します。
(3)Cloudflare Tunnel の設定

ネットワーク > Tunnels に遷移します。

    ↑
「トンネルを追加する」をクリック


    ↑
「Cloudflared」を選択


    ↑
「トンネル名」を適宜入力し「トンネルを保存」します。


    ↑
今回WebサーバーにしようとするPCは「q4os 32bit」なので「Debian」「32bit」を選択します。

Webサーバー Apache + PHP + Perl のインストール・設定は こ こ にあります。

すると「マシンに cloudflared がインストールされていない場合:」の欄にコマンドが記載されますのでそれをコピーしエディタに保存します。
機密トークンが含まれているので大切に保管します。

WebサーバーにしようとするPCにSSHでログインしコマンドを実行します。

[ちょっとハマった]
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-386.deb &&
sudo dpkg -i cloudflared.deb &&
sudo cloudflared service install トークンが入ります。

  % 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  6123k      0  0:00:02  0:00:02 --:--:-- 10.7M
[sudo] takaq のパスワード:
dpkg: アーカイブ cloudflared.deb の処理中にエラーが発生しました (--install):
 パッケージアーキテクチャ (386) がシステム (i386) と一致しません
処理中にエラーが発生しました:
 cloudflared.deb


どうやら、cloudflared.deb のパッケージアーキテクチャが 386、q4os 32bit のパッケージアーキテクチャが i386 なんですね。
諦めかけたのですが、何か策はないか検索
そしたら・・・・

q4osの  マ ルチアーキテクチャを有効化すればいいみたい。

takaq@q4os-ins1300:~$ dpkg --print -architecture
i386
takaq@q4os-ins1300:~$ sudo dpkg --add-architecture 386
takaq@q4os-ins1300:~$ dpkg --print-foreign-architectures
386
takaq@q4os-ins1300:~$ curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-386.deb &&
sudo dpkg -i cloudflared.deb &&
sudo cloudflared service install トークンが入ります。
  % 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  5600k      0  0:00:03  0:00:03 --:--:-- 10.3M
以前に未選択のパッケージ cloudflared:386 を選択しています。
(データベースを読み込んでいます ... 現在 191642 個のファイルとディレクトリがインストールされています。)
cloudflared.deb を展開する準備をしています ...
cloudflared:386 (2025.2.1) を展開しています...
cloudflared:386 (2025.2.1) を設定しています ...
man-db (2.11.2-2) のトリガを処理しています ...
2025-03-12T13:09:36Z INF Using Systemd
2025-03-12T13:09:47Z INF Linux service for cloudflared installed successfully

できたぁー、インストールできましたぁー
この直後からHUBのWebサーバー収容ポート、ルータのACTランプがパカパカ点滅してます。トンネルってこんなだっけ!?

インストール後サービスの起動状態がactive(running)になっていることを確認します。

takaq@q4os-ins1300:~$ systemctl status cloudflared
● cloudflared.service - cloudflared
     Loaded: loaded (/etc/systemd/system/cloudflared.service; enabled; preset: enabled)
     Active: active (running) since Thu 2025-03-13 20:22:16 JST; 2min 51s ago
   Main PID: 622 (cloudflared)
      Tasks: 7 (limit: 4704)
     Memory: 46.0M
        CPU: 2.059s
     CGroup: /system.slice/cloudflared.service
             └─622 /usr/bin/cloudflared --no-autoupdate tunnel run --token ここはトークンが入ります>

 3月 13 20:22:15 q4os-ins1300 cloudflared[622]: 2025-03-13T11:22:15Z INF Starting metrics server on 127.0.0.1:20241/metrics
 3月 13 20:22:15 q4os-ins1300 cloudflared[622]: 2025-03-13T11:22:15Z INF Using [CurveID(4588) CurveID(25497) CurveP256] as curve preferences connIndex=0 event=0 ip=198.41.19>
 3月 13 20:22:16 q4os-ins1300 cloudflared[622]: 2025-03-13T11:22:16Z INF Registered tunnel connection connIndex=0 connection=68fd658f-3323-4f80-bc8b-f8a31e78d6ac event=0 ip=>
 3月 13 20:22:16 q4os-ins1300 cloudflared[622]: 2025-03-13T11:22:16Z INF Using [CurveID(4588) CurveID(25497) CurveP256] as curve preferences connIndex=1 event=0 ip=198.41.20>
 3月 13 20:22:16 q4os-ins1300 systemd[1]: Started cloudflared.service - cloudflared.
 3月 13 20:22:16 q4os-ins1300 cloudflared[622]: 2025-03-13T11:22:16Z INF Registered tunnel connection connIndex=1 connection=44e8a2fb-6631-46d2-ac7d-b52e2516cdc5 event=0 ip=>
 3月 13 20:22:17 q4os-ins1300 cloudflared[622]: 2025-03-13T11:22:17Z INF Using [CurveID(4588) CurveID(25497) CurveP256] as curve preferences connIndex=2 event=0 ip=198.41.19>
 3月 13 20:22:17 q4os-ins1300 cloudflared[622]: 2025-03-13T11:22:17Z INF Registered tunnel connection connIndex=2 connection=9fb92f6f-5743-43b2-a47d-003e923c8cff event=0 ip=>
 3月 13 20:22:18 q4os-ins1300 cloudflared[622]: 2025-03-13T11:22:18Z INF Using [CurveID(4588) CurveID(25497) CurveP256] as curve preferences connIndex=3 event=0 ip=198.41.20>
 3月 13 20:22:18 q4os-ins1300 cloudflared[622]: 2025-03-13T11:22:18Z INF Registered tunnel connection connIndex=3 connection=80321e16-24f0-466c-b3a3-ea8f89112a6d event=0 ip=>

前回、cloudflaredのインストールで手間取ったため、ここまででダッシュボードからログアウトしたので、一連の流れと ちょっと違うかもしれません。

ダッシュボードにログインし、Zero Trust  -> ネットワーク -> Tunnels とたどります。

 
    ↑
右端の選択部分をクリックし「設定」を選択します。


    ↑
右上の「パブリックホスト名」をクリックします。


    ↑
「ハブリックホスト名を追加する」をクリックします。


    ↑
おーっと、ここはドメイン無いといけないかぁー
ここは後にして前に戻って、「プライベートネットワーク」を先にしようか。


    ↑
「プライベートネットワークを追加する」をクリックします。


    ↑
CIDR(例えば・・・10.0.0.0/8 とか)、説明を入力し「プライベートネットワークを保存」をクリックします。


    ↑
右端の点々で編集とか削除できます。

(3)ドメイン登録
Cloudflareのトップ画面から設定します。


    ↑
「ドメイン登録」をクリックします。


    ↑
「ドメインの登録」に遷移します。
「ドメイン名を検索する」に希望のドメインを入力し「検索する」をクリックします。


    ↑
推奨されるドメイン名が表示されます。

.org は、初回購入費用:7.50$、更新料:10.11$ です。
問題なければ「購入」をクリックします。
後で請求メール届きました。8.25$でした。


    ↑
登録者情報を入力します。
そして、最下部の「お支払い」を選択します。

登録者情報は以下の項目を入力する必要があります。

項目 必須かどうか
Yes
苗字 Yes
組織 No
メールアドレス Yes
電話番号 Yes
内線 No
番号 Yes
Yes
住所1 Yes
住所2 No
市町村 Yes
都道府県 Yes
郵便番号 Yes

カードの詳細を入力します。
先に登録した情報を参照できるとありがたいのに、再入力です。
カード情報入力後、カード情報の一番下にある「住所の確認」を押すと以下表示します。

=============================================================================
この購入を完了することにより、当社の利用規約、プライバシー ポリシーおよびドメイン登録契約に同意したことになります。

ドメイン名を含むサブスクリプションは自動的に更新され、キャンセルされるまで、登録 されている支払い方法に請求されます。課金サブスクリプション、またはレジストラのアカウントのドメイン管理ページ から、各更新日の少なくとも 1 日前までいつでもキャンセルできます。

使用量に基づく請求の対象となるサービスについては、Cloudflare が指定する期間中のサービスの使用量に基づいて料金が請求されます。

takaq-mynet.org を登録しようとしています。これが登録したいドメインであることを再確認してください。すべての登録は最終的なもの であり、返金は行われません。
=============================================================================

以上を確認したら「購入完 了」をクリックします。


    ↑
この画面になります。


    ↑
「ドメインの管理」に行くと取得したドメインが表示されます。


    ↑
Cloudflare Registrarでドメインを取得するとDNSSECをワンクリックかつ無料で利用す ることができます。
DNSSEC は、公開された DNS レコードの暗号化署名を使用して、偽造された DNS 回答からドメインを保護します。
有効化しておきましょう。
また、WHOIS privacyの機能によりWHOIS上の個人情報にあたるほとんどの部分は 「REDACTED FOR PRIVACY」と表示されるようになります。
国と、県は表示されてしまうようです。ここは無効にしておきましょう。

では、パブリックホスト名を作成しましょう。
(4)パブリックホスト名の作成
Zero Trust -> ネットワーク -> トンネル名の右端から設定を選択 -> パブリックホスト名を選択 -> 「パブリックホスト名を追加する」をクリック


    ↑
サブドメイン : www (Webサーバーの定番?)
ドメイン : 取得したドメイン名
パス : ドキュメント・ルートにしたいので空白
サービス : HTTP (SSLの方は Cloudflare でやってくれます)
URL : Webサーバーが動いているPCのローカルのIPアドレスを入れてみます。
           cloudflaredが動いているPCであれば localhost でもいいです。
そして「ホスト名を保存する」をクリックします。


    ↑
上のようになります。

takaq@q4os-v200:~$ nslookup
> www.takaq-mynet.org
Server:         192.168.1.2
Address:        192.168.1.2#53

Non-authoritative answer:
Name:   www.takaq-mynet.org
Address: 172.67.195.175
Name:   www.takaq-mynet.org
Address: 104.21.92.161
Name:   www.takaq-mynet.org
Address: 2606:4700:3033::ac43:c3af
Name:   www.takaq-mynet.org
Address: 2606:4700:3033::6815:5ca1

おぉ、返ってきますね。

自宅でも自宅外でも先ほど設定したホスト名で https でアクセスできるようになります。

ちなみに、サブドメインの部分と対応するURLを変えて、このプロセスを繰り返せば、複数のウェブサイトをホストして公開することも できます。



3.Webサーバー側の調整
(1)リモートホストの取得
Cf-Connecting-Ipヘッダによるリモートホストの取得について触れてみま す。
Webサーバーは Apache2 です。

Webサーバー Apache + PHP + Perl のインストール・設定は こ こ にあります。

そのままだと、Cloudflare の IP が取得されます。PHPで書いてます。

<?php
var_dump($_SERVER['REMOTE_ADDR']);
?>



オリジナルの IP アドレスを取得するため remoteip モジュールをロードします。

Apache の config ファイルに RemoteIPHeader CF-Connecting-IP を追加します。
Debian パッケージの場合、/etc/apache2/sites-available/000-default.conf で設定します。

そして・・・
$ sudo service apache2 restart
・・・します。


    ↑
とれましたね。
この時点で Apache のログにもリモートIPが記録されるようになります。
(2)CGIスクリプトからのメール取得について

旧Webサイトでは、CGIスクリプトで管理者へのお便りや、投稿があった時に管理者へメールでお知らせしていまし た。
sendmailを使っていました。

なんか、Cloudflare調べたら方法あるかもしれないですが、スキル不足で「これだ」と思う方法を見つけられませんでした。

今回は、sendmail を Webサーバーへインストールし、ローカルユーザーへ CGIスクリプトから配信し、それを取り出す方法とします。
メールサーバー立てて DNSへSPFとかの条件書いてとかは敷居が高いし、恐らくCloudflare経由で外にメール出すのはできないと思います。

まずは、SSHでログインし、sendmailコマンドでローカルユーザーへ配信できるか見てみます。

takaq@q4os-ins1300:~$ sudo sendmail takaq@q4os-ins1300
TEST
ABCDE
.
takaq@q4os-ins1300:~$ mail
"/var/mail/takaq": 1 message 1 new
>N   1 H T  木  3月 20 16:  13/529  
? q
Held 1 message in /var/mail/takaq

うん、できましたね。
次は、メール取り出しソフトの dovecot-pop3d とメーラーで受信してみます。


    ↑
うん、取り出しできました。

そしたら、次は CGIスクリプトからメール送信してみます。

フォームからメールを出すスクリプトを使ってみます。

スクリプトの実行権(パーミッション)とcgiの実行設定(Ex .htaccess)は適宜行います。
まずは、スクリプト内の以下を設定します。
#!/usr/bin/perl → おまじない。
$sendmail = '/usr/sbin/sendmail';    #sendmailのパスを指定
$admin_name = 'takaq';
$admin_mail = 'takaq@q4os-ins1300';    #送信先アドレスを指定
んで、実際にスクリプトから送信してみたら異常に遅い、遅いのでスクリプトの戻り先がおかしい。
SSHでログインしコマンドから実行してみたらこれも遅い。
さっそく検索
結果 /etc/hosts の以下を変更
# 127.0.0.1    localhost
127.0.0.1    localhost.localdomain localhost q4os-ins1300
127.0.1.1    q4os-ins1300
そして、sendmailを再起動しコマンド実行したら即実行されました。
では、気を取り直してスクリプト実行です。


    ↑
受信できましたね。なんか件名が文字化けしてるけどいいかー


名前
メールアドレス
このページは役に立ちましたか?
役に立っ た
役に立たなかった
コメント

サイトトップへ