summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjetil Orbekk <kj@orbekk.com>2023-02-19 10:56:27 -0500
committerKjetil Orbekk <kj@orbekk.com>2023-02-19 10:56:40 -0500
commitdbce99ae250ed102be9e401e7c6b40811e24243c (patch)
treedaf5bb88975d94e99cc3074d104057070198bcb8
parentb3d294752afc8a9b703fc0bbfd740d110e3e7464 (diff)
new router config
-rw-r--r--config/router.nix2
-rw-r--r--machines/dragon.nix3
-rw-r--r--modules/router.nix103
-rw-r--r--modules/simple-firewall.nix2
4 files changed, 98 insertions, 12 deletions
diff --git a/config/router.nix b/config/router.nix
index d15da89..aa6b5d9 100644
--- a/config/router.nix
+++ b/config/router.nix
@@ -249,7 +249,7 @@ in {
enable = true;
servers = [ "1.1.1.1" "8.8.8.8" "8.8.4.4" ];
resolveLocalQueries = false;
- extraConfig = ''
+ extraConfig = ''
port=2053
no-resolv
diff --git a/machines/dragon.nix b/machines/dragon.nix
index f5d967b..6920363 100644
--- a/machines/dragon.nix
+++ b/machines/dragon.nix
@@ -2,7 +2,7 @@
let duid = "00:01:00:01:21:a2:4e:a8:d0:bf:9c:45:a6:ec";
in {
imports = [
- ../config/router.nix
+ # ../config/router.nix
# ../config/borg-backup.nix
../config/keycloak.nix
../config/dns.nix
@@ -10,6 +10,7 @@ in {
../config/cgit.nix
];
+ orbekk.router.enable = true;
orbekk.monitoring-server.enable = true;
orbekk.postfix.enable = true;
orbekk.nextcloud.enable = true;
diff --git a/modules/router.nix b/modules/router.nix
index 621a627..359832e 100644
--- a/modules/router.nix
+++ b/modules/router.nix
@@ -1,7 +1,77 @@
-{ config, lib, pkgs, ... };
+{ config, lib, pkgs, ... }:
with lib;
let
cfg = config.orbekk.router;
+
+ devices = ["eno1" "eno2"];
+
+ router-netns-up = pkgs.writeScript "router-netns-up" ''
+ #!${pkgs.bash}/bin/bash
+ ip netns add router
+ ip netns exec router ip link set lo up
+ ${lib.concatMapStrings (device: ''
+ ip link set ${device} netns router
+ '')
+ devices}
+ ip link add router-vport type veth peer name dragon-vport netns router
+ '';
+
+ router-netns-down = pkgs.writeScript "router-netns-down" ''
+ #!${pkgs.bash}/bin/bash
+ ip link del main
+ ip netns del router
+ '';
+
+ router-config = { config, lib, pkgs, ... }: {
+ system.stateVersion = "22.05";
+
+ virtualisation.vswitch.enable = true;
+ virtualisation.vswitch.resetOnStart = true;
+ networking.vswitches.kjlan = {
+ interfaces.wan-vport = { vlan = 10; type = "internal"; };
+ interfaces.lan-vport = { vlan = 100; type = "internal"; };
+ interfaces.admin-vport = { vlan = 255; type = "internal"; };
+ interfaces.dragon-vport = { vlan = 100; };
+
+ extraOvsctlCmds = ''
+ add bond kjlan bond0 eno1 eno2 lacp=active miimon=5000
+ set interface wan-vport mac=\"3c:97:0e:19:7e:5c\"
+ '';
+ };
+
+ networking.interfaces.lan-vport = {
+ ipv4.addresses = [{address = "172.20.100.1"; prefixLength = 23;}];
+ };
+ networking.interfaces.admin-vport = {
+ ipv4.addresses = [{address = "10.10.255.18"; prefixLength = 24;}];
+ ipv4.routes = [{address = "10.10.255.0"; prefixLength = 24;}];
+ };
+
+ services.dnsmasq = {
+ enable = true;
+ servers = [ "1.1.1.1" "8.8.8.8" "8.8.4.4" ];
+ resolveLocalQueries = false;
+
+ extraConfig = ''
+ no-resolv
+ no-hosts
+
+ address=/localhost/::1
+ address=/localhost/127.0.0.1
+
+ dhcp-range=lan-vport,172.20.100.1,172.20.101.254,5m
+ dhcp-option=net:lan,option:router,172.20.100.1
+ dhcp-option=net:lan,option:dns-server,172.20.100.1
+ '';
+ };
+
+ networking.dhcpcd = {
+ extraConfig = ''
+ interface wan-vport
+ dhcp
+ '';
+ };
+ };
in {
options = {
orbekk.router = {
@@ -10,17 +80,32 @@ in {
};
config = mkIf cfg.enable {
- systemd.services."router" = {
+ systemd.services."router-netns" = {
description = "router network namespace";
before = ["network.target"];
- path = with pkgs; [ iproute ];
+ after = ["network-interfaces.target"];
+ path = with pkgs; [bash iproute];
serviceConfig = {
- ExecStart = [
- "ip netns up router"
- "ip netns exec router ip link set lo up"
- ];
- ExecStop = "netns del router";
+ Type = "oneshot";
+ RemainAfterExit = "yes";
+ ExecStart = "${router-netns-up}";
+ ExecStop = "${router-netns-down}";
};
};
+
+ networking.wireguard.interfaces.vpn.interfaceNamespace = "router";
+
+ systemd.services."container@router" = {
+ after = ["router-netns.service"];
+ wantedBy = ["network.target"];
+ };
+
+ containers.router = {
+ autoStart = true;
+ extraFlags = ["--network-namespace-path" "/var/run/netns/router"];
+ privateNetwork = false;
+ config = router-config;
+ additionalCapabilities = ["CAP_NET_ADMIN"];
+ };
};
-};
+}
diff --git a/modules/simple-firewall.nix b/modules/simple-firewall.nix
index 3c69d5d..3173672 100644
--- a/modules/simple-firewall.nix
+++ b/modules/simple-firewall.nix
@@ -55,7 +55,7 @@ in
ip protocol icmp limit rate 4/second counter accept
ip6 nexthdr ipv6-icmp limit rate 4/second counter accept
- ip6 saddr 2001:470:8e2e:1000::/64 counter accept
+ ip6 saddr 2001:470:8e2e:1000::/64 counter accept
tcp dport @allowed_tcp_ports counter accept
udp dport @allowed_udp_ports counter accept