daahama.dmp

脳みそ.dumpファイルの出力先

Cloudflare Zero Trust Network Access を設定して自宅環境にアクセスする

先日、外出先でのPC操作のために無線の分割キーボードを組んだ。仕事は基本的にリモートなので使うことはあまりないと思っていたが、思いのほか使い心地がよくて気に入ってしまった。自宅で利用してもいいのだがせっかくだから外で使いたい... 多少無理やりにでも外出先で打鍵する機会を増やそう!そうだ自宅環境にリモートでアクセスできるようにしよう!

そう思ってVPNを張ろうと思っていたところ、当たり前のことに気が付く。「固定IPの取得するの面倒だしお金もかかるので嫌だな。ほかに方法はないものか」というわけで調べたり人に聞いたりしてCloudflare Zero Trust Network Accessに行き当たり、サービスを常時稼働させれば無料で利用できるし使ってみよう!となった。

ということで、この記事ではCloudflare ZTNAをセットアップして、外部NWから自宅環境にアクセスするところまでの備忘を記録する。

目次

あらかじめ用意済みのもの

以下のものはすでに調達済みのため、この手順メモの対象外とする。また、今回はIdPにGitHubを利用しているが、その他OktaやAzure AD、Googleアカウントなども利用可能なため、好きなものを用意しておけばOK。

  • Cloudflareのアカウント
  • Cloudflaredを常時実行するためのVM
  • GitHubアカウント(IdPに利用)

構成/作業概要

自宅には検証用サーバとしてPROXMOXが稼働している検証環境用NW(192.168.200.0/24)がある。ここに外部からアクセスできるようにしたい。

検証NWとCloudflareとの構成イメージ
作業内容の概要としては以下の通り。

  1. Cloudflare ZeroTrustのセットアップ
  2. Tunnelの作成
  3. WARPのセットアップ

はじめにCloudflare Zero Trust のサービスの設定を行い、チーム名・料金プランなどを設定する。 次に検証環境上のVMでCloudflaredサービスをインストール・アクティベーションを実施してTunnelを作成する。 最後にWARPでの認証方法・アクセス許可設定などを行う。

Cloudflare Zero Trustのセットアップ

Cloudflareにログインして、左ペインから「Zero Trust」を選択する。 Zero Trustへのアクセスが初回の場合は初めにチーム名を設定することになる。チーム名はクライアントからアクセスする際に入力するパラメータであり、 cloudflareaccess.com でユニークである必要がある。

始めてCloudflare Zero Trustを選択した場合チーム名の入力が必要になる

チーム名を入力したら、Cloudflare Zero Trust のプランを選択する。ユーザが50人未満であればFreeプランで利用できる。24時間のログ保存、レイヤー7フィルタリングまでついてて無料なのは大変ありがたい。

Tunnelの作成

次にTunnelを作成するため、左ペインからネットワークを選択する。 「トンネルを作成する」からTunnelを作成してもいいが、ここでは「クライアントベースのVPNを置き換える」をクリックして設定を進めた。

「クライアントベースのVPNを置き換える」からTunnelを作成する
Tunnelの名前を任意で設定し、IP範囲を設定する。今回は検証環境内をアクセス先にしたいため、192.168.200.0/24 を設定した。

その後Tunnel展開先のOSを選択し、検証環境上のVMにCloudflaredサービスをインストール・アクティベーションする。

ガイドに従ってZTNAサーバの設定と接続デバイスの設定を行う

OSの選択をするとOSに応じたインストールコマンドが表示されるのでそのコマンドをVMで実行し、cloudflaredをインストールする。インストールコマンドと一緒にCloudflareとのTunnel確立のためのコマンドが作られるので、それをコピーしてVMで実行する。

Complete! が出力されればcloudflaredのインストールが完了
(実はこの時Operation aborted の表示を無意識に無視していた。改めてsudo yum install cloudflared を実行して問題なくTunnel確立が完了した)

この後、「デバイスを登録する」にて、なぜか「次へ」がグレーアウトされていて進まなかったため、あとでデバイスを登録しようと「今はスキップ」をクリックした。 すると設定ウィザード全体がスキップされてしまったので、個別でデバイス登録とWARPの設定を完了させる。

