IPv6のカオスもOK!Cloudflare TunnelでNASを外から楽々アクセス
Cloudflare Tunnelについてめっちゃ語る
日本のIPv6環境って、いまだに「ベンダー独自の仕様がゴチャゴチャで、ルーターの設定見ても一体どこに手をつければ……?」みたいな状態ですよね。しかもISPによってはデュアルスタックだったり、IPv6しか割り当てられなかったり、はたまたDS-LiteだのMAP-Eだの、もうハマる人はハマるし、何をどう調べたらいいのか途方に暮れちゃうこともしばしば。
でも「外からNASにアクセスしたいけど、ポート開放したくないし、そもそもルーターのNATの設定が難しい……」みたいなときにかなり使えるのが Cloudflare Tunnel ってやつです。昔は「Argo Tunnel」って呼ばれてたんですけど、要するに「LANの中にトンネル用のコネクタみたいなのを立ち上げて、そのコネクタからCloudflareのネットワークに安全にトンネルを張っちゃおう」という仕組み。
ポート開放しなくても外部アクセスできる
本来なら自宅のルーターで「外部のポート80・443を内側のNASに転送して……」とか設定するじゃないですか。しかもIPv6だと、プロバイダ側が勝手にフィルタリングかけてることもあるし、場合によってはそもそもグローバルIPv6アドレスに直接アクセスできないケースも。
Cloudflare Tunnelを使うと、LAN側(NASがあるネットワーク)からCloudflare側に アウトバウンド通信だけ でトンネルを張るんですよ。ルーターの外に向けて、NAS自身が「Cloudflareさん、俺をここから外に出して~」って感じで接続を作るイメージ。
外からのアクセスは、一度Cloudflareのネットワークに行って、そこから既に張られている安全なトンネル越しにNASへ到達する。だから「ポート開放」という概念自体が不要で、ポート全閉じでもアクセスできる ってわけです。ルーターの構成がどんなに混沌としていようが、これが成立しちゃう。
+----------------------+
| External Network |
| (Laptop, Smartphone)|
+----------+----------+
|
| (Internet)
|
+----------v----------+
| Cloudflare Service |
+----------+----------+
|
(Encrypted Tunnel)
|
+--------------------v--------------------+
| Home Router (LAN Gateway) |
+--------------------+--------------------+
|
+----------v----------+
| NAS (Cloudflare |
| Tunnel) |
+----------+----------+
|
+----------v----------+
| Local Devices (PC, |
| Smartphone) |
+--------------------+
構成はこんな感じです
セキュリティ面もバッチリ
「ポート開放なしで外部アクセスできる」って、なんだかすごく危ない雰囲気も漂いますけど、実は逆でかなり安全 です。
なぜかっていうと、基本的にルーターの外から直接NASに向けてコネクションを張る経路が一切ないし、Cloudflare側もZero Trust的なコンセプトでトンネルを管理してるんですよ。
さらにSSL/TLS通信を挟むので、中間者攻撃を防ぎやすいです。外部からNASを見に行こうとしても、いきなりNASのIPを叩くのではなく、必ずCloudflare経由になります。しかも、トンネルへのアクセス自体にログイン認証やアクセス制御を付与できる。例えば「自分のGoogleアカウントで認証済みの人しか入れない」とか、「会社のSSOと連携してセキュリティを強化する」とか、いろいろアレンジ可能。
個人的に「もうポート開放してアクセスする時代じゃないよなあ」と思わされるぐらい、しっかり作り込まれてるなと感じます。
セットアップ手順も意外とカンタン
Cloudflare Tunnelを使うには、まずCloudflareのアカウントを作って「Zero Trust」セクションでトンネルを作るところから始まります。で、トンネルを作成したら、そのトンネルを動かすためのエージェントソフトウェア(cloudflared)をNASか、もしくはNASと同じLAN内のマシンに導入すればOK。SynologyのNASの場合はDockerコンテナで cloudflared
を起動して常駐させておけば、あっさり動きます。
Docker環境がない人は、PCやRaspberry Piなんかにcloudflared入れてもいいわけです。要はLAN内で動く何かしらのホストがトンネルを張ってくれればいい。昔はコンソール操作も多かったけど、今はGUIでポチポチ設定できる部分も増えました。
IPv6のカオスでも問題なし
冒頭でも触れたように、日本のIPv6はベンダー依存が強くて「結局ちゃんとグローバルに出せるのこれ?」という疑問が絶えないんですが、Cloudflare Tunnelを使うとそういう細かいところをほとんど意識しなくて良くなります。
NASが外に向けてさえ通信できれば(つまり普通にウェブアクセスできれば)トンネルが張れるので、結果的にIPv4だろうがIPv6だろうが混在してようが、全部クラウド側の転送ルールでやり取りしてくれる。「うわ、ISPがDS-Liteしかサポートしてない……」みたいな環境でも、問題なく外部からNASに繋げるんですよ。
高度な機能もてんこ盛り
Cloudflare Tunnelは単なるトンネル機能だけじゃなくて、アクセス制御(Zero Trust Access)やWAF(Web Application Firewall)の機能とも連携できます。
たとえば、自宅NASの管理画面や特定のウェブアプリに対して「特定のメールアドレスドメインを持つユーザーしかアクセスさせない」とか、「SNSログイン使って2段階認証強制」みたいなガッチリめの対策もできる。
本格的に使うならCloudflareのZero Trustダッシュボードを覗いてみると、そこに「Access」とか「Gateway」といったセクションがあるんで、あれこれ試してみると面白いかと。
まとめると
- IPv6がカオスでも、ポート開放がなくても外部接続できる
- セキュリティが高く、アクセス制御も柔軟
- Dockerなどを使えば導入も比較的簡単
- Cloudflare Zero Trustの高度機能も使える
こんな感じで「オレ、NASを外からいじりたいけどポート開放はしたくないし、IPv6とかもうゴチャゴチャ分かんねえ!」って方には、まさに救世主みたいな仕組みがCloudflare Tunnelなんですよね。もちろん細かい注意点や設定上の工夫はあるけど、ネットで「NASに外からアクセスしよう!」って検索して出てくる古いポート開放情報とは、ちょっと次元が違うアプローチ。
最近のNASは割とこのあたりの機能を内蔵してたり、公式ドキュメントでVPN設定を推奨してたりと手法は多岐にわたりますが、個人的には「いちばん手間が少なくてセキュリティも高いのってCloudflare経由じゃね?」と思ってます。何かとハマりがちなIPv6環境でもスイスイ動くのが最高に嬉しい。いっぺん試してみると、「あ、もう昔ながらのポート開放には戻れないな……」ってなること請け合いです。
Cloudflare Tunnelを使って外出先でも自宅のNASにSMBで接続する
Tunnelを使えるようにする。
基本的にはCloudflareが用意してくれているドキュメントに書かれたインストラクションに従っていけば問題ありません。

