Blog
Cloudflare
portainer
こちらは大阪工業大学アドベントカレンダー2023の2枚目14日目の記事です。
どうもSiberiy4(twitter,bsky)です。
今回できるものは、ポート開放しなくてもできるVPNです。
自宅マシンのリソースを他人に貸し出したい。
ただし、サーバーそのまま触らせるのはちょっと嫌かもなー
=>アクセス制御つきContainer as a Serviceがあれば便利じゃないか?
Cloudflare Tunnel + Cloudflare Access
アクセス制御付きVPN
PCやサーバーにソフトをインストールし設定すれば、ポート開放などルーターの設定をいじらずにインターネットから自宅PCにアクセスできる。
IPアドレスによるアクセス制御、メールでのユーザー認証にGitHub認証なども使える。
多分ドメイン名が必要(.netだと年1000円ぐらい)
portainer
Docker・Docker Swarm・K8sをWebから操作できるダッシュボード
まず、VPN越しに利用したいダッシュボードの構築をします。
自宅のマシンにDocker(仮想環境を作るやつ)とportainer(仮想環境をブラウザで操作できるようにするソフト)をいれます。
portainerはDocker composeを使って起動します。
今回は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は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ユーザーのパスワード設定ができる。
そうすれば、以下のように管理画面が出てくるので構築完了です。
portainerではコンテナイメージを普通のDockerと同じように、Dockerfileを用意してビルドもしくはDockerHubなどのイメージを使用することができます。
Dockerfileから作成する場合はこのようにダッシュボードのエディタ、ファイルのアップロード、URLの指定が選べる。
CloudflareはDNS、CDN、ZeroTrustを提供する会社。
1.1.1.1というパブリックキャッシュDNSサーバーを提供したり、Warpという無料のVPNを提供している。
レジストラでもあるので.netなどのドメイン名を買うこともできる。
ダッシュボードの表示に階層をあわせる
自宅マシンからCloudflareまでVPNを張るために、cloudflaredというツールをインストールする。
今回は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を張ってくれる。
Zero TrustのAccess Groupで許可したい範囲を指定できる。 例えばGitHub Orgとか
GitHub orgなどを使いたい場合は、Zero TrustのSettings> Authentication >Login methodsから自分のアカウントをOAuth認証して使うっぽい。
GitHub Orgを使いたい場合、追加時に使いたいOrgと連携ボタンを押すのを忘れずに。
次にAccessのapplicationで、自分のドメイン名(公開しているアプリ、今回VPNでインターネットに公開したいもの)にたいして 先ほどのAccess Groupを適応してあげれば完了。
作成したドメインにアクセスすると設定したGitHub認証が表示される。
アカウントを認証すると、無事にportainerの画面が表示される。
これを応用したら、簡単に自宅にSSHできたりマインクラフトサーバーを身内に公開できそう。