paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

My kickass home labを構築しました

昔Hacker newsか何かでKickass home labという記事を見つけました。 だいぶ昔に記事を書いたのですがこの度やっと環境構築を行いましたので記録しておきます。

構成考え編

Kickass home labとは?

PDFのリンクが切れてしまったようですがyoutubeにプレゼン資料がありました。

www.youtube.com

概要(再掲)

kickassにはやっつける、最高などの意味をもつスラングで使われるようです。

オフリースのサーバは安いけどそれよりも静音サーバを作れたら最高じゃない?ってことらしいです。

サーバは自作で、内容はざっくりまとめると

  • Hyper visor(vmware workstation)ベース
  • 仮想NWも作る
  • ゲストはTURNKEY LINUXでさくっとたてる
  • Windowsも検証ライセンスあるよ

とのことです。

サーバ買って、NW機器買って家でガンガン動かしたい、という思いもありますが置き場やコスト面を考えると仮想環境内で似たことができるなら越したことないですよね。

自宅用に構成をチューニング

自分で作るときはどうしようかなあとずっと考えていたのですが、以下の様にします。

  1. ハードウェア
    • 小型PC
  2. Hyper visor
    • Virtual box
  3. サーバ類

ハードウェア

最近小型のゲーミングPCも出ているくらいだし小型の方がスペースも電気代もかからずいいのでは?と思いこの考えで移行と思いました。
そしてGW入る前に秋葉原のPCコンフルで購入してきました。
NECのMKM27/Cというモデルです。 写真撮ってませんが手のひら2個分くらいで本当に小さいです。
少し昔のモデルですが22000円だったので安い!と思って即購入。
(DPしか付いて無かったので変換ケーブルを買う羽目にはなりましたが)

情報表示メニュー(フリーセレクションフレーム)

Core i5-7500T、メモリ8GB、SSD256GBです。

サーバとして使うには貧弱かもしれませんが、運用してみてから考えましょう。

Hyper visor

買ったPCにはWindows10が入っていますのでわざわざ消さずVirtual boxをインストールすることにしました。
10ProなのでHyper-Vも使えますが、Turn key等(使うかわかりませんが)のovaが入るかわからなかったので避けました。

サーバ類

乗せるサーバですがいったんコンテナメインで作ります。
Guestをボンボンと立てるよりコンテナ集約の方がイマドキぽいじゃないですか。
コンテナ環境はいろいろなPCで散らばって触っていましたのでこの機に集約したいと思います。 システムっぽくクラスタも組んでみたかったのでdocker swarmを作ってみることにしました。 LXDはコンテナの管理がdockerほど簡単でないのと、Kubernetesはマシンリソースが足りなさそうなのと学習コストの面で止めました。

構成図

今の環境を流用しながらですが構成図はこんな感じ。
nwdiagで書いてます。それっぽいシステム構成になりましたね。

外からVPNで入れるようにpfSenseを咬ませてます。
NWエンジニアなのでアプライアンスも触っとかないとね。

構築編

pfSenseインストール

isoが提供されているのでこれもGuestでインストールします。
ウィザードに沿ってOKしていくだけなので割愛します。

wan側インターフェースは最初アクセスを受け付けないので仮解放します。 lan側にGUIアクセスできる端末があれば不要ですが、現時点では置かないからです。

 0) Logout (SSH only)                  9) pfTop
 1) Assign Interfaces                 10) Filter Logs
 2) Set interface(s) IP address       11) Restart webConfigurator
 3) Reset webConfigurator password    12) PHP shell + pfSense tools
 4) Reset to factory defaults         13) Update from console
 5) Reboot system                     14) Disable Secure Shell (sshd)
 6) Halt system                       15) Restore recent configuration
 7) Ping host                         16) Restart PHP-FPM
 8) Shell

Enter an option: 12

Starting the pfSense developer shell....

Welcome to the pfSense developer shell

Type "help" to show common usage scenarios.

Available playback commands:
     changepassword disablecarp disablecarpmaint disabledhcpd disablereferercheck enableallowallwan enablecarp enablecarpmaint enablesshd externalconfiglocator gatewaystatus generateguicert gitsync installpkg listpkg pfanchordrill pftabledrill removepkgconfig removeshaper resetwebgui restartallwan restartdhcpd restartipsec svc uninstallpkg

pfSense shell: playback enableallowallwan

この後11番でWebサーバを再起動すればOK。

