mirror of https://gitlab.com/curben/blog
post(nixos): attach complete configuration.nix
This commit is contained in:
parent
a1c0b6b1d0
commit
53bdc4548e
|
@ -257,7 +257,7 @@ Once enabled, any device not whitelisted in the policy will not be accessible.
|
||||||
|
|
||||||
Based on [Ubuntu Wiki](https://wiki.ubuntu.com/ImprovedNetworking/KernelSecuritySettings) and [ArchWiki](https://wiki.archlinux.org/index.php/sysctl).
|
Based on [Ubuntu Wiki](https://wiki.ubuntu.com/ImprovedNetworking/KernelSecuritySettings) and [ArchWiki](https://wiki.archlinux.org/index.php/sysctl).
|
||||||
|
|
||||||
```
|
``` nix
|
||||||
## Enable BBR module
|
## Enable BBR module
|
||||||
boot.kernelModules = [ "tcp_bbr" ];
|
boot.kernelModules = [ "tcp_bbr" ];
|
||||||
|
|
||||||
|
@ -328,5 +328,267 @@ Since [unattended upgrade](#Unattended-upgrade) is executed on 00:00, I delay ga
|
||||||
automatic = true;
|
automatic = true;
|
||||||
# Every Monday 01:00 (UTC)
|
# Every Monday 01:00 (UTC)
|
||||||
dates = "Monday 01:00 UTC";
|
dates = "Monday 01:00 UTC";
|
||||||
|
options = "--delete-older-than 7d";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Run garbage collection whenever there is less than 500MB free space left
|
||||||
|
nix.extraOptions = ''
|
||||||
|
min-free = ${toString (500 * 1024 * 1024)}
|
||||||
|
'';
|
||||||
|
```
|
||||||
|
|
||||||
|
## Complete configuration.nix
|
||||||
|
|
||||||
|
``` nix /etc/nixos/configuration.nix
|
||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
[ # Include the results of the hardware scan.
|
||||||
|
./hardware-configuration.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
# The global useDHCP flag is deprecated, therefore explicitly set to false here.
|
||||||
|
# Per-interface useDHCP will be mandatory in the future, so this generated config
|
||||||
|
# replicates the default behaviour.
|
||||||
|
networking.useDHCP = false;
|
||||||
|
networking.interfaces.ens3.useDHCP = true;
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
dnsutils wormhole-william p7zip
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.shellAliases = {
|
||||||
|
ls = "ls -l";
|
||||||
|
la = "ls -a";
|
||||||
|
wormhole = "wormhole-william";
|
||||||
|
};
|
||||||
|
|
||||||
|
time.timeZone = "UTC";
|
||||||
|
|
||||||
|
## Unattended upgrade
|
||||||
|
system.autoUpgrade = {
|
||||||
|
enable = true;
|
||||||
|
allowReboot = true;
|
||||||
|
dates = "weekly UTC";
|
||||||
|
};
|
||||||
|
|
||||||
|
## Garbage collection
|
||||||
|
# https://nixos.wiki/wiki/Storage_optimization#Automation
|
||||||
|
nix.gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "Monday 01:00 UTC";
|
||||||
|
options = "--delete-older-than 7d";
|
||||||
|
};
|
||||||
|
|
||||||
|
# Run garbage collection whenever there is less than 500MB free space left
|
||||||
|
nix.extraOptions = ''
|
||||||
|
min-free = ${toString (500 * 1024 * 1024)}
|
||||||
|
'';
|
||||||
|
|
||||||
|
## Optional: Clear >1 month-old logs
|
||||||
|
systemd = {
|
||||||
|
services.clear-log = {
|
||||||
|
description = "Clear >1 month-old logs every week";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = "${pkgs.systemd}/bin/journalctl --vacuum-time=30d";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
timers.clear-log = {
|
||||||
|
wantedBy = [ "timers.target" ];
|
||||||
|
partOf = [ "clear-log.service" ];
|
||||||
|
timerConfig.OnCalendar = "weekly UTC";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
## Hardened kernel
|
||||||
|
boot.kernelPackages = pkgs.linuxPackages_hardened;
|
||||||
|
|
||||||
|
## Enable BBR
|
||||||
|
boot.kernelModules = [ "tcp_bbr" ];
|
||||||
|
|
||||||
|
## Network hardening and performance
|
||||||
|
boot.kernel.sysctl = {
|
||||||
|
# Disable magic SysRq key
|
||||||
|
"kernel.sysrq" = 0;
|
||||||
|
# Ignore ICMP broadcasts to avoid participating in Smurf attacks
|
||||||
|
"net.ipv4.icmp_echo_ignore_broadcasts" = 1;
|
||||||
|
# Ignore bad ICMP errors
|
||||||
|
"net.ipv4.icmp_ignore_bogus_error_responses" = 1;
|
||||||
|
# Reverse-path filter for spoof protection
|
||||||
|
"net.ipv4.conf.default.rp_filter" = 1;
|
||||||
|
"net.ipv4.conf.all.rp_filter" = 1;
|
||||||
|
# SYN flood protection
|
||||||
|
"net.ipv4.tcp_syncookies" = 1;
|
||||||
|
# Do not accept ICMP redirects (prevent MITM attacks)
|
||||||
|
"net.ipv4.conf.all.accept_redirects" = 0;
|
||||||
|
"net.ipv4.conf.default.accept_redirects" = 0;
|
||||||
|
"net.ipv4.conf.all.secure_redirects" = 0;
|
||||||
|
"net.ipv4.conf.default.secure_redirects" = 0;
|
||||||
|
"net.ipv6.conf.all.accept_redirects" = 0;
|
||||||
|
"net.ipv6.conf.default.accept_redirects" = 0;
|
||||||
|
# Do not send ICMP redirects (we are not a router)
|
||||||
|
"net.ipv4.conf.all.send_redirects" = 0;
|
||||||
|
# Do not accept IP source route packets (we are not a router)
|
||||||
|
"net.ipv4.conf.all.accept_source_route" = 0;
|
||||||
|
"net.ipv6.conf.all.accept_source_route" = 0;
|
||||||
|
# Protect against tcp time-wait assassination hazards
|
||||||
|
"net.ipv4.tcp_rfc1337" = 1;
|
||||||
|
# Latency reduction
|
||||||
|
"net.ipv4.tcp_fastopen" = 3;
|
||||||
|
## Bufferfloat mitigations
|
||||||
|
# Requires >= 4.9 & kernel module
|
||||||
|
"net.ipv4.tcp_congestion_control" = "bbr";
|
||||||
|
# Requires >= 4.19
|
||||||
|
"net.core.default_qdisc" = "cake";
|
||||||
|
};
|
||||||
|
|
||||||
|
## USBGuard
|
||||||
|
# Load "/var/lib/usbguard/rules.conf" by default
|
||||||
|
services.usbguard.enable = true;
|
||||||
|
|
||||||
|
## DNS-over-TLS
|
||||||
|
services.stubby = {
|
||||||
|
enable = true;
|
||||||
|
# ::1 cause error, use 0::1 instead
|
||||||
|
listenAddresses = [ "0::1" "127.0.0.1" ];
|
||||||
|
roundRobinUpstreams = false;
|
||||||
|
upstreamServers =
|
||||||
|
''
|
||||||
|
## Cloudflare DNS
|
||||||
|
- address_data: 2606:4700:4700::1111
|
||||||
|
tls_auth_name: "cloudflare-dns.com"
|
||||||
|
- address_data: 2606:4700:4700::1001
|
||||||
|
tls_auth_name: "cloudflare-dns.com"
|
||||||
|
- address_data: 1.1.1.1
|
||||||
|
tls_auth_name: "cloudflare-dns.com"
|
||||||
|
- address_data: 1.0.0.1
|
||||||
|
tls_auth_name: "cloudflare-dns.com"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.nameservers = [ "::1" "127.0.0.1" ];
|
||||||
|
services.resolved = {
|
||||||
|
enable = true;
|
||||||
|
fallbackDns = [ "2606:4700:4700::1111" "2606:4700:4700::1001" "1.1.1.1" "1.0.0.1" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
## Port forwarding
|
||||||
|
networking.firewall = {
|
||||||
|
enable = true;
|
||||||
|
interfaces.ens3 = {
|
||||||
|
allowedTCPPorts = [ 443 4430 ];
|
||||||
|
};
|
||||||
|
extraCommands =
|
||||||
|
''
|
||||||
|
ip6tables -t nat -I PREROUTING -i ens3 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 4430
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
## Create service users
|
||||||
|
users = {
|
||||||
|
mutableUsers = false; # Disable passwd
|
||||||
|
|
||||||
|
users = {
|
||||||
|
root = {
|
||||||
|
hashedPassword = "*"; # Disable root password
|
||||||
|
};
|
||||||
|
nixos = {
|
||||||
|
passwordFile = "/etc/nixos/nixos.password";
|
||||||
|
isNormalUser = true;
|
||||||
|
extraGroups = [ "wheel" ]; # Enable ‘sudo’ for the user.
|
||||||
|
};
|
||||||
|
caddyProxy = {
|
||||||
|
home = "/var/lib/caddyProxy";
|
||||||
|
createHome = true;
|
||||||
|
};
|
||||||
|
caddyTor = {
|
||||||
|
home = "/var/lib/caddyTor";
|
||||||
|
createHome = true;
|
||||||
|
};
|
||||||
|
caddyI2p = {
|
||||||
|
home = "/var/lib/caddyI2p";
|
||||||
|
createHome = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
groups = {
|
||||||
|
caddyProxy = {
|
||||||
|
members = [ "caddyProxy" ];
|
||||||
|
};
|
||||||
|
caddyTor = {
|
||||||
|
members = [ "caddyTor" ];
|
||||||
|
};
|
||||||
|
caddyI2p = {
|
||||||
|
members = [ "caddyI2p" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
## Requires OTP to login & sudo
|
||||||
|
security.pam = {
|
||||||
|
services.login.googleAuthenticator.enable = true;
|
||||||
|
services.sudo.googleAuthenticator.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
### The rest will be explained in the next articles
|
||||||
|
## Caddy web server
|
||||||
|
require = [ /etc/caddy/caddyProxy.nix /etc/caddy/caddyTor.nix /etc/caddy/caddyI2p.nix ];
|
||||||
|
services.caddyProxy = {
|
||||||
|
enable = false;
|
||||||
|
config = "/etc/caddy/caddyProxy.conf";
|
||||||
|
};
|
||||||
|
services.caddyTor = {
|
||||||
|
enable = false;
|
||||||
|
config = "/etc/caddy/caddyTor.conf";
|
||||||
|
};
|
||||||
|
services.caddyI2p = {
|
||||||
|
enable = false;
|
||||||
|
config = "/etc/caddy/caddyI2p.conf";
|
||||||
|
};
|
||||||
|
|
||||||
|
## Tor onion
|
||||||
|
services.tor = {
|
||||||
|
enable = true;
|
||||||
|
enableGeoIP = false;
|
||||||
|
hiddenServices = {
|
||||||
|
proxy = {
|
||||||
|
version = 3;
|
||||||
|
map = [
|
||||||
|
{
|
||||||
|
port = "80";
|
||||||
|
toHost = "[::1]";
|
||||||
|
toPort = "8080";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
extraConfig =
|
||||||
|
''
|
||||||
|
ClientUseIPv4 0
|
||||||
|
ClientUseIPv6 1
|
||||||
|
ClientPreferIPv6ORPort 1
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
## I2P Eepsite
|
||||||
|
services.i2pd = {
|
||||||
|
enable = true;
|
||||||
|
enableIPv4 = false;
|
||||||
|
enableIPv6 = true;
|
||||||
|
ifname = "ens3";
|
||||||
|
address = "xxxx";
|
||||||
|
inTunnels = {
|
||||||
|
proxy = {
|
||||||
|
enable = true;
|
||||||
|
keys = "proxy-keys.dat";
|
||||||
|
inPort = 80;
|
||||||
|
address = "::1";
|
||||||
|
destination = "::1";
|
||||||
|
port = 8081;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
Loading…
Reference in New Issue