ProxmoxVEでCloudflare Tunnelを使う！

# はじめに
今回、タイトル通り、ProxmoxVEの管理画面をCloudflare Tunnelを、使って外からアクセスできるようにするのが目的です。
普通やりたいなんて人はいないと思いますし、セキュリティ的にもオススメはしません。。。
ただ、興味のあることはやってみたいのと、CloudflareAccessなどを使えば十分実用に耐えそうなのでやってみよう、ということです。
もちろん、素人なのでツッコミどころがあるかもしれないですが、ご指摘等いただけると大変ありがたいです。

# 環境
DL160 Gen9
ProxmoxVE 7.3-6 723bb6ec
Proxmoxは初期設定済みで、ネットワークに接続されていること。
Cloudflareにドメインが設定されていること。

# 目次
・Cloudflaredのインストール
・Cloudflaredの設定
・Cloudflaredの自動起動設定
・まとめ

# Cloudflaredのインストール
まずはProxmoxVEにCloudflaredのインストールを行います。
丁寧に以下に詳しいドキュメントがありますので、基本的にこれに沿ってインストールを行います。

https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/

ProxmoxVEのシェルにログインしインストールします。
```bash
$ wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb && dpkg -i cloudflared-linux-amd64.deb
```
インストールが完了したらCloudflareにログインします。

```bash
$ cloudflared tunnel login
```
入力するとURLが表示されますのでコピペして、ブラウザからログインします。
ログインするとTuunelで使用するドメインを選択する画面が表示されますので、使用したいドメインをクリックします。

```
Leave cloudflared running to download the cert automatically.
You have successfully logged in.
If you wish to copy your credentials to a server, they have been saved to:
/root/.cloudflared/cert.pem
```
成功するとシェルに、「ログインできたぜ、おめーの証明書のここにあるから」と表示されます。


# Cloudflaredの設定
まず、Tunnelの作成を行います。

```bash
$ cloudflared tunnel create <トンネル名>
```

<トンネル名>にトンネルを識別するための名前をつけます。
今回はテストで作成するので「test」と名付けます。

```bash
$ cloudflared tunnel create test
```
少し待つと、トンネルが作成され、トンネルの証明書のパスとUUIDを教えてくれます。
UUIDはConfig作成の際に必要になるのでメモしておいてください。

```bash
Tunnel credentials written to /root/.cloudflared/<ここにUUIDが表示される>.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.

Created tunnel test with id <ここにUUIDが表示される>
```

では、Configを書いていきます。
お好きなエディタを使ってください。

```bash
nano /root/.cloudflared/config.yaml
```
cloudflaredのconfigはyamlで書きます。詳しくは[ここ](https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/local/local-management/)に記載されています。
###### またご存知の方がほとんどかと思いますが、インデントを使用して階層構造で内容を表現します。
つまり、スペースやインデントの入れ方が間違っているとエラーが出ます。もちろんtabも使ってはいけません。(筆者はここでハマった)
では、行きましょう。

```yaml:config.yaml
tunnel: <さっきコピペしたUUID>
credentials-file: /root/.cloudflared/<さっきコピペしたUUID>.json

ingress:
  - hostname: test.example.com
    service: https://localhost:8006/
    originRequest:
      disableChunkedEncoding: true
      noTLSVerify: true
  - service: http_status:404

```

上から解説していきます。
見ての通り、設定するTunnelとその証明書を定義しています。


```yaml:config.yaml
Tunnel: <さっきコピーしたUUID> 
credentials-file: /root/.cloudflared/<さっきコピーしたUUID>.json
```

ingressでは着信した通信をどこに流して、どんな処理をするかを設定します。
hostnameで待ち受けるホスト名(ここではtest.example.comを設定しますが、ご自分の環境に合わせて設定してください。)

serviceで上記のホスト名から来た着信をどこに流すかを設定します。

originRequest内には更に上記のServiceに通信のオプションを加えています。

disableChunkedEncoding はデータをいくつかのチャンクに分けて転送する仕組みでデフォルトでは有効(disableがfalse)なので、ここで有効(true)にします。

noTLSVerify は証明書の検証をするか否かで、こちらもTrueに設定します。
最後のService: http_status:404はすべてのリクエストに対しての返答の設定で、この一行がないとエラーを吐いて動きません。必ず書きましょう。

```yaml:config.yaml
ingress:
  - hostname: test.example.com
    service: https://localhost:8006
    originRequest:
      disableChunkedEncoding: true
      noTLSVerify: true
  - service: http_status:404
```

解説は以上です。ざっくりしていると思うのでもっと詳しく知りたい人はCloudflareのドキュメントを御覧ください。

https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/local/local-management/

Configが書けたのでTunnelを開始していきます、、、の前にDNSのCNAMEの設定をします
```bash
$ cloudflared tunnel route dns <さっきコピーしたUUID> <上記で設定したhostname>
```
正常に追加できたらトンネルを開始します。
```bash
$ cloudflared tunnel run <さっきコピーしたUUID>
```
ログがずらずら～と流れます。hostnameをブラウザに打ち込むとProxmoxのログイン画面が表示されると思います。
これで設定は完了です。

# Cloudflaredの自動起動
設定は完了しましたがこのままだと再起動時に、自動的に起動してくれないので、自動起動してくれるように設定します。
Ctrl-Cで抜け出して、、
Tunnelが自動で立ち上がるように以下のコマンドを入力します。
```bash
cloudflared --config /root/.cloudflared/config.yaml service install
```

cloudflaredが自動で起動するようにsystemctlでenableします。

```bash
systemctl enable cloudflared
```

以上で終わりです。
お疲れ様でした。

# まとめ
初めての記事の作成で見づらいところ、不手際があるかもですが、最後までありがとうございました。
日本語での記事が見当たらなかったので書いてみました。あまり外部に公開したいなんて人はいないと思いますが、お役に立てたらと思います。

次回は、cloudflaredのアンインストールの方法とCloudflareAccessの設定について執筆しようと思っています。