Try   HackMD
tags: Blog Cloudflare portainer

private CaaSをつくる

こちらは大阪工業大学アドベントカレンダー2023の2枚目14日目の記事です。
どうもSiberiy4(twitter,bsky)です。

今回できるものは、ポート開放しなくてもできるVPNです。

動機

自宅マシンのリソースを他人に貸し出したい。
ただし、サーバーそのまま触らせるのはちょっと嫌かもなー
=>アクセス制御つきContainer as a Serviceがあれば便利じゃないか?

使うもの

  • Cloudflare Tunnel + Cloudflare Access
    アクセス制御付きVPN
    PCやサーバーにソフトをインストールし設定すれば、ポート開放などルーターの設定をいじらずにインターネットから自宅PCにアクセスできる。
    IPアドレスによるアクセス制御、メールでのユーザー認証にGitHub認証なども使える。
    多分ドメイン名が必要(.netだと年1000円ぐらい)

    • 使える認証一覧
      Image Not Showing Possible Reasons
      • The image was uploaded to a note which you don't have access to
      • The note which the image was originally uploaded to has been deleted
      Learn More →
  • portainer
    Docker・Docker Swarm・K8sをWebから操作できるダッシュボード

portainer構築

まず、VPN越しに利用したいダッシュボードの構築をします。
自宅のマシンにDocker(仮想環境を作るやつ)とportainer(仮想環境をブラウザで操作できるようにするソフト)をいれます。
portainerはDocker composeを使って起動します。

Docker install

今回はRocky Linuxを利用したので以下のコマンドでDockerを入れる。

 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
 sudo systemctl --now enable docker

Ubuntuなどは


curl https://get.docker.com | sudo sh
# たぶん sudo systemctl --now enable docker

でインストール可能のはず

portainerの実行

portainerはDockerイメージが配布されているので、それを利用する。
公式ドキュメントにdockerコマンドによるデプロイがありますが、今回はdocker composeを使ったものがあったのでこちらのcompose.yamlを利用しました。

version: "3" services: portainer: image: portainer/portainer-ce:latest ports: - 9443:9443 volumes: - data:/data - /var/run/docker.sock:/var/run/docker.sock restart: unless-stopped volumes: data:

あとは実行するだけ

sudo docker compose up -d

適当にhttps://localohost:9443,http://localhost::9000にアクセスすると、アカウント作成画面がでてきて、Adminユーザーのパスワード設定ができる。

そうすれば、以下のように管理画面が出てくるので構築完了です。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

portainerの使い方

portainerではコンテナイメージを普通のDockerと同じように、Dockerfileを用意してビルドもしくはDockerHubなどのイメージを使用することができます。

Dockerfileから作成する場合はこのようにダッシュボードのエディタ、ファイルのアップロード、URLの指定が選べる。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

cloudflare tunnel/cloudflare access

CloudflareはDNS、CDN、ZeroTrustを提供する会社。
1.1.1.1というパブリックキャッシュDNSサーバーを提供したり、Warpという無料のVPNを提供している。
レジストラでもあるので.netなどのドメイン名を買うこともできる。

使うサービス

ダッシュボードの表示に階層をあわせる

  • Zero Trust
    • Access
      • Tunnels: ローカルを外部にProxy
      • Access Group: ACL、認証認可
      • Application: サービス(指定のサブドメインなど)へのアクセスのかけ方などを設定するか)
    • Settings
      • Authentication: GitHubなどつかいたいIdpの設定

cloudflared のインストール

自宅マシンからCloudflareまでVPNを張るために、cloudflaredというツールをインストールする。

OSごとのインストール方法がここにある

今回はRockyを使っていたので


curl -fsSL https://pkg.cloudflare.com/cloudflared-ascii.repo | sudo tee /etc/yum.repos.d/cloudflared.repo
sudo yum update && sudo yum install cloudflared

インストール方法のページとこちらも参考にした
ただ、LinuxでVPNを常に起動させたい場合systemdのサービスにしたいのでrootユーザーで実行したほうが後が楽です。

cloudflared tunnel login
cloudflared tunnel create <好きなトンネルの名前>
# 今回はportainerで作る
# cloudflared tunnel create portainer

すると、~/.cloudflared/config.ymlが作成される。

中身は以下のようなものができるので

以上となります。

name: <トンネル名>
url: http://localhost:9000
tunnel: <tunnel UUID>
credentials-file: /hoge/.cloudflared/<tunnel UUID>.json


ポートを使いたいものに変えよう。今回は8080を9000に変更した。

上のサイトのようにPathに対してProxyすることもできるっポイ

次に自分が持っているドメイン名のサブドメインにプロキシさせる

cloudflared tunnel route dns <TunnelID> <使いたいサブドメイン名>
# トンネル名か設定した名前でトンネルを起動できる
cloudflared tunnel run <UUID or NAME>
# もしくは
cloudflared tunnel --config ~/.cloudflared/config.yaml run

ただし、上記では常時起動できないので

 service install
# sudo cloudflared --config ~/.cloudflared/config.yml service install
# のようにオプションでコンフィグファイルの位置を指定できる

これまでのコマンドでCloudflareと自宅マシンがVPNを張ってくれる。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Zeto Trust > Access > TunnelsでStatusがHealthyであればOK

追加で参考にした

手元端末からCloudflareまでの接続

Zero TrustのAccess Groupで許可したい範囲を指定できる。 例えばGitHub Orgとか

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

GitHub orgなどを使いたい場合は、Zero TrustのSettings> Authentication >Login methodsから自分のアカウントをOAuth認証して使うっぽい。
GitHub Orgを使いたい場合、追加時に使いたいOrgと連携ボタンを押すのを忘れずに。

次にAccessのapplicationで、自分のドメイン名(公開しているアプリ、今回VPNでインターネットに公開したいもの)にたいして 先ほどのAccess Groupを適応してあげれば完了。

ログインしてみる

作成したドメインにアクセスすると設定したGitHub認証が表示される。
image
アカウントを認証すると、無事にportainerの画面が表示される。

image

まとめ

これを応用したら、簡単に自宅にSSHできたりマインクラフトサーバーを身内に公開できそう。