feat(pf): VPN_PORT_FORWARDING_PROVIDER variable (#1616)
This commit is contained in:
@@ -110,6 +110,7 @@ ENV VPN_SERVICE_PROVIDER=pia \
|
|||||||
# # Private Internet Access only:
|
# # Private Internet Access only:
|
||||||
PRIVATE_INTERNET_ACCESS_OPENVPN_ENCRYPTION_PRESET= \
|
PRIVATE_INTERNET_ACCESS_OPENVPN_ENCRYPTION_PRESET= \
|
||||||
VPN_PORT_FORWARDING=off \
|
VPN_PORT_FORWARDING=off \
|
||||||
|
VPN_PORT_FORWARDING_PROVIDER= \
|
||||||
VPN_PORT_FORWARDING_STATUS_FILE="/tmp/gluetun/forwarded_port" \
|
VPN_PORT_FORWARDING_STATUS_FILE="/tmp/gluetun/forwarded_port" \
|
||||||
# # Cyberghost only:
|
# # Cyberghost only:
|
||||||
OPENVPN_CERT= \
|
OPENVPN_CERT= \
|
||||||
|
|||||||
@@ -15,6 +15,14 @@ type PortForwarding struct {
|
|||||||
// Enabled is true if port forwarding should be activated.
|
// Enabled is true if port forwarding should be activated.
|
||||||
// It cannot be nil for the internal state.
|
// It cannot be nil for the internal state.
|
||||||
Enabled *bool `json:"enabled"`
|
Enabled *bool `json:"enabled"`
|
||||||
|
// Provider is set to specify which custom port forwarding code
|
||||||
|
// should be used. This is especially necessary for the custom
|
||||||
|
// provider using Wireguard for a provider where Wireguard is not
|
||||||
|
// natively supported but custom port forwading code is available.
|
||||||
|
// It defaults to the empty string, meaning the current provider
|
||||||
|
// should be the one used for port forwarding.
|
||||||
|
// It cannot be nil for the internal state.
|
||||||
|
Provider *string `json:"provider"`
|
||||||
// Filepath is the port forwarding status file path
|
// Filepath is the port forwarding status file path
|
||||||
// to use. It can be the empty string to indicate not
|
// to use. It can be the empty string to indicate not
|
||||||
// to write to a file. It cannot be nil for the
|
// to write to a file. It cannot be nil for the
|
||||||
@@ -27,9 +35,13 @@ func (p PortForwarding) validate(vpnProvider string) (err error) {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Validate Enabled
|
// Validate current provider or custom provider specified
|
||||||
|
providerSelected := vpnProvider
|
||||||
|
if *p.Provider != "" {
|
||||||
|
providerSelected = *p.Provider
|
||||||
|
}
|
||||||
validProviders := []string{providers.PrivateInternetAccess}
|
validProviders := []string{providers.PrivateInternetAccess}
|
||||||
if err = validate.IsOneOf(vpnProvider, validProviders...); err != nil {
|
if err = validate.IsOneOf(providerSelected, validProviders...); err != nil {
|
||||||
return fmt.Errorf("%w: %w", ErrPortForwardingEnabled, err)
|
return fmt.Errorf("%w: %w", ErrPortForwardingEnabled, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,22 +59,26 @@ func (p PortForwarding) validate(vpnProvider string) (err error) {
|
|||||||
func (p *PortForwarding) copy() (copied PortForwarding) {
|
func (p *PortForwarding) copy() (copied PortForwarding) {
|
||||||
return PortForwarding{
|
return PortForwarding{
|
||||||
Enabled: gosettings.CopyPointer(p.Enabled),
|
Enabled: gosettings.CopyPointer(p.Enabled),
|
||||||
|
Provider: gosettings.CopyPointer(p.Provider),
|
||||||
Filepath: gosettings.CopyPointer(p.Filepath),
|
Filepath: gosettings.CopyPointer(p.Filepath),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PortForwarding) mergeWith(other PortForwarding) {
|
func (p *PortForwarding) mergeWith(other PortForwarding) {
|
||||||
p.Enabled = gosettings.MergeWithPointer(p.Enabled, other.Enabled)
|
p.Enabled = gosettings.MergeWithPointer(p.Enabled, other.Enabled)
|
||||||
|
p.Provider = gosettings.MergeWithPointer(p.Provider, other.Provider)
|
||||||
p.Filepath = gosettings.MergeWithPointer(p.Filepath, other.Filepath)
|
p.Filepath = gosettings.MergeWithPointer(p.Filepath, other.Filepath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PortForwarding) overrideWith(other PortForwarding) {
|
func (p *PortForwarding) overrideWith(other PortForwarding) {
|
||||||
p.Enabled = gosettings.OverrideWithPointer(p.Enabled, other.Enabled)
|
p.Enabled = gosettings.OverrideWithPointer(p.Enabled, other.Enabled)
|
||||||
|
p.Provider = gosettings.OverrideWithPointer(p.Provider, other.Provider)
|
||||||
p.Filepath = gosettings.OverrideWithPointer(p.Filepath, other.Filepath)
|
p.Filepath = gosettings.OverrideWithPointer(p.Filepath, other.Filepath)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PortForwarding) setDefaults() {
|
func (p *PortForwarding) setDefaults() {
|
||||||
p.Enabled = gosettings.DefaultPointer(p.Enabled, false)
|
p.Enabled = gosettings.DefaultPointer(p.Enabled, false)
|
||||||
|
p.Provider = gosettings.DefaultPointer(p.Provider, "")
|
||||||
p.Filepath = gosettings.DefaultPointer(p.Filepath, "/tmp/gluetun/forwarded_port")
|
p.Filepath = gosettings.DefaultPointer(p.Filepath, "/tmp/gluetun/forwarded_port")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,7 +92,11 @@ func (p PortForwarding) toLinesNode() (node *gotree.Node) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
node = gotree.New("Automatic port forwarding settings:")
|
node = gotree.New("Automatic port forwarding settings:")
|
||||||
node.Appendf("Enabled: yes")
|
if *p.Provider == "" {
|
||||||
|
node.Appendf("Use port forwarding code for current provider")
|
||||||
|
} else {
|
||||||
|
node.Appendf("Use code for provider: %s", *p.Provider)
|
||||||
|
}
|
||||||
|
|
||||||
filepath := *p.Filepath
|
filepath := *p.Filepath
|
||||||
if filepath == "" {
|
if filepath == "" {
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ func (s *Source) readPortForward() (
|
|||||||
return portForwarding, err
|
return portForwarding, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
portForwarding.Provider = s.env.Get("VPN_PORT_FORWARDING_PROVIDER")
|
||||||
|
|
||||||
portForwarding.Filepath = s.env.Get("VPN_PORT_FORWARDING_STATUS_FILE",
|
portForwarding.Filepath = s.env.Get("VPN_PORT_FORWARDING_STATUS_FILE",
|
||||||
env.ForceLowercase(false),
|
env.ForceLowercase(false),
|
||||||
env.RetroKeys(
|
env.RetroKeys(
|
||||||
|
|||||||
@@ -23,6 +23,12 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) {
|
|||||||
providerConf := l.providers.Get(*settings.Provider.Name)
|
providerConf := l.providers.Get(*settings.Provider.Name)
|
||||||
|
|
||||||
portForwarding := *settings.Provider.PortForwarding.Enabled
|
portForwarding := *settings.Provider.PortForwarding.Enabled
|
||||||
|
customPortForwardingProvider := *settings.Provider.PortForwarding.Provider
|
||||||
|
portForwader := providerConf
|
||||||
|
if portForwarding && customPortForwardingProvider != "" {
|
||||||
|
portForwader = l.providers.Get(customPortForwardingProvider)
|
||||||
|
}
|
||||||
|
|
||||||
var vpnRunner interface {
|
var vpnRunner interface {
|
||||||
Run(ctx context.Context, waitError chan<- error, tunnelReady chan<- struct{})
|
Run(ctx context.Context, waitError chan<- error, tunnelReady chan<- struct{})
|
||||||
}
|
}
|
||||||
@@ -45,7 +51,7 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) {
|
|||||||
tunnelUpData := tunnelUpData{
|
tunnelUpData := tunnelUpData{
|
||||||
portForwarding: portForwarding,
|
portForwarding: portForwarding,
|
||||||
serverName: serverName,
|
serverName: serverName,
|
||||||
portForwarder: providerConf,
|
portForwarder: portForwader,
|
||||||
vpnIntf: vpnInterface,
|
vpnIntf: vpnInterface,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user