大学生が自宅環境を作ってアップデートしてみた

# 1. はじめに
以前書いた記事 [大学生が自宅環境を作ってみた](https://qiita.com/karugamosenpai/items/38fc9f3bc44d046f785f) からいろいろと変更したので、備忘録かねて改めて書いてみようと思います。

https://qiita.com/karugamosenpai/items/38fc9f3bc44d046f785f

今回はあまりに内容が増えすぎたので、個別の投稿にしています。

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

### 使用したデバイス一覧
- Windowsのデスクトップ (NICを追加してLANを2本刺さるように)
- Windowsのノートパソコン (大学などからアクセス用)
- RaspberryPi 4 (4GB)
- NAS (Synology DS220j)
- スイッチングハブ (ヤフオクで落としたELECOMの24ポート)
- AP (例のAP ELCOMのWAB-I1750-PS)
- 適当なドメイン (Cloudflareに移管)

# 2. 環境の概要
#### 物理構成 (変更なし)
![ネットワーク物理構成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/ec9bc32e-d35e-8690-b267-970a20add563.png)

#### 論理構成 (若干変更)
![ネットワーク構成_2024_06.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/d9fcff62-9b77-c123-5011-0a7a132e1d3d.png)




# 3. Proxmox
Proxmoxを結構アップデートしたので、アップデートした内容を書いていきたいと思います。

## 3.0 Hyper-V上にProxmoxを建てる方法について
あまり需要がない気がしますが、Hyper-V上にProxmoxノードを建てる上で必要な設定を書いておきます。
基本的なインストール方法については、[Nishiの独り言](https://blog.nishi.network/2020/08/12/proxmox-part1/)さんのサイトが非常にわかりやすかったので、参考にしてみて下さい。

**今回はHyper-V上に構築上で必要な設定を書いておきます。**
### Hyper-Vの入れ子を有効にする(仮想化マシンで仮想化が使えるように...)
~~~PowerShell
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
~~~
### MACアドレスのスプーフィングを有効にする
~~~PowerShell
Get-VMNetworkAdapter -VMName <VMName> | Set-VMNetworkAdapter -MacAddressSpoofing On
~~~
（GUIでもHyper-v上のProxmoxのノードの設定 > ネットワークアダプター > 高度な機能 > MACアドレスのスプーフィングを有効にするをチェックで設定できます。）

### VLANを使う場合
~~~PowerShell
Get-VMNetworkAdapter -VMName <VMName> | Set-VMNetworkAdapterVlan -Trunk -AllowedVlanIdList "<使いたいVLAN ID>" -NativeVlanId 0
~~~
使いたいVLAN IDのタグをつけたまま通信できるようにします。

参考にさせていただいたサイト
[Microsoft "入れ子になった仮想化による仮想マシンでの Hyper-V の実行"](https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/enable-nested-virtualization)
[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)



## 3.1 ストレージ関係
ストレージ関係では、NASをProxmoxに追加しました。

https://qiita.com/karugamosenpai/items/ed6736b1e79392b57499

## 3.2 ネットワーク関係
家のネットワークに影響を与えずに好き放題するために、以下のようにいろいろといじってみました。

https://qiita.com/karugamosenpai/items/d269b52524cb0ceb2658

## 3.3 Cloud-init関係 
VMを毎回作るたびにポチポチするのがめんどくさかったので、Cloud-initを使って簡単に作れるようにしてみました。

https://qiita.com/karugamosenpai/items/7abdccc5a9169bade182

## 3.4 apt-mirror関係
VMが増えすぎてきたし、NASを追加してストレージに余裕が出てきたので、なんとなくApt-mirrorを立ててみました。実際メリットあるかと聞かれると、「まぁ、家に帰ればミラーサーバあるしな」の生ハム原木の話程度しかないと思います。~~まぁ、話のネタになればそれでいいです。~~


https://qiita.com/karugamosenpai/items/ed6736b1e79392b57499#%E8%87%AA%E5%88%86%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%AE%E7%B4%B9%E4%BB%8B%E3%83%9F%E3%83%A9%E3%83%BC%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E7%AB%8B%E3%81%A6%E6%96%B9


# 4.Tailscale
Tailscaleは相変わらずとても便利です。

## インストールの方法
```
curl -fsSL https://tailscale.com/install.sh | sh
```
これだけでインストールできます。
そして
```
tailscale up --ssh
```
とするとログインURLができるので、ログインしたら完了です。
（とても簡単）





## SSH
TailscaleのSSHは、個人的にTailscaleの一番のおすすめポイントです！

SSHの脆弱性などのニュースも話題になっていますが、Tailscale使えばSSHのポートを開けておく必要もないし。結構便利だと思います。


https://blog.qualys.com/vulnerabilities-threat-research/2024/07/01/regresshion-remote-unauthenticated-code-execution-vulnerability-in-openssh-server

そして、何よりSSHの秘密鍵の管理が不要なのが一番うれしいです。普通にPuttyなどで、TailscaleのIPアドレスを入れるだけで勝手にブラウザで認証のサイトが開いてくれます！

また、大学などでSSHがふさがれているネットワークからでもTailscaleのコンソールからSSHできるので、とても楽です。（スマホからでもできます。）


### DNS
AdGuard HomeとMagicDNSを使って広告フリーな感じにしてみました。普通の場合との比較もしているので、ぜひ見てみてください。

https://qiita.com/karugamosenpai/items/a65e0b45b9a9758d7651



### 余談ですが...
iPhoneユーザならAirDropでスマホで撮った写真をiPadなどに送る等できますが、
AndroidユーザがiPadやパソコンに送るのにAirDropが使えなくて、困ったことあると思います。
そんな時にはTaildropを使うととても便利に送受信できるので、ぜひ試してみてください。
(まだアルファ版ですが...)

使い方もとってもシンプルで、共有からTailscaleのアプリを選んで、送り先を選択するだけです。

https://tailscale.com/kb/1106/taildrop







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

本来、外部からアクセスしようすると、ポートの開放、固定IP等が必要になってくるが、賃貸の無料回線では、ポートの開放等が不可能。
（ポート開放等はセキュリティ上できるだけ避けたい）

ってことで、今回もWeb GUI系で、CloudflareのZero Trustを使用した。
（あまり大きく変更してないです。）

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


また、ZeroTrustをもちいると、以下の画像のようにアクセスに認証を設定することができます。
![スクリーンショット 2024-07-01 031229.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/ea6a1d80-54a0-bb52-379d-93a971ebd80d.png)


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

いよいよ、Cloudflareのトンネルを張っていきます。
![スクリーンショット 2024-07-01 031856.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2631217/44dc9515-3fe2-26c2-90aa-9b341762f617.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アカウントやGitHubなどの外部の認証を使用したい場合は、
Cloudflare > Zero Trust > Setting から、Add a login methodから、
Googleなどの認証を追加してください。
:::
</details>

Cloudflareのトンネルを経由してアクセスするとNGINXなどのログのアクセス元のIPがCloudflaredのIPアドレスになる問題を解決するために
```/etc/nginx/conf.d/01_cloudflared.conf
##
# Cloudflared
#

        set_real_ip_from 173.245.48.0/20;
        set_real_ip_from 103.21.244.0/22;
        set_real_ip_from 103.22.200.0/22;
        set_real_ip_from 103.31.4.0/22;
        set_real_ip_from 141.101.64.0/18;
        set_real_ip_from 108.162.192.0/18;
        set_real_ip_from 190.93.240.0/20;
        set_real_ip_from 188.114.96.0/20;
        set_real_ip_from 197.234.240.0/22;
        set_real_ip_from 198.41.128.0/17;
        set_real_ip_from 162.158.0.0/15;
        set_real_ip_from 104.16.0.0/13;
        set_real_ip_from 104.24.0.0/14;
        set_real_ip_from 172.64.0.0/13;
        set_real_ip_from 131.0.72.0/22;
        set_real_ip_from 2400:cb00::/32;
        set_real_ip_from 2606:4700::/32;
        set_real_ip_from 2803:f800::/32;
        set_real_ip_from 2405:b500::/32;
        set_real_ip_from 2405:8100::/32;
        set_real_ip_from 2a06:98c0::/29;
        set_real_ip_from 2c0f:f248::/32;

        set_real_ip_from 127.0.0.1;
        set_real_ip_from ::1;


        real_ip_header CF-Connecting-IP;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-for $remote_addr;

```

といったようなコードを配置するとヘッダー情報にあるアクセス元IPがログなどに表示されるようになる。
set_real_ip_fromのIPアドレスはCloudflareのIPアドレスと、トンネルの出口となっているマシンのIPなどを設定する。
CloudflareのIPアドレス一覧は[CloudflareのHP](https://www.cloudflare.com/ja-jp/ips/)にあるので適宜変更してください。

# 6. 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>

最後に、暇に任せてかっこよくダッシュボードを作成してください。

# まとめと今後の展望
こんな感じにいろいろと前回からアップデートしてみました。

ここには紹介していませんが、ダッシュボードをStreamlitベースに変更したり等ありますが、需要がありそうだったら書きたいと思います。

今後は、Ansibleの導入とかしていきたいですね...

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

最後まで読んでいただき、ありがとうございました。