Wi-Fi で Proxmox on NixOS をする方法

NixOS on Proxmox の間違いだと思いましたか？......いいえ、NixOS「で」動かします。

## 目的

- Wi-Fi接続でProxmoxを運用する
- ↑のための面倒な設定をすべてNixOSで管理する 

Proxmox側からできる設定がNixOSにより制限されていること除けば、やることは以下の公式ドキュメントの通りです。

https://pve.proxmox.com/wiki/WLAN

:::note warn
Proxmoxの公式ドキュメントにある通り、Proxmoxを無線LANインターフェースで動かすことは推奨されていません。

今回のようにセットアップを工夫することで動かすことはできますが、無線なので通信が不安定という課題は残ります。
:::


## 準備

- 物理マシン
    - 今回はミニPC (GMKtec G3 Plus) を使用しました
- NixOS Configuration
    - 事前にこのPC用の最低限の設定を用意しておくと楽です
    - 宣言的管理のため、ネットワークデーモンには`NetworkManager`ではなく、`systemd-networkd`を使用します

## 普通のNixOSのネットワーク設定

上記の準備のもとNixOSをインストール(当然Windowsは消し飛ば)し、Wi-Fiでインターネットに繋った状態の基本的なNixOSができあがったものとします。この時点のネットワーク設定は以下のようになっています。

```nix
  # usual network settings
  networking.useNetworkd = true;
  networking.networkmanager.enable = false;
  networking.interfaces."wlp1s0" = {
    ipv4.addresses = [{
      address = "192.168.0.100"; # 利便性のため静的IPを要求
      prefixLength = 24;
    }];
  };
  networking.defaultGateway = {
    interface = "wlp1s0";
    address = "192.168.0.1"; # おうちのルーターのアドレス
  };
  networking.nameservers = [ "8.8.8.8" "1.1.1.1" ];
  networking = {
    wireless.enable = true;
    wireless.secretsFile = "/run/secrets/wireless.conf"; # 中身は psk_home=おうちwifiのpassword
    wireless.networks."おうちwifiのssid" = {
      pskRaw = "ext:psk_home";
    };
  };
```

## ブリッジとDHCPサーバーの作成

ブリッジ`br0`を作成し、このブリッジでDHCPサーバーを立てます。`kea`でDHCPサーバーを立ててもいいのですが、`systemd-networkd`だけで立てることができてしまうので、今回はこの方法で設定します。

```nix
  # create bridge for mini dhcp server
  systemd.network.netdevs."br0".netdevConfig = {
    Name = "br0";
    Kind = "bridge";
  };
  systemd.network.networks."00-br0" = {
    matchConfig.Name = "br0";
    networkConfig = {
      Address = "10.42.0.1/24"; # デフォルトゲートウェイになる
      DHCPServer = "yes";
    };
    dhcpServerConfig = {
      PoolOffset = 100; # 適当。割り当てが 10.42.0.100 ~ になる
      PoolSize = 100; # 適当。subnet maskが255.255.255.0なのでデカすぎても意味ない
    };
  };

```

## インタフェースをブリッジに追加

あとはVMやEthernetの接続ポートをブリッジ`br0`のメンバーに追加してあげるだけで、接続先にIPアドレスが振られていきます。

```nix
  # vm taps to br0
  systemd.network.networks."30-tap0" = {
    matchConfig.Name = "tap*"; # VMを立てると tap<vmid>i0 のようなポートが生えて繋ってくる
    networkConfig = { Bridge = "br0"; };
  };

  # enp3s0 to br0 (おまけ: ミニPCから物理配線で繋がった先のデバイスにもルーティングできる)
  systemd.network.networks."20-enp3s0" = {
    matchConfig.Name = "enp3s0";
    networkConfig = { Bridge = "br0"; };
  };
```

## NAT

このままではVM達はインターネットの海には出られないので、NATの設定をしてあげます。このとき、インターネットにつながっている無線LANインターフェースが外側になります。

```nix
  # nat via wlp1s0
  networking.nat = {
    enable = true;
    externalInterface = "wlp1s0";
    internalInterfaces = [ "br0" ];
  };
```

~~本当にこれだけでいいの？お手軽すぎて涙が...~~

## proxmox-nixosの導入

`proxmox-nixos`という、Proxmox on NixOS を実現してくれるプロジェクトがあります。
ありがとうありがとう。

https://github.com/SaumonNet/proxmox-nixos

`flake.nix`の`inputs`に次の行を追加してあげましょう

```nix
    proxmox-nixos.url = "github:SaumonNet/proxmox-nixos";
```

それからNixOSのコンフィグに以下の項目を追加します。

```nix
  nixpkgs.overlays = [
    inputs.proxmox-nixos.overlays."x86_64-linux"
  ];
  services.proxmox-ve = {
    enable = true;
    ipAddress = "192.168.0.100"; # 先ほど固定したミニPCのIPアドレス
  };
```

さて、この状態で`nixos-rebuild`してあげると早速Proxmoxが使えます。

`192.168.0.100:8006`でProxmoxのWEBダッシュボードが開けるはずです(ルートユーザーとしてログインしてあげましょう)。






## Proxmoxからブリッジを作る

本来、Wi-Fi接続ではなく、かつ素のProxmoxを使用している場合、上記設定はいらないんです。proxmox-nixosを使う場合、Proxmoxのダッシュボードでネットワークの設定をいじっても、NixOS側のRead Onlyな領域を書きかえることができないので、NixOS側の設定で整合性を取る必要があるわけですね。

ノードの`Network`→`Create`でブリッジを作成します。このとき、ブリッジ名はNixOS側で先ほど準備してあげた物を入力する必要があります。

![screenshot-20250530-045946.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637844/c01a5db6-f05f-4a10-b397-5d8222b77339.png)

また、有線接続の場合と異なり、CIDRやGatewayはおうちルーターのものではなく、先ほどミニPC内部で組んだものを指定する必要があります。

NixOS側と同じ名前のブリッジを作れていると、`br0`のActiveがYesとなります。

![screenshot-20250530-051232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637844/7bc2cafd-9e70-4265-b76f-5f81d0af0ee5.png)

## VMを作成する

あとは普通のProxmoxと同様に、Ubuntu Serverのisoをアップロードして、Create VMボタンからポチポチして作ることができます。

VMを作ってみて、IPが振ってこなかったりインターネットに繋がらなかったりする場合はどこかしらの設定を間違えている可能性が高いです。 

![screenshot-20250530-055447.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2637844/f97c7d1a-9e4a-44c7-b143-f62a123a1aca.png)

うん、よき。

# おわりに

何か間違ったことを言っていたら指摘していただけると嬉しいです。

なんか、こういう変な構成やってるとますますNixが好きになっちゃうね...///