アクセス画面。

ルールはこんな感じ。
外からは家のLANに入れないので今はルールガバにしてます。

dockerの構築

使い慣れているUbuntuで作ります。(22.04LTS)
OS、パッケージのインストール系は割愛。
複製して2号機まで作ったのち、docker swarmでクラスタ化します。

  • 1号機側

クラスタ用のIPを指定するとtokenが払い出されます。

masashi@lab-docker1:~$ sudo docker swarm init --advertise-addr 10.254.0.1
Swarm initialized: current node (i06s83zzw3xyfjpvp8fj4jybk) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3d7aoave0c97sr1izd9ewd0uzk9skb6sup4j6o8kd670lvy7vy-7txscqrdxgwwdzrdvwcsya8ho 10.254.0.1:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
  • 2号機側

発行されたtokenを入れればクラスタ参加完了。
楽ですね~。マシンが増えても同じコマンドでどんどん参加できます。

masashi@lab-docker2:~$ sudo docker swarm join --token SWMTKN-1-3d7aoave0c97sr1izd9ewd0uzk9skb6sup4j6o8kd670lvy7vy-7txscqrdxgwwdzrdvwcsya8ho 10.254.0.1:2377
[sudo] password for masashi:
This node joined a swarm as a worker.
  • 再度1号機側

クラスタ組めました!
他の記事等見ると3~4台で組んでいるのが多いですが、ホストのリソースも少ないため2台で使ってみます。

masashi@lab-docker1:~$ sudo docker node ls
ID                            HOSTNAME      STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
i06s83zzw3xyfjpvp8fj4jybk *   lab-docker1   Ready     Active         Leader           23.0.5
0crn1z5vpy219bkt513ccn5mh     lab-docker2   Ready     Active                          23.0.5

docker単体のコマンドは各自打てますが、swarm系のコマンドはmanagerしか受け付けないので基本的に1号機側で操作することになります。

コンテナデプロイ

土台は組めましたがそれだけでは寂しいので管理ツールであるportainerをインストールします。
使ったことはあるのですがswarm上でデプロイするのは初めてです。

公式の手順通りにデプロイします。

masashi@lab-docker1:~$ curl -L https://downloads.portainer.io/ce2-18/portainer-agent-stack.yml -o portainer-agent-stack.yml
masashi@lab-docker1:~$ sudo docker stack deploy -c portainer-agent-stack.yml portainer
Creating network portainer_agent_network
Creating service portainer_portainer
Creating service portainer_agent
masashi@lab-docker1:~$
masashi@lab-docker1:~$ sudo docker service ls
ID             NAME                  MODE         REPLICAS   IMAGE                           PORTS
fyijaxnx2903   portainer_agent       global       0/2        portainer/agent:2.18.2
ddrxmnjz9is4   portainer_portainer   replicated   0/1        portainer/portainer-ce:2.18.2   *:8000->8000/tcp, *:9000->9000/tcp, *:9443->9443/tcp

サービスが上がりました。

masashi@lab-docker1:~$ ss -lnt
State       Recv-Q       Send-Q             Local Address:Port             Peer Address:Port      Process
LISTEN      0            4096               127.0.0.53%lo:53                    0.0.0.0:*
LISTEN      0            128                      0.0.0.0:22                    0.0.0.0:*
LISTEN      0            128                         [::]:22                       [::]:*
LISTEN      0            4096                           *:8000                        *:*
LISTEN      0            4096                           *:9443                        *:*
LISTEN      0            4096                           *:9000                        *:*
LISTEN      0            4096                           *:2377                        *:*
LISTEN      0            4096                           *:7946                        *:*

ポート共有されてますね。OK。

アクセスします。

OKですね。

構成もちゃんと見えます。

まとめ

これでホームラボの土台がいったん作られました。
あとは外からアクセスできるようにVPN環境を作るのと、別マシンで動かしているFireflyやpi-holeを持ってくればOKです。
swarmは独自のコマンドですが、単体時のコマンドとそんなに違わなそうなのですぐに慣れると思います。(yamlも使えるし)

今後は試したいソフトがあればコンテナを立てればいいし、Turnkey Linuxでよさそうなマシンを立ち上げてもOKです。
バージョンアップ等のテスト用の環境も欲しいです。

コンテナ内のNWはdockerが自動で上手いことやってくれていそうですが、もう少し自分で制御して環境やマシンごとに分けられるようにしたいですね。