asuto.dev

実家にProxmox VEを入れたミニPCを置いた

Date: 2024-12-21

## 経緯

私はつくばで一人暮らしをしているのだが、秋学期から休学中ということもありここ数ヶ月の半分くらいを実家で過ごしていた。つくばの家ではもともとアパートに無料インターネットなるものが存在するため回線を契約しておらず、その回線速度には少々難はあるが、ぎりぎり生活はできていた。
下り34Mbps上り15Mbpsと表示されているつくばの家での有線でのスピードテストの下振れた結果 下り450Mbps上り434Mbpsと表示されているつくばの家での有線でのスピードテストの上振れた結果 通常時はだいたい数十Mbpsしか出ないが、深夜から夜明けの間という私のような人間が精力的に活動する僅かな時間帯なら数百Mbps出るときもある。(もしくは、一番作業が快適な時間に生活するように私が変わってしまったのかもしれない。)
下り292Mbps上り100Mbpsと表示されている実家での無線でのスピードテストの平均的な結果 一方で、実家は有線なら常に1Gbps出るし、上の画像のように無線でも百Mbpsくらい出る。ちょっとpingは高いがそんなゲームをするような環境じゃないし問題はない。
この実家の回線が思った以上に快適であり、特にUbuntuのISOのような大きいファイルのダウンロードがほとんど時間かからずに終わったことに感動してしまい、実家にちょっとしたサーバ置きたいなぁと思ったので、置いた。

## 買ったもの

  • -
    Hitabt Mini PC M30A
    • -
      CPU: N100(4 Core, 4 Thread)
    • -
      Memory: 16GB DDR4
    • -
      Storage: 512G M.2 2242 SATA
Hitabt Mini PC M30Aのケース内部の写真
購入当時、記事執筆時点でも定価19999円で2000円分のクーポンが付いている。この値段で16GB, 512GBは購入当時で調べた中で最安だったため、購入を決定した。

## 目的

今回、実家のネットワーク下で自由にVMやコンテナを生やせるようにしたらなにかと役に立つだろうと思ったので、このサーバには研究室のマシンにも利用しているProxmox VEを入れることにした。
また、今回の実家サーバ導入の目的の一つとして、AdGuard Homeで広告ブロックをDNSレベルでカスタマイズしたいというものがある。以前親がよくある謎のゲームが埋め込まれた広告を広告だと認識できず消すのに苦戦しているのを見て、咄嗟に
94.140.14.1494.140.15.15という数字をWi-FiのDNSってところに入れると幸せになれますよ」
と言って広告ブロックを教えることはできた。しかし、親がやっている無料のパズルゲームなどでは広告を見ることで報酬が得られるらしいので、そういう広告もブロックされてしまうので不満だと述べていた。そこで、public DNSではなく自分でドメイン単位でフィルターをかけることができるAdGuard Homeを導入しようと考えた。

## Proxmox VEのインストール作業

これ以降、今回の作業内容を自分用の備忘録として記録する。historyを見ながら記憶を掘り起こして書いているため、間違った記述や執筆時点から時間が経って古くなった記述が存在する可能性があるので、実際に実行するときは十分に他のソースを参照するよう注意してほしい。

### ISOのダウンロードとディスクへの書き込み

公式サイトよりProxmox VEのISOをダウンロードしてUSBに焼いた。MacOSでやったが、別にLinuxでもいけるはず。WindowsならLufusかRaspberry Pi Imagerでできるはず。
```bash
$ wget https://enterprise.proxmox.com/iso/proxmox-ve_8.3-1.iso
$ sudo dd if=/dev/rdisk4 of=proxmox-ve_8.3-1.iso bs=1M status=progress
```

### OSのインストール

USBメモリを挿してミニPCを起動し、UEFIからUSBを直接Bootし、Proxmox VEのインストーラ画面を起動した。そのままIPやホスト名の設定をしていき、インストールが完了した後に再起動してログインしたらいつものポート8006のWebインタフェースのURLが出てきた。

## Proxmox VEの初期設定

これでインストールが完了したので、これ以降はセットアップした作業内容を記す。

### User

何よりもまず、ずっとrootで作業はしたくないのでUserを作成する。
```bash
# apt install sudo visudo
# adduser asuto153
# visudo
# su asuto153
```

### SSH

次に、/etc/ssh/sshd_configPermitRootLoginPasswordAuthenticationnoを付けて、GitHubから公開鍵を落としてきてSSHできるようにした。
```bash
$ curl https://github.com/asuto15.keys > ~/.ssh/authorized_keys
```