ルーターの設定
まずはルーターの管理画面にログインします。
何をするかですが、ルーターにはDHCPといい、接続されている危機にIPアドレスを振る機能があります。これはIPv4での仕様でして、IPアドレスの枯渇を避けるために利用されています(そもそもLANという概念自体IPアドレスの枯渇を避けるために利用されています)。問題はローカルIPアドレスすら枯渇することがあるため、ルーターはそういった事態を避けるためにそれぞれの接続デバイスに割り振っているIPアドレスを適宜変更します。一般的なモバイル端末では問題になりませんが、プリンターやIoTなど一部の機器ではローカルデバイスからのアクセスがあることを前提に動くものがあり、IPアドレスの変更は住所変更により不届きになってしまうわけです。
そうならないようにするために、MACアドレスなどを利用してIPアドレスを紐づけ、固定することが必要です。これは一般的なルーターでしたらどのルーターにもある機能です。
これは各ルーターのメーカーによって設定画面が異なるため、統一した説明をするのが難しいのが現実です。
今回はNASのIPアドレスを192.168.0.50に固定したとします。今後はこのアドレスをNASのIPアドレスと呼びます。
Cloudflareのセットアップ
Zero TrustとTunnelの出口を設定する
CloudflareのZero Trust管理画面にログインします。
初回利用時は個人で無料プランであってもOrganizationと同じように支払い方法などの選択が必要です。噂によれば個人のクレジットカードではうまくいかないようで法人名義が必要だそうです。しかし!!!PayPalを使えば個人名義のクレジットカードでも引き落としに登録できます。ということで、PayPalを使ったことのない人は、海外決済に便利ですしこの際に作ってしまいましょう。