この時点で、⇔<検証環境>間のTunnelは作成されているので、あとはWARPを使った認証周りの設定と、WARPがTunnelにアクセスするための認可の設定をしてあげればOK。

WARPの設定

WARP認証方法の登録と紐づけ

まずは、WARPの認証方法としてIdPを追加する。今回はGitHubのアカウントを利用することにした。 「設定」→「認証」の順に遷移し、ログイン方法を新規追加する。 新規追加の方法としてIDプロバイダー一覧が出てくるので、GitHubを選択する。するとセットアップ手順が出てくるので、ガイドの通りにGitHubに情報を入力してアプリIDとクライアントシークレットを取得する。

ログイン方法にGitHubが追加される
アプリIDとクライアントシークレットを入力後、ログイン方法一覧にGitHubが追加されているので、テストをクリックして接続を確認しておく。 これでログイン方法としてGitHubを利用できるようになった。 しかし、この状態では認証にGitHubを使えるだけであり、どこでその認証方式を使うのかが設定されていない。そのため、WARPで利用できるように紐づけ設定をしてあげる必要がある。 「Access」→「ポリシー」→「ポリシーを追加する」からポリシーを作成する。このポリシーにGitHubを使ったログイン方法を適用する。
GitHub認証によるアクセスを許可する
ポリシーを作成するとポリシー一覧から作成したポリシーが参照できる。 最後にこのWARPでのログイン処理に対してこのポリシーを設定してあげる。(この状態ではまだWARPのログイン方法とこのポリシーが紐づいていないので「アプリケーションによる使用」が0となっている)
アプリケーションと紐づいていない状態

「設定」→「WARPクライアント」→「デバイス登録権限:登録」から、「既存のポリシーを選択」をクリック。先ほど登録したGitHubによるログインルールをAccessポリシーとして登録し、保存する。

アクセスポリシーの設定

Tunnelにアクセスできるようにするため、WARPからの通信をCloudflare Gatewayに転送する必要がある。Firewallのプロキシを有効化することによって、ポリシーの適用とGateway への転送ができる。 「設定」→「ネットワーク」の順に遷移し、ファイアウォールの項目からプロキシを有効化する。

なんとなく便利そうなのでICMPを有効化しておく
追記:ICMPを有効にしておくとPingを飛ばしながら設定変更ができるので、うっかり変な設定をしたときに検知できて便利だった。

スプリットトンネルの設定

「設定」→「WARPクライアント」に遷移し、プロファイルの設定からデフォルトのプロファイルを編集する。 デフォルトのポリシーはブラックリスト形式で設定されているため、通信先(検証環境)のIPレンジがブラックリストに載っている場合は削除する必要がある。 デフォルトのポリシーには192.168.0.0/16 が登録されている。そのためデフォルトのプロファイルにあるこの設定を削除してあげる。この設定をすることによって、Tunnelから検証環境(192.168.200.0/24) への通信ができるようになる。

192.168.0.0/16が除外されているのでこの設定を削除する

ここまで実施すればCloudflare側の設定が完了する。 あとはクライアント側にWARPをインストールし、「アカウント」からZero Trust Networkにログインする。ブラウザでGitHub認証が立ち上がるので、GitHubアカウント情報を入力してあげるとCloudflare ZTNAを利用してリモートの検証環境にログインできるようになった✌

ProxmoxでCloud-init を利用してVMを構築する

はじめに

検証のたびに手作業でVMを構築して、ホスト名、IP、SSH鍵、パッケージインストールなどを個別で行うのは辛い。 そんなにがっつり作りこむ必要はないけれど、毎回お決まりの処理くらいはサクッと自動でやってほしいのCloud-initを使ってみることにした。

基本的には公式ドキュメントの例をほぼそのまま実行しているので詳細などについてはそちらを参照してもらうほうがいいかもしれない。 ここでは個人的な対応内容メモやうまくいかなかったところを記録として記載しておく。

また、今回の作業で大いに参考にさせていただいたブログも置いておく。 zaki-hmkc.hatenablog.com

VMテンプレートの作成とCloud-init設定

Cloudイメージの取得と配置