### Network

そして、/etc/network/interfacesをいい感じに書いてVM用のネットワークを生やした。参考にする場合、各アドレスは適宜読み替えてほしい。
```/etc/network/interfaces
auto lo
iface lo inet loopback

// 物理NIC
iface enp2s0 inet manual

// ホスト用ネットワーク
auto vmbr0
iface vmbr0 inet static
	address 192.168.1.100 // ホストのアドレス
	gateway 192.168.1.1 // ルータのアドレス
	bridge-ports enp2s0
	bridge-stp off
	bridge-fd 0

// VM用ネットワーク
auto vmbr1
iface vmbr1 inet static
        address 192.168.2.0/24 // VM用ネットワークの範囲
	bridge-ports none
	bridge-stp off
	bridge-fd 0

	post-up   echo 1 > /proc/sys/net/ipv4/ip_forward
	post-up   iptables -t nat -A POSTROUTING -s '192.168.2.0/24' -o vmbr0 -j MASQUERADE
	post-down iptables -t nat -D POSTROUTING -s '192.168.2.0/24' -o vmbr0 -j MASQUERADE
	post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1
	post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1

// Wi-Fiモジュールは今回設定していない
iface wlp1s0 inet manual

source /etc/network/interfaces.d/*
```
```bash
$ sudo systemctl restart networking
```

### Firewall

iptablesでとりあえずINPUT, FORWARD chainはデフォルトでDROPした。VM周りの通信やssh, http, https, dnsなど適宜必要なもののみを通すよう設定した。また、ルータから見てサーバのNICから異なるMACアドレスの通信が出てくると通信が止められてしまうので、NATをかける必要がある。

### Tailscale

tailscaleを入れて、Tailnet内のマシンからならSSHできるようになった。ここまでの作業によって、最低限リモートからVMを生やせるようになった。
```bash
$ curl -fsSL https://tailscale.com/install.sh | sh
$ sudo tailscale up --ssh
```

### HTTPS

tailscale certを利用してTailnet内のホスト名に対してLet's Encryptで証明書を発行する。これにより、ブラウザから警告されずにポート8006でHTTPS通信ができるようになった。
```bash
$ sudo tailscale cert $(hostname)
$ sudo mv $(hostname).key /etc/pve/local/pve-ssl.key
$ sudo mv $(hostname).crt /etc/pve/local/pve-ssl.pem
$ sudo systemctl restart pveproxy
```

### Nginx

デフォルトのポート8006で通信するのは渋いので、nginxを利用することでそれぞれHTTPS, HTTPを443, 80番にフォワーディングするようにした。

### DHCPサーバ

VM用ネットワークでDHCPを動かしたいのでdnsmasqを用いて振ってほしいIPアドレスの範囲を指定する。
```bash
$ sudo apt install dnsmasq
$ sudo vim /etc/dnsmasq.conf
$ sudo systemctl restart dnsmasq
$ sudo systemctl enable dnsmasq
```
```/etc/dnsmasq.conf
bind-interfaces
interface=vmbr1
dhcp-range=192.168.2.2,192.168.2.100,12h // 振ってほしいアドレスの範囲
dhcp-option=3,192.168.2.1 // DHCPを動かすアドレス
dhcp-option=6,192.168.1.1 // DNSサーバのアドレス
```

## AdGuard Homeを利用したDNSサーバ

### AdGuard Homeの導入

先ほどまでの作業でVMを作成してそれ用のネットワークで通信できるようになった。 そこで、Ubuntu24.04などをVMにインストールして、以下のコマンドでAdGuard Homeをインストールした。
```bash
curl -sSL https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh -s -- -v
```
アカウントの初期設定を行なって、上流となるDNSサーバやフィルタ周りの設定を行なって、ProxmoxホストへのDNSリクエストをこのVMに流すようにしたら正常に動作するはずである。一応pingdigコマンドなどでインターネットへの通信や名前解決を確認しておく。正常に動作したら完成。

## 完成

早速完成したので、出来立てホクホクのサーバを使ってカスタマイズするよう親に言ったら
「あ〜あの話(広告ブロックしたくない場合があること)ね、あれWi-Fi切ったらそのまま見れるから特に困ってないよ。」
とのことだった。結局このサーバは今も実家に置いてあるものの、ちょっとでかいファイルを落とすときか、実家のIPが必要なときしか使っていない。まぁ今後VM遊びもするかもしれないし、自由に使えるPCなんてあればあるだけよいものである。今回のオチは「ヒアリングは大事」ということで、この記事は終わりだ。