feat(settings): load wireguard individual fields as secret files (#1348)
- Private key from `/run/secrets/wireguard_private_key` (path configurable with `WIREGUARD_PRIVATE_KEY_SECRETFILE`) - Preshared key from `/run/secrets/wireguard_preshared_key` (path configurable with `WIREGUARD_PRESHARED_KEY_SECRETFILE`) - Addresses from `/run/secrets/wireguard_addresses` (path configurable with `WIREGUARD_ADDRESSES_SECRETFILE`)
This commit is contained in:
@@ -95,10 +95,13 @@ ENV VPN_SERVICE_PROVIDER=pia \
|
|||||||
# Wireguard
|
# Wireguard
|
||||||
WIREGUARD_CONF_SECRETFILE=/run/secrets/wg0.conf \
|
WIREGUARD_CONF_SECRETFILE=/run/secrets/wg0.conf \
|
||||||
WIREGUARD_PRIVATE_KEY= \
|
WIREGUARD_PRIVATE_KEY= \
|
||||||
|
WIREGUARD_PRIVATE_KEY_SECRETFILE=/run/secrets/wireguard_private_key \
|
||||||
WIREGUARD_PRESHARED_KEY= \
|
WIREGUARD_PRESHARED_KEY= \
|
||||||
|
WIREGUARD_PRESHARED_KEY_SECRETFILE=/run/secrets/wireguard_preshared_key \
|
||||||
WIREGUARD_PUBLIC_KEY= \
|
WIREGUARD_PUBLIC_KEY= \
|
||||||
WIREGUARD_ALLOWED_IPS= \
|
WIREGUARD_ALLOWED_IPS= \
|
||||||
WIREGUARD_ADDRESSES= \
|
WIREGUARD_ADDRESSES= \
|
||||||
|
WIREGUARD_ADDRESSES_SECRETFILE=/run/secrets/wireguard_addresses \
|
||||||
WIREGUARD_MTU=1400 \
|
WIREGUARD_MTU=1400 \
|
||||||
WIREGUARD_IMPLEMENTATION=auto \
|
WIREGUARD_IMPLEMENTATION=auto \
|
||||||
# VPN server filtering
|
# VPN server filtering
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package secrets
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/netip"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/sources/files"
|
"github.com/qdm12/gluetun/internal/configuration/sources/files"
|
||||||
"github.com/qdm12/gluetun/internal/openvpn/extract"
|
"github.com/qdm12/gluetun/internal/openvpn/extract"
|
||||||
@@ -35,3 +37,22 @@ func (s *Source) readPEMSecretFile(secretPathEnvKey, defaultSecretPath string) (
|
|||||||
|
|
||||||
return &base64Data, nil
|
return &base64Data, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func parseAddresses(addressesCSV string) (addresses []netip.Prefix, err error) {
|
||||||
|
if addressesCSV == "" {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
addressStrings := strings.Split(addressesCSV, ",")
|
||||||
|
addresses = make([]netip.Prefix, len(addressStrings))
|
||||||
|
for i, addressString := range addressStrings {
|
||||||
|
addressString = strings.TrimSpace(addressString)
|
||||||
|
addresses[i], err = netip.ParsePrefix(addressString)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("parsing address %d of %d: %w",
|
||||||
|
i+1, len(addressStrings), err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return addresses, nil
|
||||||
|
}
|
||||||
|
|||||||
@@ -12,5 +12,10 @@ func (s *Source) readVPN() (vpn settings.VPN, err error) {
|
|||||||
return vpn, fmt.Errorf("reading OpenVPN settings: %w", err)
|
return vpn, fmt.Errorf("reading OpenVPN settings: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vpn.Wireguard, err = s.readWireguard()
|
||||||
|
if err != nil {
|
||||||
|
return vpn, fmt.Errorf("reading Wireguard settings: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
return vpn, nil
|
return vpn, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,7 +15,38 @@ func (s *Source) readWireguard() (settings settings.Wireguard, err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return settings, fmt.Errorf("reading Wireguard conf secret file: %w", err)
|
return settings, fmt.Errorf("reading Wireguard conf secret file: %w", err)
|
||||||
} else if wireguardConf != nil {
|
} else if wireguardConf != nil {
|
||||||
|
// Wireguard ini config file takes precedence over individual secrets
|
||||||
return files.ParseWireguardConf([]byte(*wireguardConf))
|
return files.ParseWireguardConf([]byte(*wireguardConf))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
settings.PrivateKey, err = s.readSecretFileAsStringPtr(
|
||||||
|
"WIREGUARD_PRIVATE_KEY_SECRETFILE",
|
||||||
|
"/run/secrets/wireguard_private_key",
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return settings, fmt.Errorf("reading private key file: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
settings.PreSharedKey, err = s.readSecretFileAsStringPtr(
|
||||||
|
"WIREGUARD_PRESHARED_KEY_SECRETFILE",
|
||||||
|
"/run/secrets/wireguard_preshared_key",
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return settings, fmt.Errorf("reading preshared key file: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
wireguardAddressesCSV, err := s.readSecretFileAsStringPtr(
|
||||||
|
"WIREGUARD_ADDRESSES_SECRETFILE",
|
||||||
|
"/run/secrets/wireguard_addresses",
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return settings, fmt.Errorf("reading addresses file: %w", err)
|
||||||
|
} else if wireguardAddressesCSV != nil {
|
||||||
|
settings.Addresses, err = parseAddresses(*wireguardAddressesCSV)
|
||||||
|
if err != nil {
|
||||||
|
return settings, fmt.Errorf("parsing addresses: %w", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return settings, nil
|
return settings, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user