Added network management.
This commit is contained in:
@@ -35,14 +35,16 @@
|
||||
| **No flakes** | Simplify onboarding and avoid a steep learning curve. | Configuration via `configuration.nix` + `callPackage`. |
|
||||
| **Modular structure** | Separate configurations by machine type and service. | Clear and maintainable directory tree. |
|
||||
| **Servers named by service, not by application** | Indicate what the machine does (git01 = Git forge) rather than the software (Gitea). Allows changing the underlying app without renaming. | Hosts under `hosts/servers/<service>01` (e.g. `git01`, `pass01`, `dns01`). |
|
||||
| **Modules** | Make modules autonomous, portable, and reusable. | Each module is an independent Nix package. |
|
||||
| **Modules** | Make modules autonomous, portable, and reusable. | Each module is an independent Nix package. |
|
||||
| **Separation of `user-profiles/` and `users/`** | Distinguish generic roles (e.g., `admin`) from concrete users (e.g., `xavier`). | Flexibility to apply profiles to multiple users. |
|
||||
| **`deploy.sh` script** | Automate deployment on existing machines. | Clone/update the repo + `nixos-rebuild switch`. |
|
||||
| **`create-lxc-nixos.sh` script** | Automate the creation of NixOS LXC containers on Proxmox. | Ready-to-use container with initial configuration. |
|
||||
| **Initial configuration (`initial-configuration.nix`)** | Prepare an LXC container so it can update itself via Git. | Self-sufficient containers. |
|
||||
| **Secret management with `agenix`** | Encrypt secrets (passwords, keys) for secure storage. | Enhanced security for sensitive data. |
|
||||
| **Unprivileged LXC containers (`--unprivileged 0`)** | NixOS requires privileges to function correctly in LXC. | Functional containers with NixOS. |
|
||||
| **IPv4, IPv6, VLAN support** | Final target is IPv6-first, or even IPv6-only. | IP plan management to be designed. |
|
||||
| **Centralised network data** | A single declarative network data source (`network/`) consumed by NixOS configs and scripts. | VLANs, subnets, host addresses defined once in `network/hosts.nix`. |
|
||||
| **IPv6-first with dual-stack** | Both ULA (fdb2:) and GUA (2a01:) prefixes defined per VLAN. | Consistent internal addressing + global reachability for DMZ services. |
|
||||
| **DHCP-based IPv4 assignment** | LXC containers use `useDHCP = true`. Addresses are reserved in `hosts.nix` as source of truth. | Centralised address management, no static IPs in per-host configs. |
|
||||
|
||||
|
||||
---
|
||||
@@ -82,6 +84,13 @@ nixos-infra/
|
||||
│ └── gaia/ # Xavier's laptop (audio)
|
||||
│ └── configuration.nix
|
||||
│
|
||||
├── network/ # Centralised network data (VLANs, subnets, hosts)
|
||||
│ ├── default.nix # Aggregator — imports vlans, subnets, hosts
|
||||
│ ├── vlans.nix # VLAN definitions
|
||||
│ ├── subnets.nix # Subnet prefix allocations
|
||||
│ ├── hosts.nix # Per-machine IP/address assignments
|
||||
│ └── README.md # Network architecture documentation
|
||||
│
|
||||
├── modules/ # Autonomous modules
|
||||
│ ├── machine-types/ # Machine types
|
||||
│ │ ├── hypervisor.nix # Module for hypervisors
|
||||
@@ -157,20 +166,35 @@ nixos-infra/
|
||||
### **1. Machine List**
|
||||
|
||||
|
||||
| Name | Machine Type | Services | IPv4 | IPv6 Token |
|
||||
| ----------| --------------------| -------------| ------| ------------|
|
||||
| hyper01 | Hypervisor | Proxmox | | |
|
||||
| hyper02 | Hypervisor | Proxmox | | |
|
||||
| dns01 | LXC Container | DNS | | |
|
||||
| git01 | LXC Container | Git forge | | |
|
||||
| pass01 | LXC Container | Password mgr| | |
|
||||
| rp01 | LXC Container | Reverse proxy| | |
|
||||
| sting | Workstation | | | |
|
||||
| PC-FRIDA | Workstation | | | |
|
||||
| Name | Machine Type | VLAN | IPv4 | IPv6 Token |
|
||||
| ----------| --------------------| ---------| ------------------| ------------|
|
||||
| hyper01 | Hypervisor | ADMIN | 10.10.128.10/16 | ::10 |
|
||||
| hyper02 | Hypervisor | ADMIN | 10.10.128.11/16 | ::11 |
|
||||
| dns01 | LXC Container | DMZ | 10.40.128.10/16 | ::10 |
|
||||
| dns02 | LXC Container | DMZ | 10.40.128.11/16 | ::11 |
|
||||
| git01 | LXC Container | DMZ | 10.40.128.20/16 | ::20 |
|
||||
| pass01 | LXC Container | DMZ | 10.40.128.30/16 | ::30 |
|
||||
| rp01 | LXC Container | DMZ | 10.40.128.199/16 | ::199 |
|
||||
| sting | Workstation | INTERNAL | 10.50.128.10/16 | ::10 |
|
||||
| PC-FRIDA | Workstation | INTERNAL | 10.50.128.11/16 | ::11 |
|
||||
| gaia | Workstation | INTERNAL | 10.50.128.12/16 | ::12 |
|
||||
|
||||
---
|
||||
|
||||
### **2. List of User Profiles**
|
||||
### **2. VLANs**
|
||||
|
||||
| VLAN | ID | Effective ID | IPv4 Prefix | IPv6 ULA | IPv6 GUA |
|
||||
| ----------| ---| --------------| -----------------| ----------------------------------| ----------------------------------|
|
||||
| INET | 1 | 1 | Out of scope | Out of scope | Out of scope |
|
||||
| ADMIN | 90 | **100** | 10.10.0.0/16 | fdb2:ae63:d45:d941::/64 | 2a01:e0a:2ea:d941::/64 |
|
||||
| IOT | 200| 200 | 10.20.0.0/16 | fdb2:ae63:d45:d942::/64 | 2a01:e0a:2ea:d942::/64 |
|
||||
| GUEST | 300| 300 | 10.30.0.0/16 | fdb2:ae63:d45:d943::/64 | 2a01:e0a:2ea:d943::/64 |
|
||||
| DMZ | 400| 400 | 10.40.0.0/16 | fdb2:ae63:d45:d944::/64 | 2a01:e0a:2ea:d944::/64 |
|
||||
| INTERNAL | 500| 500 | 10.50.0.0/16 | fdb2:ae63:d45:d945::/64 | 2a01:e0a:2ea:d945::/64 |
|
||||
|
||||
---
|
||||
|
||||
### **3. List of User Profiles**
|
||||
|
||||
|
||||
| Name | Role |
|
||||
@@ -183,7 +207,7 @@ nixos-infra/
|
||||
|
||||
---
|
||||
|
||||
### **3. User List**
|
||||
### **4. User List**
|
||||
| Name | Role | SSH Access |
|
||||
| --------| -----------------------| -----------|
|
||||
| root | Superuser | ❌ |
|
||||
@@ -194,7 +218,7 @@ nixos-infra/
|
||||
|
||||
---
|
||||
|
||||
### **4. User/Machine/Profile Mappings**
|
||||
### **5. User/Machine/Profile Mappings**
|
||||
|
||||
|
||||
| User | Machine | Applied Profiles | Role |
|
||||
@@ -214,6 +238,43 @@ nixos-infra/
|
||||
|
||||
---
|
||||
|
||||
## **🌐 Network Architecture**
|
||||
|
||||
The network topology and addressing are defined **declaratively** in `network/`, the single source of truth for:
|
||||
- VLANs (`network/vlans.nix`)
|
||||
- Subnet prefixes (`network/subnets.nix`)
|
||||
- Host address assignments (`network/hosts.nix`)
|
||||
|
||||
### Prefix rules
|
||||
|
||||
| Type | Formula | Example (DMZ, effectiveId=400) |
|
||||
|--------|-----------------------------------------------------------|--------------------------------|
|
||||
| IPv4 | `10.<effectiveId>.0.0/16` — hosts in `10.<v>.128.0/17` | `10.40.0.0/16` |
|
||||
| IPv6 ULA | `fdb2:ae63:d45:d94<N>::/64` where N = effectiveId/100 | `fdb2:ae63:d45:d944::/64` |
|
||||
| IPv6 GUA | `2a01:e0a:2ea:d94<N>::/64` where N = effectiveId/100 | `2a01:e0a:2ea:d944::/64` |
|
||||
|
||||
> **ADMIN exception:** VLAN ID is 90 but treated as effective ID 100 for
|
||||
> prefix computation. This avoids a risky production renumbering.
|
||||
|
||||
### Consumption
|
||||
|
||||
**From a NixOS configuration:**
|
||||
```nix
|
||||
let network = import ../../network { };
|
||||
in {
|
||||
networking.hostName = "dns01";
|
||||
networking.useDHCP = true;
|
||||
}
|
||||
```
|
||||
|
||||
**From a shell script:**
|
||||
```bash
|
||||
nix eval --json -f network/default.nix hosts | jq '.dns01.ipv4'
|
||||
# → "10.40.128.10"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **🔄 Deployment Workflow**
|
||||
|
||||
### **For LXC containers (Proxmox)**
|
||||
@@ -276,6 +337,7 @@ nixos-infra/
|
||||
| Write the DNS module | Module for the DNS service (Bind). | ⬜ | ⭐⭐⭐ |
|
||||
| Configure `agenix` | Encrypt the first secrets. | ⬜ | ⭐⭐ |
|
||||
| Document the process | `README.md` to explain deployment. | ⬜ | ⭐⭐ |
|
||||
| DHCP service module | Kea or ISC DHCP consuming `network/hosts.nix` | ⬜ | ⭐⭐ |
|
||||
| Automate with Ansible | Playbook to create multiple containers. | ⬜ | ⭐ |
|
||||
| Integrate CI/CD | Test configurations before deployment. | ⬜ | ⭐ |
|
||||
|
||||
@@ -293,6 +355,10 @@ nixos-infra/
|
||||
- **Security** :
|
||||
- Disable root SSH access once deployment is complete.
|
||||
- Use SSH keys for authentication.
|
||||
- **Network** :
|
||||
- IPv4 addresses are allocated from the upper half of each VLAN (`10.<v>.128.0/17`).
|
||||
- Addresses are assigned via DHCP reservations — `network/hosts.nix` is the source of truth.
|
||||
- See `network/README.md` for the complete architecture documentation.
|
||||
- **Maintenance** :
|
||||
- Update `nixpkgs` regularly (`nix-channel --update`).
|
||||
- Document changes in the `CHANGELOG.md`.
|
||||
|
||||
Reference in New Issue
Block a user