# Nix-NOS

Generic NixOS network configuration modules. A declarative alternative to VyOS/OpenWrt.

## Features

- **BGP**: BIRD2 and GoBGP backend support for dynamic routing
- **Network Interfaces**: systemd-networkd based configuration with DHCP, static addresses, gateway, and DNS
- **VLANs**: Network segmentation with automatic parent interface attachment
- **Static Routing**: Declarative route tables

## Quick Start

Add Nix-NOS as a flake input:

```nix
{
  inputs.nix-nos.url = "github:centra/nix-nos";

  outputs = { nix-nos, nixpkgs, ... }: {
    nixosConfigurations.router = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [
        nix-nos.nixosModules.default
        ./configuration.nix
      ];
    };
  };
}
```

Enable Nix-NOS in your configuration:

```nix
{
  nix-nos.enable = true;
}
```

## Modules

### nix-nos.bgp

Dynamic routing with BGP support.

```nix
nix-nos.bgp = {
  enable = true;
  backend = "bird";        # or "gobgp"
  asn = 65000;             # Local AS number
  routerId = "10.0.0.1";   # BGP router ID

  peers = [
    { address = "10.0.0.2"; asn = 65001; description = "Peer router"; }
  ];

  announcements = [
    { prefix = "203.0.113.0/24"; }
  ];
};
```

**Options**:
- `enable`: Enable BGP routing
- `backend`: Choose BIRD2 (`"bird"`) or GoBGP (`"gobgp"`)
- `asn`: Local Autonomous System Number
- `routerId`: BGP router ID (auto-detected if null)
- `peers`: List of BGP peers to establish sessions with
- `announcements`: Prefixes to announce via BGP

### nix-nos.interfaces

Declarative network interface configuration using systemd-networkd.

```nix
nix-nos.interfaces = {
  eth0 = {
    addresses = [ "192.168.1.10/24" ];
    gateway = "192.168.1.1";
    dns = [ "8.8.8.8" "8.8.4.4" ];
    mtu = 1500;
  };

  eth1 = {
    dhcp = true;
    mtu = 9000;
  };
};
```

**Options (per interface)**:
- `addresses`: List of IP addresses in CIDR notation
- `gateway`: Default gateway (optional)
- `dns`: List of DNS servers (optional)
- `dhcp`: Enable DHCP client (boolean, default: false)
- `mtu`: Maximum Transmission Unit size (optional)

### nix-nos.vlans

VLAN configuration with automatic netdev creation and parent interface attachment.

```nix
nix-nos.vlans = {
  storage = {
    id = 100;
    interface = "eth0";
    addresses = [ "10.0.100.1/24" ];
    mtu = 9000;
  };

  mgmt = {
    id = 200;
    interface = "eth0";
    addresses = [ "10.0.200.1/24" ];
    gateway = "10.0.200.254";
    dns = [ "10.0.200.53" ];
  };
};
```

**Options (per VLAN)**:
- `id`: VLAN ID (1-4094)
- `interface`: Parent physical interface
- `addresses`: List of IP addresses in CIDR notation
- `gateway`: Default gateway (optional)
- `dns`: List of DNS servers (optional)
- `mtu`: MTU size for VLAN interface (optional)

### nix-nos.routing.static

Static route configuration.

```nix
nix-nos.routing.static = {
  routes = [
    { destination = "10.0.0.0/8"; gateway = "192.168.1.254"; }
    { destination = "172.16.0.0/12"; gateway = "192.168.1.254"; }
  ];
};
```

## Examples

See the `examples/` directory for complete configuration examples:

- `home-router.nix`: Simple home router with WAN/LAN setup
- `datacenter-node.nix`: Data center node with BGP and VLANs
- `edge-router.nix`: Edge router with multiple VLANs and static routing

## Architecture

Nix-NOS uses systemd-networkd as the underlying network backend, providing:

- Declarative configuration
- Atomic network changes
- Integration with NixOS module system
- No runtime dependencies on legacy networking tools

## License

MIT OR Apache-2.0

## Contributing

This is a generic network configuration system. Please keep contributions free of specific vendor or project references to maintain reusability.
