大学生が自宅環境を作ってみた

はじめまして、大学生(2年)が暇に任せて、環境を作ってみました。

（具体的な構築方法については、各章の最後に）

(2024.07.06 追記)
この投稿からアップデートしたものも、投稿したので、ぜひ見てみてください。

https://qiita.com/karugamosenpai/items/280d91a97583f71dce18


# 0. 環境にもとめること
- **タダ(無料)**
- 賃貸の回線でも外部(大学、カフェなど)から自宅環境にアクセスできる
- 仮想マシンを気軽に作れる
- コンテナの勉強をできる
- ゲームもできる
- ~~話のネタにできる~~
- **セキュリティは大事**

ここらへんをもとに何を使うかを検討した。

# 1. 使用したデバイス一覧
- Windowsのデスクトップ (NICを追加してLANを2本刺さるように)
- Windowsのノートパソコン (大学などからアクセス用)
- RaspberryPi 4 (4GB)
- NAS (Synology DS220j)
- スイッチングハブ (NETGERAR 8ポート)
- APもどき (BuffaloのルーターをAPモードで)
- 適当なドメイン (DNSをCloudflareに移管)


# 2. 環境の概要
**物理構成**

![ネットワーク物理構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/dbd1f6bf-694a-c639-edea-a41b021591d5.png)

**論理構成**

![ネットワーク論理構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/a043c500-7943-06cc-fa04-a9db0fca18bf.png)


これらの図のように、ブラウザでのGUIコンソールはCloudflareを、SSHなどはtailscaleを使用している（理由等は後述）


　
# 2. Cloudflareの構成
Cloudflareは、ざっくりというと、ファイアウォールに穴をあけないで、トンネルとかを使うことで、サイトとかの開放をできるようにする **すごいやつ**やつです。

そして、Cloudflareは、localhostなどのGUIコンソール等をCloudflareのサービスを用いて外部からアクセスできるようにしている。

本来、CloudflareのDNSで外部からアクセスしようすると、ポートの開放、固定IP等の処理が必要になってくるが、賃貸の無料回線では、ルータの設定が一切できないため、ポートの開放等は不可能。
（ポート開放等を不十分な知識のままやるとセキュリティ的に多分よくない。）

ってことで、今回は、CloudflareのZero Trustを使用した。

詳しくは、[本家のサイト](https://www.cloudflare.com/ja-jp/learning/security/glossary/what-is-zero-trust/)を見てください。


また、ZeroTrustをもちいると、以下の画像のようにアクセスに認証を設定することができます。
![ZeroTrustのアクセス画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/0f46c4cb-0a3d-b46d-d5dc-65c942016fe3.png)

<details><summary>Cloudflareの構築方法</summary>
まず、ドメインをどっかで買ってきます。
次に、CloudflareにDNSを移管します。
(ここまでは、Google先生を参照してください。)

いよいよ、Cloudflareのトンネルを張っていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/f405bcf6-150f-bb94-2a3c-692d924e1d7d.png)
この、Create a tunnelのボタンを押して、
適当な名前を設定すると、以下の画像のような画面が出てきます。
そこで、インストールしたいマシンのOSを選択し、黒で塗りつぶされているところに出てくるコードをコピペすると、あっという間にトンネルを張ることができます。
![cloudflare_tunnel make.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/f180928a-9c7d-8dd1-c6b8-6831d45daf9e.jpeg)


そして、トンネルの口を設定していきます。
Public hostnames のところに、
外部からのアクセスで使うURL、
アクセスしたい先のURL、を入力します。
そうすると、自動的にDNSにCNAMEレコードが設定されます（便利）

しかし、このままだと、だれでもアクセスできるので、先ほどの画像のような認証を設定します。

先ほどの画面の、Applicationから、Add an applicationから、Self-hostedを選択します。

Overviewで適当な名前を設定、認証を必要とするURLのsubdomain(任意)、domain、path(任意)をせていします。（また、この時に、subdomainにワイルドカードの * を入れるとすべてのサイトに対して認証が必要になります。）
Policiesで、Create additional rulesなどにE-mailアドレスを入れるなどして、ポリシーを設定してください。
これによって、メールアドレスでの認証ができるようになります。

:::note info
この段階で、tunnelを用いたSSHについても設定することができます。Browser renderingやEnable Binding Cookieなどの設定を変更してください。
自分自身、ちょっと前はこれを使っていましたが、そこまで使い勝手が良くなく、Tailscaleの方が便利でした。
:::