基本的には参考にさせていただいたZakiさんのブログにある通りに作業を進めた。 ただし、ベースとなるCloudイメージはRocky Linuxを使いたかったため、以下のリンク先からイメージを入手した。 wiki.rockylinux.org

入手したCloud イメージをProxmoxサーバに配置するのだが、正直どこに配置すればよいのかよくわからなかった。

GUI上には、ProxmoxサーバのLocal ストレージにISOイメージを配置する箇所があるので、その辺に置かせてくれればいいのだがqcow2 形式のファイルが配置できない。

そのためCLIでProxmoxサーバにログインして、取得してきたCloud イメージファイルを配置してあげる必要がある。共有しているストレージがあればそっちに配置してPROXMOXにmntしてあげてもOK。いずれにしても、PROXMOXサーバにSSHログインをしてテンプレート作成をするのでログイン先から参照できるところに配置してあげればよい。

scp .\Rocky-9-GenericCloud.latest.x86_64.qcow2 root@192.168.200.10:/home

VM作成

PROXMOXサーバにSSHログインをして、qmコマンドを利用してテンプレート元となるVMのセットアップをする。 VMのIDは3ケタ、テンプレートのIDは4ケタにすることにした。ドキュメントのサンプルに習いここでは9000 でVMを作成。

qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci

このコマンドを実行するとGUI上でもVMが作成される。 ただし、この状態ではVMのガワだけ作成した状態なので、このVMに対してダウンロードしたクラウドイメージをセットする。

qm set 9000 --scsi0 local-lvm:0,import-from=/home/Rocky-9-GenericCloud.latest.x86_64.qcow2

import-from の部分がダウンロードしたイメージのパス。 これを実行するとイメージが適用されたディスクがVMにセットされる。

ハードウェア設定の追加

qm set 9000 --ide2 local-lvm:cloudinit

GUI上では、VMの「ハードウェア」からCloud-Initデバイスを追加する操作となる。

その他ブート順序の設定、コンソールの設定などについてはガイドに沿ってそのまま実行する。

qm set 9000 --boot order=scsi0
qm set 9000 --serial0 socket --vga serial0

テンプレートへ変換

以下のコマンドを実行して、ID 9000 のVMをテンプレートに変換する。

qm template 9000

これを実行するとGUI上からもVMがテンプレートに変換されることが見える。 GUIから、テンプレートのCloud-Initを選択すると、GUI上から設定できるパラメータが参照できる。 ここでは、ユーザ作成とそのユーザでログインする際のSSHキーを設定しておく。 また、「パッケージをアップグレード」をYESにしておくと、初回起動時にパッケージを更新してくれる。

VMデプロイとKernel panic

これでこのテンプレートを利用してVMをデプロイすると、Cloud-Initの設定を反映してVMを構築してくれるので、さっそくVMデプロイをしてみた。

停止状態のVMが作成されるため、「ハードウェア」「Cloud-Init」の設定が反映されているかどうかを確認する。

IPアドレスは固定で設定してあげたいので、この段階でCloud-Initに入力しておく。

問題なさそうに見えるので、VMを起動するとboot中にKernel pacnicが発生してbootが止まってしまった。

ここからRocky Linuxのシステム要件を確認してメモリやディスク容量をいじったりしてみたけど、いまいち解消しない。 ただまぁ、「kernel panic not syncing attempted to kill init exitcode=0x00007f00」で調べてみるとHW起因でトラブルが起こっている気がする。

すでにISOで手動構築済みのRocky Linux VMがあったのでそちらのHW設定を参照していると、CPUの種別の設定が違っていた。 テンプレートのCPU種別の設定はデフォルト設定でブランクとなっていたが、先に構築済みのVMでは種別が「x86-64-v2-AES」に設定されていた。

なので、こちらでも種別を「x86-64-v2-AES」に設定してあげると正常に起動してきた。これで問題なさそうだ。

Cloud-Initの設定によりパッケージ更新している様子が確認できる。


ちなみに、後から調べてみるとこの問題はAlma 9やRocky Linux 9で発生する事象らしい。リンク先にあるようにCPU種別を「host」に変更してあげてもbootできたので、そちらに変更しても回避できる問題のようだ。 Rocky LinuxAlma Linux系のコンテナを動かす時も類似の事象が出るようなので、この辺のOSをよく使う人は覚えておくといいかもしれない

