summaryrefslogtreecommitdiff
path: root/modules/xnet/net
diff options
context:
space:
mode:
Diffstat (limited to 'modules/xnet/net')
-rw-r--r--modules/xnet/net/default.nix69
-rw-r--r--modules/xnet/net/vpn-gateway.nix103
2 files changed, 172 insertions, 0 deletions
diff --git a/modules/xnet/net/default.nix b/modules/xnet/net/default.nix
new file mode 100644
index 0000000..143f189
--- /dev/null
+++ b/modules/xnet/net/default.nix
@@ -0,0 +1,69 @@
+{ config, lib, ... }:
+let
+ cfg = config.xnet.net;
+ inherit (lib) mkOption mkIf types;
+ prefix = "10.26.4";
+in
+{
+ options.xnet.net = {
+ interface = mkOption {
+ type = types.str;
+ default = "";
+ description = "Network interface connecting to xnet.";
+ };
+
+ addr = mkOption {
+ type = types.ints.between 0 255;
+ description = "Final octet for xnet address.";
+ example = 4;
+ };
+
+ sshd = mkOption {
+ type = types.bool;
+ default = false;
+ description = "Enable hardened SSH service.";
+ };
+ };
+
+ # TODO:
+ # - Add assertion that each address is only used once across config
+ # - Add each host to each other hosts dns configuration
+ config = mkIf (builtins.stringLength cfg.interface > 0) {
+ networking.vlans = {
+ "${cfg.interface}.4" = {
+ inherit (cfg) interface;
+ id = 4;
+ };
+ };
+
+ networking.interfaces = {
+ "${cfg.interface}.4".ipv4.addresses = [{
+ address = "${prefix}.${toString cfg.addr}";
+ prefixLength = 24;
+ }];
+ };
+
+ services.openssh = {
+ enable = cfg.sshd;
+ startWhenNeeded = true;
+ settings = {
+ X11Forwarding = false;
+ UsePAM = false;
+ PermitRootLogin = "prohibit-password";
+ };
+ extraConfig =
+ let
+ p = [
+ "sk-ssh-ed25519-cert-v01@openssh.com"
+ "ssh-ed25519-cert-v01@openssh.com"
+ "ssh-ed25519"
+ ];
+ in
+ "PubkeyAcceptedKeyTypes ${lib.strings.concatStringsSep "," p}";
+ hostKeys = [{
+ path = "/certs/ssh/ssh_host_ed25519_key";
+ type = "ed25519";
+ }];
+ };
+ };
+}
diff --git a/modules/xnet/net/vpn-gateway.nix b/modules/xnet/net/vpn-gateway.nix
new file mode 100644
index 0000000..d26ced1
--- /dev/null
+++ b/modules/xnet/net/vpn-gateway.nix
@@ -0,0 +1,103 @@
+{ config, lib, pkgs, ... }:
+let
+ cfg = config.xnet.net.vpnGateway;
+ inherit (lib) mkOption mkIf types;
+
+ iface = "enp2s0";
+ fwmark = "0x1";
+ ip = "192.168.2.113";
+ vpn = {
+ iface = "wg0";
+ endpoint = "149.88.22.129:51820";
+ addr = "10.69.70.71/32";
+ peers = [
+
+ ];
+ };
+in
+
+{
+ # options.xnet.net.vpnGateway = {
+ # interface = mkOption {
+ # type = types.str;
+ # description = "Interface to forward VPN routed packets to internet";
+ # };
+ #
+ # vpn = types.subModule {
+ # interface = mkOption {
+ # type = types.str;
+ # default = "wg0";
+ # description = "Name of VPN interface.";
+ # };
+ #
+ # endpoint = mkOption {
+ # type = types.str;
+ # description = "ip:port of the VPN endpoint.";
+ # };
+ #
+ # addr = mkOption {
+ # type = types.str;
+ # description = "Address of the VPN interface.";
+ # };
+ #
+ # privateKeyFile = mkOption {
+ # type = types.str;
+ # description = "Path to private key.";
+ # };
+ #
+ # peers = types.listOf types.subModule {
+ #
+ # };
+ # };
+
+ boot.kernel.sysctl = {
+ "net.ipv4.ip_forward" = 1;
+ "net.ipv6.conf.all.forwarding" = 1;
+ };
+
+ networking = {
+ wg-quick.interfaces."${vpn.iface}" = {
+ address = [ vpn.addr ];
+ privateKeyFile = "/certs/wg/private.key";
+
+ peers = [{
+ publicKey = "yxyntWsANEwxeR0pOPNAcfWY7zEVICZe9G+GxortzEY=";
+ allowedIPs = [ "0.0.0.0/0" ];
+ endpoint = "149.88.22.129:51820";
+ persistentKeepalive = 25;
+ }];
+ };
+
+ nat = {
+ enable = true;
+ externalInterface = "wg0";
+ internalInterfaces = [ "enp2s0" ];
+ };
+
+ firewall = {
+ extraCommands = ''
+ # Create a new routing table for forwarded traffic
+ echo "200 vpn" >> /etc/iproute2/rt_tables
+
+ # Mark packets from other hosts
+ iptables -t mangle -A PREROUTING -i enp2s0 ! -s 192.168.1.113 -j MARK --set-mark 0x1
+
+ # Route marked packets through WireGuard
+ ip rule add fwmark 0x1 table vpn
+ ip route add default dev wg0 table vpn
+
+ # Allow forwarding
+ iptables -A FORWARD -i enp2s0 -o wg0 -j ACCEPT
+ iptables -A FORWARD -i wg0 -o enp2s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
+
+ # NAT only forwarded traffic
+ iptables -t nat -A POSTROUTING -o wg0 ! -s 192.168.1.113 -j MASQUERADE
+ '';
+
+ extraStopCommands = ''
+ ip rule del fwmark 0x1 table vpn 2>/dev/null || true
+ ip route flush table vpn 2>/dev/null || true
+ '';
+ };
+ };
+}