:::note info
認証画面でGoogleアカウントなどの外部の認証を使用したい場合は、
Cloudflare > Zero Trust > Setting から、Add a login methodから、
Googleなどの認証を追加してください。
:::


</details>
















# 3. Tailscaleの構成
Tailscaleは、WireGuardベースで、スマホ・タブレット・パソコンから、NAS、クラウドのVMに至るまで、ファイアウォールとかを気にせずに、幅広いデバイスをメッシュ型のVPNに接続することがプライベートネットワークを構築できる **すごいやつ** です。

詳しくは、[本家サイト](https://tailscale.com/use-cases/homelab)を見てください。

他の面白い使い方は、[Internet WatchのイニシャルBのサイト](https://tailscale.com/use-cases/homelab)を見てみてください。

また、以下のような管理画面にて各デバイスのIPアドレスなどを管理することができます。

![Tailscaleのマシン一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/8d5f098e-0809-8107-579a-ae5f92e87908.png)

個人的にイチオシの機能は、Tailscaleを使うとSSHの鍵管理を任せられることです。
以下の写真のように、マシンの一覧画面からSSHを押してユーザー名を指定するだけで、別ウィンドウでSSH接続を開始することができる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/a48f9b61-3d25-a0dc-8e43-72247c736fb4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/cad4bed6-9bf1-e382-d1a3-2ae33d042d7a.png)



<details><summary>Tailscaleの構築について</summary>

Tailscaleのインストールは、[公式サイトの手順](https://tailscale.com/download) を参考にしてください。

また、SSHを有効にして使用する際は、以下のようにオプションを追加して起動してください。
~~~bash
tailscale up --ssh
~~~~

Exit Nodeとして起動する際は、以下のようにオプションを追加して起動してください。
(Exit Nodeについては、[公式サイト](https://tailscale.com/kb/1103/exit-nodes)を確認してください。)
~~~bash
tailscale up --advertise-exit-node
~~~

また、家の外から家の中のデバイスにアクセスしたりするときには、サブネットルーターを利用してください。その際は、以下のようにオプションを追加して起動してください。サブネットルーターなどについては、[公式サイト](https://tailscale.com/kb/1019/subnets)を参考にしてください。
~~~bash
tailscale up --advertise-routes=192.168.0.0/24,192.168.1.0/24
~~~
:::note info
自分の場合は、OracleのAlways Free(ずっと無料)のインスタンスにTailscaleのExit Nodeを構築して使用しています。（フリーWifiへの対策などで）
これでも実測で20~30Mbps出ており、動画なども十分に楽しめる速度が出ている。
:::

</details>

















# 4. Proxmoxの構成
ProxmoxはDebianベースの仮想化環境を使えるようにしてくれるうえ、**無料** の**すごいやつ**です。

詳しくは、[本家サイト](https://proxmox.com/)を見てください。

最近、自宅サーバ界隈で話題になっていたので、採用してみました。
（[うんちゃまさんのYoutubeチャンネル](http://www.youtube.com/@unchama)で拝見しました。）]

じぶんは、Proxmoxのためだけにマシンを用意できなかったので、デスクトップのHyper-V上にProxmoxを入れてますが、特に問題なく動いています。

<details><summary>Proxmoxの構築について</summary>

構築については、[Nishiの独り言](https://blog.nishi.network/2020/08/12/proxmox-part1/)さんのサイトが非常にわかりやすかったです。
（ありがとうございました。）

:::note info
Hyper-V上で使用する際の注意点
Hyper-Vで使用するときは、VMを作成してisoファイルをマウントして、
PowerShellで、
~~~PowerShell
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
~~~
を実行して、Hyper-VのVMに入れ子を設定(Hyper-Vの仮想マシンで仮想化を有効に)してください。

ネットワークについてですが、マザーボード上のLANポート以外に、NICを刺しLANポートを増設して、NIC側の端子を、Hyper-Vの外部スイッチ(「管理オペレーティングシステムにこのネットワークアダプタの共有を許可する」のチェックを外す)を作成して接続することを強く勧めます。


(2024/10/21追記)
ネットワーク周りについてですが、
MACアドレスのスプーフィングを有効にするために
~~~PowerShell
Get-VMNetworkAdapter -VMName <VMName> | Set-VMNetworkAdapter -MacAddressSpoofing On
~~~
を実行してください。

（GUIでも設定できるみたいです）
Hyper-v上のProxmoxのノードの設定 > ネットワークアダプター > 高度な機能 > MACアドレスのスプーフィングを有効にするをチェック
![Screenshot_2024-10-22_20.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/e2dbf881-492d-5195-6b84-4270d1a0ef6c.png)
![Screenshot_2024-10-22_20.42.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/c0ba11b5-8203-b1b4-cc41-16d825137099.png)




VLANを利用したい場合、仮想ネットワークアダプタを設定しないとVLANのタグが使えないので、
以下コマンドで使いたいVLAN IDを使えるようにします。

~~~PowerShell
Get-VMNetworkAdapter -VMName <VMName> | Set-VMNetworkAdapterVlan -Trunk -AllowedVlanIdList "<使いたいVLAN ID>" -NativeVlanId 0
~~~
これで使いたいVLAN IDのタグがついたまま通信できます。

参考にさせていただいたサイト
[Microsoft ”VMネットワークアダプタVLANの設定”](https://learn.microsoft.com/en-us/powershell/module/hyper-v/set-vmnetworkadaptervlan?view=windowsserver2022-ps)
[farmersentry様 Amebaブログ "Hyper-V内の仮想マシンで、VLANを利用する"](https://ameblo.jp/farmersentry/entry-12849108975.html)
:::

NASとのiSCSIとかも活用していきたいですね...

まだ、がっつり使いこなしていないので、また、すこし使いこなせるようになったら加筆したいと思います。
</details>



# 5. Zabbixの構成と監視
Zabbixが何かについては、書く必要はないだろう。言わずと知れた有名な監視などができる**すごいやつ**です。（自分は、ラズパイにZabbix Serverを配置しています）

<details><summary>Zabbixの構築について</summary>

Zabbixのインストールは、[公式サイト](https://www.zabbix.com/download?zabbix=6.4&os_distribution=ubuntu&os_version=22.04&components=server_frontend_agent&db=)を参照してください。（個人的には、apacheで構成するとアクセスURLが、http://host/zabbix となるためCloudflareのトンネルでそのまま使えないので、Nginxを使用して http://host:8006 などに設定することをお勧めします。）


また、各デバイスにもZabbix agentをインストールしてください。これも[公式サイト](https://www.zabbix.com/download?zabbix=6.4&os_distribution=ubuntu&os_version=22.04&components=agent_2&db=&ws=)を参照してください。

:::note info
Zabbix agentのインストールでは、/etx/zabbix/zabbix_agent2.confを以下を環境に合わせて修正してください。
~~~/etc/zabbix/zabbix_agent2.conf
Server= Zabbix_serverをインストールしたマシンのIPアドレス
ServerActive= Zabbix_serverをインストールしたマシンのIPアドレス
Hostname= 自分のホスト名
~~~
また、このServerなどのIPアドレスは、Tailscaleのアドレスでも全く問題ないです。
:::

</details>

監視自体はZabbixだけでいいのですが、Zabbixより見やすく(かっこよく)見るために、自分がGrafanaをDocker上において、cloudflareのトンネル経由で確認できるようにしています。

<details><summary>Grafanaの構築について</summary>

Docker上なので、[公式サイト](https://grafana.com/docs/grafana/latest/setup-grafana/installation/dock)を参考にサクッと立ててしまってください。

Zabbixでgrafana用のユーザを作成してAPIを設定して、Grafanaのhome > connection からZabbixをデータソースとして追加して、監視データをZabbixから取得しています。

</details>

最後に、暇に任せてかっこよくダッシュボードを作成してください。(画像にはぼかしを入れています)

![grafana.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/68d0eb70-4789-4472-54c9-4509f58fc4e7.png)


</details>

# 6.まとめと今後の展望 
これのほかにも、コンソールが多すぎて管理できないので、DashyをDockerに配置して管理しています。
（Dashy上にGrafanaを埋め込んだりもできます。）

とりあえず、自分の備忘録もかねてQiitaを書いてみました。
読みにくい部分も多いと思いますが、最後まで読んでいただきありがとうございました。

今後は、Proxmoxを本格的に動かしたり、k8sをDockerに入れたり...したいですね。

ミスも多いかと思います。ミスや改善点など見つけてくださった方やアドバイスなどをいただける方は、連絡いただけたらと思います

# 続報(2024.07.06 追記)
この投稿からアップデートしたものも、投稿したので、ぜひ見てみてください。

https://qiita.com/karugamosenpai/items/280d91a97583f71dce18