forum.proxmox.com

zaki-hmkc.hatenablog.com


さて、起動したVMが事前に設定していたユーザとSSHキーでログインできることも確認できた。 このままだと起動するたびにパッケージ更新がかかるので、それを回避したい場合はCloud-initデバイスを削除しておくことを忘れずに。

ただ、せっかくCloud-initを利用するなら、GUI上で設定できるユーザやIPアドレス、パッケージ更新だけでは物足りないのでもう少しいろいろカスタマイズしていこうと思う。 その場合CLIベースでカスタマイズしていくことになるようなので、もう少し知らべてみたら挑戦してみようと思う。

Proxmox無償版リポジトリ登録とアップデート

以前ESXi サーバをつぶしてProxmoxをインストールしたが、そこで満足して塩漬けにしていた。そろそろ発酵が進みマイルドになったと思うので改めて検証環境のセットアップを開始しようと思う。

前提

物理サーバへのProxmoxインストールはすでに完了しているので省略。

他のブログでも紹介されているようにProxmoxのイメージをダウンロード、isoイメージをUSBに書き込んでインストールした。

今回はproxmoxをアップデートするために無償版リポジトリの登録とアップデート、ストレージのセットアップのメモを残しておく。

無償版リポジトリの登録

デフォルトでは有償版のリポジトリが登録されており、そのままでは無償版Proxmoxのアップデートができないため、無償版リポジトリを登録する必要がある。

実施することは二つ。

CLIGUIのどちらからでも実施できるが、今回はGUIで設定を行った。

有償版リポジトリの無効化

Proxmoxにログインし、Proxmoxサーバの「リポジトリ」を選択。
※ちなみに表示を日本語にする場合は右上のユーザのプルダウンをクリックするとLanguage から日本語を選択できる。

URLに「enterprise」が入っているリポジトリを選択し、「無効」をクリック。画面では以下二つのリポジトリが無効化対象。

https://enterprise.proxmox.com/debian/ceph-quincy

https://enterprise.proxmox.com/debian/pve

これで有償版リポジトリの無効化は完了。

無償版リポジトリの登録

同じ画面から無償版リポジトリを簡単に登録することができる。

「有効/無効」ボタンの隣にある「追加」ボタンをクリックし、「No-Subscription」を選択し、「追加」ボタンをクリックするだけで登録が完了する。

追加後は「pve-no-subscription」と記載された以下のURLが登録されているので確認する。

http://download.proxmox.com/debian/pve

これで無償版リポジトリの登録が完了。Proxmoxのアップデートの準備ができた。

ちなみに、同様の操作はCLIでもできる。ProxmoxサーバにSSHでログインし、リポジトリの File に記載されているパスを参照するとそれぞれのリポジトリの記述などがある。コメントアウトで無効化、既存の記載を真似してリポジトリ追加が可能。

Proxmoxアップデート

アップデート作業の一番面倒で手間がかかるのが、互換性の確認だ。
互換性の確認を怠れば利用している機能や動作に問題が生じ、利用できなくなる可能性がある。あわてて切り戻したりしても、中途半端に戻ってより一層ひどい状況になることだって珍しくない。
そのため、先にリリースノートを確認して影響範囲を把握し、アップデートを取捨選択、さらには作業前にサービスを停止してバックアップを取ることも大事だ。

でも今回はそんなことは気にしない。なぜならずっと塩漬けで利用していなかったサーバなので何も考えずに更新してしまえ。
本当はHWとの互換性くらいは確認したほうがいいかもしれないがまぁ大丈夫だろう。エイヤエイヤ

アップデート作業だけなら簡単だ。
ProxmoxサーバにSSHでログインしてaptコマンドでアップデート・アップグレードを実行するだけだ。

apt update
apt full-upgrade

それぞれエラーなどがなく完了したらProxmoxサーバを再起動してあげれば完了。

ちなみにきちんとバックアップ取ったりする場合はこちらの記事を参考にされるといいかもしれない。

qiita.com

 

これでしばらく塩漬けにしていたHome Laboサーバの準備ができたので、ぼちぼちと検証して遊んでいこうと思う。