Cloudflare Zero Trustを利用して外部ネットワークから自宅サーバにSSHする



Cloudflare Zero Trustを利用して、自宅サーバに対して、外部のネットワークからSSHする手順です。


https://developers.cloudflare.com/learning-paths/replace-vpn/get-started/

# 事前準備

あらかじめCloudflareのアカウント作成とZero Trustの有効化を行っておく。

https://dash.cloudflare.com/

# 実装

## 1. Cloudflareでトンネルの作成

はじめにCloudflareでVPNのトンネルを作成する

「Zero Trust」のダッシュボードに移動し、「Network > Tunnels」に遷移する

「Tunnel name」は自分が分かるように任意の名称を入力する。

![create-tunnel-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/02025896-5770-c961-9b2e-943037e414e5.png)

Cloudflareと接続するクライアントをサーバにインストールするためのコマンドが表示される。
このコマンドは後の手順で利用するので控えておく。

![install-client.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/0a4e4299-c8af-b8fd-9215-bab102c78d37.png)

画面右下部の「Next」を選択すると最後にルーティング方法を選択する画面に遷移する。

今回は、自宅サーバーのネットワークに接続するため「Private Network」を選択する。
CIDRは接続する自宅サーバーが所属するネットワークのCIDRを記載する。

![スクリーンショット 2024-11-24 18.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/e7bb2a1e-66d6-dac0-c410-253ca9d5f95d.png)

:::note
CIDRは、接続したい自宅サーバ上で`ip`コマンドを利用することで確認ができる

```sh
ip addr
~~省略~~
1: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 68:1d:ef:25:72:ad brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.150/24 brd 192.168.2.255 scope global noprefixroute eno1 # ここで確認
       valid_lft forever preferred_lft forever
    inet6 fd44:28ec:e1e8:4a97:6a1d:efff:fe25:72ad/64 scope global dynamic noprefixroute
       valid_lft 1664sec preferred_lft 1664sec
    inet6 fe80::6a1d:efff:fe25:72ad/64 scope link noprefixroute

```

:::


## 2. 自宅サーバにCloudflareのクライアントをインストール

自宅サーバーにCloudflareのクライアントをインストールする。

以降の手順はCentOS7にインストールする手順となる。


```shell
sudo yum install yum-utils
sudo yum-config-manager --add-repo https://pkg.cloudflare.com/cloudflared-ascii.repo
sudo yum install cloudflared
```


自宅サーバが他のOSの場合は、以下の公式ドキュメントの該当のOSの章を参照

https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/get-started/create-local-tunnel/



インストールが完了したら、インストールした端末をCloudflareのトンネルに接続する。

Cloudflareの画面の「Network > Tunnels」の「Install and run a connector」よりインストールコマンドを取得し、実行する

```shell
sudo cloudflared service install ${トークン}
```

Systemdを確認しプロセスが正常な状態であることを確認する。

```sh
systemctl status cloudflared

● cloudflared.service - cloudflared
   Loaded: loaded (/etc/systemd/system/cloudflared.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2024-11-24 17:24:58 JST; 45min ago
 Main PID: 741192 (cloudflared)
    Tasks: 8 (limit: 48452)
   Memory: 16.2M
   CGroup: /system.slice/cloudflared.service
   ~~~省略~~~
```

Cloudflaredの自動起動設定も同時に設定されているため、サーバが再起動してた場合も自動でTunnelが再接続される。

「Network > Tunnels」から詳細を確認し「Hostname」の欄に、インストールした端末の自宅サーバーのホスト名が表示されていれば疎通は完了となる。

![スクリーンショット 2024-11-24 18.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/e9106711-592b-52b7-5ee3-7e046ef72f20.png)


### WARP Clientの設定

#### デバイスポリシーの登録

はじめにVPNに接続可能なデバイスポリシーの登録を行う。

「Settings > WARP Client」を選択する。

![スクリーンショット 2024-11-24 18.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/7c270c84-18e7-dba9-7853-67b2d41d31f5.png)

「Device enrollment > Device enrollment permissions」より「Manage」を選択する。

![スクリーンショット 2024-11-24 18.23.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/43ce69a1-5081-06e5-3385-c1f9d2af35d8.png)

「Add a role」を選択する。

![スクリーンショット 2024-11-24 18.23.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/1c91e184-8353-21f0-712e-d16dfcd7e679.png)

ロールを作成する。今回は日本からのアクセスに限定するため、以下のように設定した

- Selector: Country
- Value: Japan

![スクリーンショット 2024-11-24 18.24.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/f4a4fe40-da06-1c97-5894-cae017afa6a6.png)
 
設定が完了したら「Save」をクリックする。こちらでロールの作成は完了となる。

#### Split Tunnelsの設定

デフォルトではZero Trustトンネルの接続の設定で、`192.168.0.0/16`や`10.0.0.0/8`にルーティングがされないように設定されている。

その設定を解除しないとトンネルに接続しても自宅サーバに接続できない。指定した自宅サーバのCIDRだけを除外するように設定する。

「WARP Client > Device settings」より「Default」の設定を選択、３点リーダーより「Configure」をクリックする。

![スクリーンショット 2024-11-24 18.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/10140886-06e6-bdbc-aead-76373a3ff70f.png)

「Split Tunnels」の「Manage」を選択

![スクリーンショット 2024-11-24 18.33.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/c8acd6c3-9323-3e1b-8cbb-84a7f9a96d8e.png)

除外されているIPアドレスの一覧が出てくるので、この中からおうちサーバが属するCIDRを選択し削除する。(添付した画像は`192.168.0.0/16`を削除済み)

![スクリーンショット 2024-11-24 18.33.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/bad03f74-fb86-b876-ffb7-098c8ccf4940.png)
  
ダッシュボード上で実施する作業は完了となる

## 3. WARP Clientの設定

接続元の端末に、自宅サーバに接続するために必要なWARP Client(WARP)をインストールする。

Macの場合、WARPはbrewからもインストールが可能なので以下のコマンドでインストールする。

```sh
brew install --cask cloudflare-warp
```

インストールが完了したら「Preferences > Account」に移動する。
画面赤枠の「Login to Cloudflare Zero Trust」をクリックする。

![login-cloduflare-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/67679ffe-ba7d-6d2d-6af8-3fb161d37236.png)

チーム名の入力が求められる。「Team Name」はZero Trustsを作成したときのチーム名を入力する。
例えば、`XYZ.cloudflare.com`の名前でチームを作成した場合は`XYZ`と入力する

![login-cloduflare-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/760068b7-dc0c-a72f-be8b-f4c5785c9c46.png)

ブラウザが起動し、Cloudflareのログインが実行される。無事ログインができている場合「Zero Trust」が起動し「Connected」と表示される。

![login-cloduflare-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163680/8db99151-b52d-68e1-1c43-2cc40760ef3e.png)


## 4. SSHログイン

WARP Clientを「Connected」にした状態で、外部のネットワークからSSHをすれば自宅サーバに接続が可能となる。

```sh
% ssh ${ユーザ名}@${自宅サーバのIP Address}
Last login: Sun Nov 24 21:50:07 2024 from ${自宅サーバのIP Address}
[${ユーザ名}@${自宅サーバのIP Address} ~]$
```

# 参考

https://zenn.dev/delta/articles/4ec191931eded3#cloudflare-zero-trust%E3%81%AE%E5%B0%8E%E5%85%A5

https://zenn.dev/jumpman0038/articles/c2717fa990d489