A simple module to make NixOS act as a router!
This uses:
- nftables for firewalling & NAT,
- dnsmasq as a DHCP server; it also forwards DNS to…
- stubby for secure DNS over TLS & DNSSEC validation
- hostapd for running a WLAN Access Point with WPA3 SAE-PK security
Simply include the module in your NixOS config flake:
# flake.nix
{
inputs = {
nixos-router.url = "github:42LoCo42/nixos-router";
# no need to "follow" any inputs!
};
}
And configure it like this:
# configuration.nix
{ self, ... }: {
imports = [ self.inputs.nixos-router.nixosModules.default ];
services.router = {
enable = true;
lanIF = "wlan0";
wanIF = "eth0";
wlan = {
ssid = "My Network";
passwordFile = "/var/lib/wlan-password.sae";
};
};
}
You need a SAE password file to use WLAN; to generate it do this:
# obtain required tools
nix shell nixpkgs#openssl github:42LoCo42/obscura#sae_pk_gen
# generate the EC keypair
openssl ecparam -name prime256v1 -genkey -noout -out wlan-password.der -outform der
# convert to SAE password file
# use the same SSID here!
sae_pk_gen wlan-password.der 3 "My Network" |
sed 's|sae_password=||' >wlan-password.sae
The file wlan-password.der
can now be deleted. Its contents are part of wlan-password.sae
.
Speaking of, check out that file to get the WLAN password!
You can also select a longer one from the list in the file (but you can’t pick your own due to how SAE-PK works). To change the password, just put it at the start of the line that’s not a comment!
YOUR-WLAN-PASS-WORD|pk=<very long string>
Tired of manually entering passwords?
Run sudo qr
to display a QR code that you can scan with your phone
to automatically connect to the WLAN!
enable
(bool): Enable this module. Default: falselanIF
(string): Name of the LAN (internal) network interface. Required!wanIF
(string): Name of the WAN (external) network interface. Required!lanIP
(string): LAN IP of the router. Default:10.0.0.1
lanSize
(number, 0..32): Size of the LAN in CIDR notation (the part after the slash). Default: 24lanAlloc
(string): DHCP allocation range & duration. Must matchlanIP
andlanSize
! Default:10.0.0.2,10.0.0.254,12h
blockFakeLocals
(bool): Whether to block incoming connections on the WAN that originate from local IP ranges. Disable this when testing in a VM! Default: true
enable
(bool): Enable the WLAN. Default: truessid
(string): SSID of the WLAN. Required!passwordFile
(path): Path to the SAE password file. Required!hide
(bool): Ignore SSID broadcast requests to hide the WLAN. Default: false