管理画面には入れたら「ネットワーク」から「Tunnel」に入り新規トンネルを作成します。トンネル種類はcloudflaredを選択し、トンネルにmy-nasとか適当に名前を付けておきましょう。
その後、「Public Hostnames」タブで、使用するドメインをドロップダウンメニューから選択し、任意のサブドメイン(例えばsmb.example.com
)を指定します。次に、サービスの種類としてTCPを選択し、SMBがリッスンするポートを入力します。
通常、SMBはポート445で動作しているため、localhost:445
と設定します。設定が完了したら「Save hostname」をクリックして保存します。さらに、より安全に管理するために、Cloudflare Accessを使用してアクセス管理を設定することを推奨します。これにより、不正アクセスを防ぎつつ、安全にSMBサーバーへ接続できるようになります。
コネクタをインストールして実行する画面まで来たら、環境はDockerを選択し、下に表示されるコマンドをコピーします。
docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token <token>
このコマンドをメモ帳とかに貼り付けておきます。
NASで動かすうえではこのコマンドに不要な部分が含まれているため、削除しておきます。削除する部分は冒頭のdocker run cloudflare/cloudflared:latest
の部分です。改良後のコマンドは以下のようになっているはずです。
tunnel --no-autoupdate run --token <token>
NASのセットアップ
NASにTunnelの入り口を設定する
NASにはCloudflareと通信をするためのcloudflaredを実行する必要があります。
cloudflaredはDockerコンテナで提供されており、NAS側ではDockerの実行環境さえ入れればポチっとな、で実行できます。らくちんです。

NASのDocker実行環境はDSM7.2以降からContainer Managerに代わっています。DSMのパッケージセンターからContainer Managerを探し、インストールしてください。

Container Managerがインストールできたら開いてください。
画面左にある「レジストリ」タブを開き、検索ボックスにcloudflare/cloudflared
と入力してください。一番上に出てくるであろうcloudflare/cloudflared
を選択し、ダウンロードしてください。途中タグを選択するよう促されますが、latest
を選択してください(おそらくデフォルトのままで問題ありません)。
ダウンロードが終わると、cloudflaredが「イメージ」に追加されます。画面左側にある「イメージ」タブからcloudflaredを「起動」してください。
イメージを起動すると設定を行う画面が開かれます。以下の部分を変更してください。
- 「全般設定」セクションにある、「自動起動を有効にする」にチェックを入れ、有効化する(これにより、NASが再起動した際も自動的にcloudflaredが起動します)
- 「ネットワーク」セクションにある「同じネットワークをDockerホストとして使う」にチェックを入れ、選択します(これによりlocalhostがNASのIPアドレスを指し示すことになります。すなわち今回の場合、localhost=192.168.0.50となります)
- 「実行コマンド」セクションにある「コマンド」ボックスに先ほどメモしたコマンドから無駄な部分を取り除いたもの(
tunnel --no-autoupdate run --token
)を貼り付けます。(これによりcloudflareとNAS間のアクセスが許可されます)
設定を済ませたらコンテナを実行してください。
実行後にCloudflareのTunnel管理画面を見ると、以下の画面のようにNASとの接続が確立されていることが確認できるはずです。

