summary refs log tree commit diff
path: root/nixos/modules/services/networking/strongswan.nix
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2014-11-25 09:37:15 -0500
committerShea Levy <shea@shealevy.com>2014-11-25 09:37:15 -0500
commit957eb52f6f4a467910088e8ef3434beca49ce8fc (patch)
tree42b62023197e6fa6509f18ecb0cdb85f97101961 /nixos/modules/services/networking/strongswan.nix
parentd250ca4e317c8d8ca1a0ec5bfe84eb7c828b6ecc (diff)
parent4c33004e1f962d44a5f3f1f4efb057f385b3b764 (diff)
downloadnixpkgs-957eb52f6f4a467910088e8ef3434beca49ce8fc.tar
nixpkgs-957eb52f6f4a467910088e8ef3434beca49ce8fc.tar.gz
nixpkgs-957eb52f6f4a467910088e8ef3434beca49ce8fc.tar.bz2
nixpkgs-957eb52f6f4a467910088e8ef3434beca49ce8fc.tar.lz
nixpkgs-957eb52f6f4a467910088e8ef3434beca49ce8fc.tar.xz
nixpkgs-957eb52f6f4a467910088e8ef3434beca49ce8fc.tar.zst
nixpkgs-957eb52f6f4a467910088e8ef3434beca49ce8fc.zip
Merge branch 'strongswan' of github.com:ip1981/nixpkgs
Add strongswan service
Diffstat (limited to 'nixos/modules/services/networking/strongswan.nix')
-rw-r--r--nixos/modules/services/networking/strongswan.nix130
1 files changed, 130 insertions, 0 deletions
diff --git a/nixos/modules/services/networking/strongswan.nix b/nixos/modules/services/networking/strongswan.nix
new file mode 100644
index 00000000000..4ceb8254b1e
--- /dev/null
+++ b/nixos/modules/services/networking/strongswan.nix
@@ -0,0 +1,130 @@
+{ config, lib, pkgs, ... }:
+
+let
+
+  inherit (builtins) toFile;
+  inherit (lib) concatMapStringsSep concatStringsSep mapAttrsToList
+                mkIf mkEnableOption mkOption types;
+
+  cfg = config.services.strongswan;
+
+  ipsecSecrets = secrets: toFile "ipsec.secrets" (
+    concatMapStringsSep "\n" (f: "include ${f}") secrets
+  );
+
+  ipsecConf = {setup, connections, ca}:
+    let
+      # https://wiki.strongswan.org/projects/strongswan/wiki/IpsecConf
+      makeSections = type: sections: concatStringsSep "\n\n" (
+        mapAttrsToList (sec: attrs:
+          "${type} ${sec}\n" +
+            (concatStringsSep "\n" ( mapAttrsToList (k: v: "  ${k}=${v}") attrs ))
+        ) sections
+      );
+      setupConf       = makeSections "config" { inherit setup; };
+      connectionsConf = makeSections "conn" connections;
+      caConf          = makeSections "ca" ca;
+
+    in
+    builtins.toFile "ipsec.conf" ''
+      ${setupConf}
+      ${connectionsConf}
+      ${caConf}
+    '';
+
+  strongswanConf = {setup, connections, ca, secrets}: toFile "strongswan.conf" ''
+    charon {
+      plugins {
+        stroke {
+          secrets_file = ${ipsecSecrets secrets}
+        }
+      }
+    }
+
+    starter {
+      config_file = ${ipsecConf { inherit setup connections ca; }}
+    }
+  '';
+
+in
+{
+  options.services.strongswan = {
+    enable = mkEnableOption "strongSwan";
+
+    secrets = mkOption {
+      type = types.listOf types.path;
+      default = [];
+      example = [ "/run/keys/ipsec-foo.secret" ];
+      description = ''
+        A list of paths to IPSec secret files. These
+        files will be included into the main ipsec.secrets file
+        with the `include' directive. It is safer if these paths are absolute.
+      '';
+    };
+
+    setup = mkOption {
+      type = types.attrsOf types.str;
+      default = {};
+      example = { cachecrls = "yes"; strictcrlpolicy = "yes"; };
+      description = ''
+        A set of options for the `config setup' section of
+        the `ipsec.conf' file. Defines general configuration parameters.
+      '';
+    };
+
+    connections = mkOption {
+      type = types.attrsOf (types.attrsOf types.str);
+      default = {};
+      example = {
+        "%default" = {
+          keyexchange = "ikev2";
+          keyingtries = "1";
+        };
+        roadwarrior = {
+          auto       = "add";
+          leftcert   = "/run/keys/moonCert.pem";
+          leftid     = "@moon.strongswan.org";
+          leftsubnet = "10.1.0.0/16";
+          right      = "%any";
+        };
+      };
+      description = ''
+        A set of connections and their options for the `conn xxx'
+        sections of the `ipsec.conf' file.
+      '';
+    };
+
+    ca = mkOption {
+      type = types.attrsOf (types.attrsOf types.str);
+      default = {};
+      example = {
+        strongswan = {
+          auto   = "add";
+          cacert = "/run/keys/strongswanCert.pem";
+          crluri = "http://crl2.strongswan.org/strongswan.crl";
+        };
+      };
+      description = ''
+        A set of CAs (certification authorities) and their options
+        for the `ca xxx' sections of the `ipsec.conf' file.
+      '';
+    };
+  };
+
+  config = with cfg; mkIf enable {
+    systemd.services.strongswan = {
+      description = "strongSwan IPSec service";
+      wantedBy = [ "multi-user.target" ];
+      path = with pkgs; [ kmod ]; # XXX Linux
+      wants = [ "keys.target" ];
+      after = [ "network.target" "keys.target" ];
+      environment = {
+        STRONGSWAN_CONF = strongswanConf { inherit setup connections ca secrets; };
+      };
+      serviceConfig = {
+        ExecStart  = "${pkgs.strongswan}/sbin/ipsec start --nofork";
+      };
+    };
+  };
+}
+