mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-06-12 12:45:27 +03:00
nixos/wg-access-server: init module
This commit is contained in:
parent
28106064d7
commit
369cfec06d
5 changed files with 159 additions and 0 deletions
|
@ -1222,6 +1222,7 @@
|
||||||
./services/networking/vsftpd.nix
|
./services/networking/vsftpd.nix
|
||||||
./services/networking/wasabibackend.nix
|
./services/networking/wasabibackend.nix
|
||||||
./services/networking/websockify.nix
|
./services/networking/websockify.nix
|
||||||
|
./services/networking/wg-access-server.nix
|
||||||
./services/networking/wg-netmanager.nix
|
./services/networking/wg-netmanager.nix
|
||||||
./services/networking/webhook.nix
|
./services/networking/webhook.nix
|
||||||
./services/networking/wg-quick.nix
|
./services/networking/wg-quick.nix
|
||||||
|
|
124
nixos/modules/services/networking/wg-access-server.nix
Normal file
124
nixos/modules/services/networking/wg-access-server.nix
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
let
|
||||||
|
inherit (lib) mkEnableOption mkPackageOption mkOption types;
|
||||||
|
|
||||||
|
cfg = config.services.wg-access-server;
|
||||||
|
|
||||||
|
settingsFormat = pkgs.formats.yaml { };
|
||||||
|
configFile = settingsFormat.generate "config.yaml" cfg.settings;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
options.services.wg-access-server = {
|
||||||
|
enable = mkEnableOption "wg-access-server";
|
||||||
|
|
||||||
|
package = mkPackageOption pkgs "wg-access-server" { };
|
||||||
|
|
||||||
|
settings = mkOption {
|
||||||
|
type = lib.types.submodule {
|
||||||
|
freeformType = settingsFormat.type;
|
||||||
|
options = {
|
||||||
|
dns.enable = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = ''
|
||||||
|
Enable/disable the embedded DNS proxy server.
|
||||||
|
This is enabled by default and allows VPN clients to avoid DNS leaks by sending all DNS requests to wg-access-server itself.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
storage = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "sqlite3://db.sqlite";
|
||||||
|
description = "A storage backend connection string. See [storage docs](https://www.freie-netze.org/wg-access-server/3-storage/)";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
description = "See https://www.freie-netze.org/wg-access-server/2-configuration/ for possible options";
|
||||||
|
};
|
||||||
|
|
||||||
|
secretsFile = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
description = ''
|
||||||
|
yaml file containing all secrets. this needs to be in the same structure as the configuration.
|
||||||
|
|
||||||
|
This must to contain the admin password and wireguard private key.
|
||||||
|
As well as the secrets for your auth backend.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```yaml
|
||||||
|
adminPassword: <admin password>
|
||||||
|
wireguard:
|
||||||
|
privateKey: <wireguard private key>
|
||||||
|
auth:
|
||||||
|
oidc:
|
||||||
|
clientSecret: <client secret>
|
||||||
|
```
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
assertions =
|
||||||
|
map
|
||||||
|
(attrPath:
|
||||||
|
{
|
||||||
|
assertion = !lib.hasAttrByPath attrPath config.services.wg-access-server.settings;
|
||||||
|
message = ''
|
||||||
|
{option}`services.wg-access-server.settings.${lib.concatStringsSep "." attrPath}` must definded
|
||||||
|
in {option}`services.wg-access-server.secretsFile`.
|
||||||
|
'';
|
||||||
|
})
|
||||||
|
[
|
||||||
|
[ "adminPassword" ]
|
||||||
|
[ "wireguard" "privateKey" ]
|
||||||
|
[ "auth" "sessionStore" ]
|
||||||
|
[ "auth" "oidc" "clientSecret" ]
|
||||||
|
[ "auth" "gitlab" "clientSecret" ]
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.kernel.sysctl = {
|
||||||
|
"net.ipv4.conf.all.forwarding" = "1";
|
||||||
|
"net.ipv6.conf.all.forwarding" = "1";
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.wg-access-server = {
|
||||||
|
description = "WG access server";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
requires = [ "network-online.target" ];
|
||||||
|
after = [ "network-online.target" ];
|
||||||
|
script = ''
|
||||||
|
# merge secrets into main config
|
||||||
|
yq eval-all "select(fileIndex == 0) * select(fileIndex == 1)" ${configFile} $CREDENTIALS_DIRECTORY/SECRETS_FILE \
|
||||||
|
> "$STATE_DIRECTORY/config.yml"
|
||||||
|
|
||||||
|
${lib.getExe cfg.package} serve --config "$STATE_DIRECTORY/config.yml"
|
||||||
|
'';
|
||||||
|
|
||||||
|
path = with pkgs; [
|
||||||
|
iptables
|
||||||
|
# needed by startup script
|
||||||
|
yq-go
|
||||||
|
];
|
||||||
|
|
||||||
|
serviceConfig =
|
||||||
|
let
|
||||||
|
capabilities = [
|
||||||
|
"CAP_NET_ADMIN"
|
||||||
|
] ++ lib.optional cfg.settings.dns.enabled "CAP_NET_BIND_SERVICE";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
WorkingDirectory = "/var/lib/wg-access-server";
|
||||||
|
StateDirectory = "wg-access-server";
|
||||||
|
|
||||||
|
LoadCredential = [
|
||||||
|
"SECRETS_FILE:${cfg.secretsFile}"
|
||||||
|
];
|
||||||
|
|
||||||
|
# Hardening
|
||||||
|
DynamicUser = true;
|
||||||
|
AmbientCapabilities = capabilities;
|
||||||
|
CapabilityBoundingSet = capabilities;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
|
@ -1036,6 +1036,7 @@ in {
|
||||||
wiki-js = handleTest ./wiki-js.nix {};
|
wiki-js = handleTest ./wiki-js.nix {};
|
||||||
wine = handleTest ./wine.nix {};
|
wine = handleTest ./wine.nix {};
|
||||||
wireguard = handleTest ./wireguard {};
|
wireguard = handleTest ./wireguard {};
|
||||||
|
wg-access-server = handleTest ./wg-access-server.nix {};
|
||||||
without-nix = handleTest ./without-nix.nix {};
|
without-nix = handleTest ./without-nix.nix {};
|
||||||
wmderland = handleTest ./wmderland.nix {};
|
wmderland = handleTest ./wmderland.nix {};
|
||||||
workout-tracker = handleTest ./workout-tracker.nix {};
|
workout-tracker = handleTest ./workout-tracker.nix {};
|
||||||
|
|
28
nixos/tests/wg-access-server.nix
Normal file
28
nixos/tests/wg-access-server.nix
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
import ./make-test-python.nix ({ pkgs, lib, kernelPackages ? null, ... }:
|
||||||
|
{
|
||||||
|
name = "wg-access-server";
|
||||||
|
meta = with pkgs.lib.maintainers; {
|
||||||
|
maintainers = [ xanderio ];
|
||||||
|
};
|
||||||
|
|
||||||
|
nodes = {
|
||||||
|
server = {
|
||||||
|
services.wg-access-server = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
adminUsername = "admin";
|
||||||
|
};
|
||||||
|
secretsFile = (pkgs.writers.writeYAML "secrets.yaml" {
|
||||||
|
adminPassword = "hunter2";
|
||||||
|
});
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript = ''
|
||||||
|
start_all()
|
||||||
|
|
||||||
|
server.wait_for_unit("wg-access-server.service")
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
)
|
|
@ -4,6 +4,7 @@
|
||||||
, fetchFromGitHub
|
, fetchFromGitHub
|
||||||
, makeWrapper
|
, makeWrapper
|
||||||
, iptables
|
, iptables
|
||||||
|
, nixosTests
|
||||||
}:
|
}:
|
||||||
|
|
||||||
buildGoModule rec {
|
buildGoModule rec {
|
||||||
|
@ -56,6 +57,10 @@ buildGoModule rec {
|
||||||
--prefix PATH : ${lib.makeBinPath [ iptables ]}
|
--prefix PATH : ${lib.makeBinPath [ iptables ]}
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
passthru = {
|
||||||
|
tests = { inherit (nixosTests) wg-access-server; };
|
||||||
|
};
|
||||||
|
|
||||||
meta = with lib; {
|
meta = with lib; {
|
||||||
description = "An all-in-one WireGuard VPN solution with a web ui for connecting devices";
|
description = "An all-in-one WireGuard VPN solution with a web ui for connecting devices";
|
||||||
homepage = "https://github.com/freifunkMUC/wg-access-server";
|
homepage = "https://github.com/freifunkMUC/wg-access-server";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue