feat(security): restrict internal services to tailscale

- Add `internalOnly` option to nginx module to block public access.

- Apply `internalOnly` flag to Forgejo and Vaultwarden to ensure they are only accessible over the VPN or localhost.
This commit is contained in:
ashisgreat22 2026-03-19 22:35:33 +01:00
parent b0b0989d36
commit f31ec2ce65
3 changed files with 14 additions and 0 deletions

View file

@ -97,6 +97,7 @@ in
# Nginx Reverse Proxy # Nginx Reverse Proxy
myModules.nginx.domains."${cfg.domain}" = { myModules.nginx.domains."${cfg.domain}" = {
port = cfg.port; port = cfg.port;
internalOnly = true;
extraConfig = '' extraConfig = ''
client_max_body_size 512M; client_max_body_size 512M;
''; '';

View file

@ -74,6 +74,12 @@ in
description = "Content-Security-Policy header value. Set to null to omit."; description = "Content-Security-Policy header value. Set to null to omit.";
}; };
internalOnly = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Restrict access to Tailscale network and localhost only";
};
rateLimit = { rateLimit = {
enable = lib.mkOption { enable = lib.mkOption {
type = lib.types.nullOr lib.types.bool; type = lib.types.nullOr lib.types.bool;
@ -156,6 +162,12 @@ in
# Security headers applied per-vhost # Security headers applied per-vhost
extraConfig = '' extraConfig = ''
${lib.optionalString opts.internalOnly ''
# Restrict access to Tailscale network
allow 100.64.0.0/10;
allow 127.0.0.0/8;
deny all;
''}
# Strict Transport Security — 6 months, include subdomains, preload-ready # Strict Transport Security — 6 months, include subdomains, preload-ready
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always; add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;

View file

@ -111,6 +111,7 @@ in
# Add nginx configuration for WebSocket support # Add nginx configuration for WebSocket support
myModules.nginx.domains.${cfg.domain} = { myModules.nginx.domains.${cfg.domain} = {
port = cfg.port; port = cfg.port;
internalOnly = true;
extraConfig = '' extraConfig = ''
client_max_body_size 128M; client_max_body_size 128M;
''; '';