NASがSMBで利用するポートをローカルアクセスに対して許可する
公式ドキュメントを見ると、SMBでは445ポートが利用されるとあるので、localhostに対して445番ポートを許可するように変更しておく。
Windowsパソコンのセットアップをする
これまでNASとCloudflareの通信が安全になるようやってきた。ここからは手元のパソコンとCloudflareの間の通信を安全になるよう設定していく。
WindowsパソコンにCloudflare WARPを導入し、Cloudflare Zero Trustを有効化する
以下のページからCloudflare WARPの安定リリース版をダウンロードする。

Cloudflare WARPの設定を開き、Zero Trustにログインします。

ログインをするにはCloudflareに登録したチーム名を入力する必要があります。「チーム名なんて覚えてねえよ」となっても慌てないで下さい。世界中の皆さんが同じような悩みを持っていて、Cloudflareのコミュニティに山のように同じ質問が投稿されています(where can i see my cloudflare team nameなどと調べてくればたくさん質問が出てきます)。team nameはCloudflareのダッシュボードにログインし、Settingsから Custom Pagesを開くことで確認することができます。
team nameを確認したからと言ってまだcloudflareの画面を閉じないでください。CloudflareのZero Trustはデフォルトですべてのアクセスをはじく設定になっています。登録すらさせない設定ですので、正しいメールアドレスを登録しているユーザーは通過させるといった許可設定が必要です。ダッシュボードからルールをセットアップする必要があります。ルールをセットアップした後は作成したルールを適用する必要があります。



Cloudflaredをインストールする
windowsボタンを押し、検索ボックスにcmd
と入力し、コマンドプロンプトを開きます。
コマンドプロンプトに以下のコマンドを入力し、実行してください。
winget install --id Cloudflare.cloudflared

SMBプロトコルと競合するWindowsサービスを停止する
WindowsでSMBのポートを指定できない場合、ローカルサーバーを無効にする必要があるかもしれません。クライアントマシン上のローカルサーバーは、CIFS/SMBで使用されるデフォルトのポート445を占有しているため、このポートを使ってCloudflare経由でアクセスしようとすると接続がブロックされてしまうことがあります。
⚠ 注意
Windowsの「Server」サービスは、ファイル共有やプリンター共有、名前付きパイプ通信などのネットワーク機能を提供しています。このサービスを無効にすると、これらの機能が動作しなくなる可能性があるので注意してください。
Windowsでローカルサーバーを無効にする方法
- Win + R を押して「ファイル名を指定して実行」ウィンドウを開く
services.msc
と入力して Enter を押す- 「Server」 というプロセス(または似た名前のもの)を探す
- そのサービスを停止し、「スタートアップの種類」 を 「無効」 に設定
- 「TCP/IP NetBIOS Helper」 についても、同様にサービスを停止して「無効」に設定
これで、ローカルサーバーがSMBのポートを専有するのを防ぎ、Cloudflare経由での接続が可能になるはずです。
Cloudflaredが自動起動するようにする
Windowsで決まったコマンドを実行するにはタスクスケジューラを利用します。
Windowsボタンを押し、検索ボックスに「タスクスケジューラ」と入力し、タスクスケジューラを起動します。

「全般」タブは以下のように設定を変更します。



- 名前:適当に名前を付けます。Windowsではたくさんのタスクがデフォで登録されています。自分のタスクをいじるときに見つけにくいとめっちゃだるいのでわかりやすい名前にしておきましょう。
- 説明:名前を見て何が何だかわからないものにならないよう簡単な説明を書いておきましょう。
- セキュリティオプション:
- 「ユーザーがログオンしているかどうかにかかわらず実行する」にチェックを入れる
- 「バスワードを保存しない」にチェックを入れる
- 「ユーザーがログオンしているかどうかにかかわらず実行する」にチェックを入れる
- 「最上位の特権で実行する」にチェックを入れる
- 表示しない:チェックを入れる
- 構成:Windows 10に変更する
「トリガー」タブで「新規」ボタンをクリックし、新しくトリガーをセットします。

「新規」ボタンをクリックすると、以下のような画面が開き、タスクを実行するトリガーを設定できます。


- タスクの開始:プルダウンから「ログオン時」を選択
「操作」タブで「新規」ボタンをクリックし、タスクで実行する操作を登録します。


以下のコマンドを「プログラム/スクリプト」ボックスに入力してください
cloudflared.exe
「引数の追加」ボックスに以下のコマンドを入力してください。
example.com
の部分はCloudflareで設定した(あなたの)URLに置き換えてくださいaccess tcp --hostname smb.example.com --url localhost:445
なお、公式ドキュメントにはlocalhost:8445
とありますが、これは誤植と思われます。
「条件」タブで条件を設定します。


- 「コンピューターをAC電源で使用している場合のみタスクを開始する」のチェックマークを外し、無効化します。
- 「次のネットワーク接続が使用可能な場合のみタスクを開始する」にチェックを入れ、「任意の接続」になっていることを確認します(ネットワークに接続されていない場合、Cloudflareと通信を確立できませんので、ネットワークに接続されている場合のみ実行されるようにします)。
設定ができたらいったんパソコンを再起動してください。
接続!!!!
長かったですが、最後です。
エクスプローラーを開き、PCの「ネットワークの場所」の何もない部分を右クリックしてコンテキストメニューを開きます。


コンテキストメニューの中にある「ネットワークの場所を追加する」をクリックします。



エクスプローラーの接続先は\localhost\home
などです。デフォルトで生成されるユーザーのディレクトリ名はhome
なので、基本的にはこれで問題ありません。共有フォルダーも追加したい場合は共有フォルダーの名前をDS fileなどから名前を見て後ろに入力すれば問題ありません(例:\localhost\共有フォルダ
)。
認証に利用するユーザー名とパスワードはDSMで作成した各ユーザーのユーザー名とパスワードです(二段階認証はありません)。
めちゃめちゃ長かったですね。
お疲れ様でした。
参考サイト



3/5追記
Cloudflare Zero Trustを有効化している際はDavinci Resolveを開けない・クラッシュする問題
CloudflareのWARPを使っているとなぜかDavinci Resolveがクラッシュする、というか開けない。これは公式フォーラムでも取り上げられているが全く対応されない。
Redditではいろいろ試してくれた先人が解決策を見つけてくれた。
Cloudflare crash on startup fixed by removing panel support
by in davinciresolve
「Cloudflareが起動時にクラッシュする問題は、パネルサポートを削除することで解決しました。
解決方法
Cloudflare Warpや特定のVPNサービス(すべてではない)を使用していて、Resolveが起動時にクラッシュする場合は、Resolveをアンインストールし、DaVinci Control Panelsなしで再インストールしてみてください。
かなり調べた結果、Cloudflareとの問題はパネルの検出に関するもので、DaVinci Control Panelsをインストールしないことで問題が解決しました。
パネルを使用している場合、当然これでは解決になりません。
これはCloudflare Zero TrustをWarpとともに使用している場合に動作しますが、標準の消費者向けWarp製品でも動作するはずです。」
より簡単には下のコメントにあるように、単にDaVinci Control Panelsを削除すれば解決します。
「DaVinciを完全に再インストールする代わりに、設定 > アプリ > インストール済みアプリからDaVinci Control Panelsをアンインストールするだけで問題が解決しました。」
ちなみに、Davinci Control PanelはDavinci Resolveで利用可能な外付けの専用デバイスを利用するために必要なアプリケーションです。