chore(internal/providers): simplify OpenVPN config building
This commit is contained in:
@@ -41,10 +41,8 @@ func (c *CLI) OpenvpnConfig(logger OpenvpnConfigLogger, source sources.Source) e
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
lines, err := providerConf.BuildConf(connection, allSettings.VPN.OpenVPN)
|
|
||||||
if err != nil {
|
lines := providerConf.BuildConf(connection, allSettings.VPN.OpenVPN)
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
fmt.Println(strings.Join(lines, "\n"))
|
fmt.Println(strings.Join(lines, "\n"))
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package models
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"net"
|
"net"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -28,14 +27,6 @@ func (c *Connection) Equal(other Connection) bool {
|
|||||||
c.PubKey == other.PubKey
|
c.PubKey == other.PubKey
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Connection) OpenVPNRemoteLine() (line string) {
|
|
||||||
return "remote " + c.IP.String() + " " + fmt.Sprint(c.Port)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c Connection) OpenVPNProtoLine() (line string) {
|
|
||||||
return "proto " + c.Protocol
|
|
||||||
}
|
|
||||||
|
|
||||||
// UpdateEmptyWith updates each field of the connection where the
|
// UpdateEmptyWith updates each field of the connection where the
|
||||||
// value is not set using the value given as arguments.
|
// value is not set using the value given as arguments.
|
||||||
func (c *Connection) UpdateEmptyWith(ip net.IP, port uint16, protocol string) {
|
func (c *Connection) UpdateEmptyWith(ip net.IP, port uint16, protocol string) {
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ import (
|
|||||||
var ErrExtractData = errors.New("failed extracting information from custom configuration file")
|
var ErrExtractData = errors.New("failed extracting information from custom configuration file")
|
||||||
|
|
||||||
func (p *Provider) BuildConf(connection models.Connection,
|
func (p *Provider) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
lines, _, err = p.extractor.Data(*settings.ConfFile)
|
lines, _, err := p.extractor.Data(*settings.ConfFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// Configuration file is already validated in settings validation in
|
// Configuration file is already validated in settings validation in
|
||||||
// internal/configuration/settings/openvpn.go in `validateOpenVPNConfigFilepath`.
|
// internal/configuration/settings/openvpn.go in `validateOpenVPNConfigFilepath`.
|
||||||
@@ -26,7 +26,7 @@ func (p *Provider) BuildConf(connection models.Connection,
|
|||||||
|
|
||||||
lines = modifyConfig(lines, connection, settings)
|
lines = modifyConfig(lines, connection, settings)
|
||||||
|
|
||||||
return lines, nil
|
return lines
|
||||||
}
|
}
|
||||||
|
|
||||||
func modifyConfig(lines []string, connection models.Connection,
|
func modifyConfig(lines []string, connection models.Connection,
|
||||||
@@ -66,8 +66,8 @@ func modifyConfig(lines []string, connection models.Connection,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Add values
|
// Add values
|
||||||
modified = append(modified, connection.OpenVPNProtoLine())
|
modified = append(modified, "proto "+connection.Protocol)
|
||||||
modified = append(modified, connection.OpenVPNRemoteLine())
|
modified = append(modified, fmt.Sprintf("remote %s %d", connection.IP, connection.Port))
|
||||||
modified = append(modified, "dev "+settings.Interface)
|
modified = append(modified, "dev "+settings.Interface)
|
||||||
modified = append(modified, "mute-replay-warnings")
|
modified = append(modified, "mute-replay-warnings")
|
||||||
modified = append(modified, "auth-nocache")
|
modified = append(modified, "auth-nocache")
|
||||||
|
|||||||
@@ -1,93 +1,26 @@
|
|||||||
package cyberghost
|
package cyberghost
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
"github.com/qdm12/gluetun/internal/openvpn/parse"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (c *Cyberghost) BuildConf(connection models.Connection,
|
func (c *Cyberghost) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
//nolint:gomnd
|
||||||
settings.Ciphers = []string{
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
|
RemoteCertTLS: true,
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
constants.AES256gcm,
|
constants.AES256gcm,
|
||||||
constants.AES256cbc,
|
constants.AES256cbc,
|
||||||
constants.AES128gcm,
|
constants.AES128gcm,
|
||||||
}
|
},
|
||||||
|
Auth: constants.SHA256,
|
||||||
|
Ping: 10,
|
||||||
|
CA: constants.CyberghostCA,
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA256
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Cyberghost specific
|
|
||||||
"ping 10",
|
|
||||||
"remote-cert-tls server",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.CyberghostCA)...)
|
|
||||||
|
|
||||||
certData, err := parse.ExtractCert([]byte(*settings.ClientCrt))
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("client cert is not valid: %w", err)
|
|
||||||
}
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCert(certData)...)
|
|
||||||
|
|
||||||
keyData, err := parse.ExtractPrivateKey([]byte(*settings.ClientKey))
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("client key is not valid: %w", err)
|
|
||||||
}
|
|
||||||
lines = append(lines, utils.WrapOpenvpnKey(keyData)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package expressvpn
|
package expressvpn
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,79 +8,28 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (p *Provider) BuildConf(connection models.Connection,
|
func (p *Provider) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
//nolint:gomnd
|
||||||
settings.Ciphers = []string{constants.AES256cbc}
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
|
RemoteCertTLS: true,
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256cbc,
|
||||||
|
},
|
||||||
|
Auth: constants.SHA512,
|
||||||
|
CA: constants.ExpressvpnCA,
|
||||||
|
Cert: constants.ExpressvpnCert,
|
||||||
|
RSAKey: constants.ExpressvpnRSAKey,
|
||||||
|
TLSAuth: constants.ExpressvpnTLSAuth,
|
||||||
|
MssFix: 1200,
|
||||||
|
FastIO: true,
|
||||||
|
Fragment: 1300,
|
||||||
|
SndBuf: 524288,
|
||||||
|
RcvBuf: 524288,
|
||||||
|
KeyDirection: "1",
|
||||||
|
VerifyX509Type: "name-prefix",
|
||||||
|
// Always verify against `Server` x509 name prefix, security hole I guess?
|
||||||
|
VerifyX509Name: "Server",
|
||||||
}
|
}
|
||||||
auth := *settings.Auth
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA512
|
|
||||||
}
|
|
||||||
|
|
||||||
mssFix := *settings.MSSFix
|
|
||||||
if mssFix == 0 {
|
|
||||||
const defaultMSSFix = 1200
|
|
||||||
mssFix = defaultMSSFix
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Expressvpn specific
|
|
||||||
"fast-io",
|
|
||||||
"fragment 1300",
|
|
||||||
"mssfix " + strconv.Itoa(int(mssFix)),
|
|
||||||
"sndbuf 524288",
|
|
||||||
"rcvbuf 524288",
|
|
||||||
"verify-x509-name Server name-prefix", // security hole I guess?
|
|
||||||
"remote-cert-tls server", // updated name of ns-cert-type
|
|
||||||
"key-direction 1",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"auth-nocache",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Modified variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCert(
|
|
||||||
constants.ExpressvpnCert)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnRSAKey(
|
|
||||||
constants.ExpressvpnRSAKey)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSAuth(
|
|
||||||
constants.ExpressvpnTLSAuth)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.ExpressvpnCA)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package fastestvpn
|
package fastestvpn
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,74 +8,28 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (f *Fastestvpn) BuildConf(connection models.Connection,
|
func (f *Fastestvpn) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
//nolint:gomnd
|
||||||
settings.Ciphers = []string{constants.AES256cbc}
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256cbc,
|
||||||
|
},
|
||||||
|
MssFix: 1450,
|
||||||
|
TLSCipher: "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA", //nolint:lll
|
||||||
|
AuthToken: true,
|
||||||
|
KeyDirection: "1",
|
||||||
|
RenegDisabled: true,
|
||||||
|
CA: constants.FastestvpnCA,
|
||||||
|
TLSAuth: constants.FastestvpnTLSAuth,
|
||||||
|
UDPLines: []string{
|
||||||
|
"tun-mtu 1500",
|
||||||
|
"tun-mtu-extra 32",
|
||||||
|
"ping 15",
|
||||||
|
},
|
||||||
|
ExtraLines: []string{
|
||||||
|
"comp-lzo",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
auth := *settings.Auth
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA256
|
|
||||||
}
|
|
||||||
|
|
||||||
mssFix := *settings.MSSFix
|
|
||||||
if mssFix == 0 {
|
|
||||||
mssFix = 1450
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Fastestvpn specific
|
|
||||||
"mssfix " + strconv.Itoa(int(mssFix)), // defaults to 1450
|
|
||||||
"tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-RSA-WITH-CAMELLIA-256-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA", //nolint:lll
|
|
||||||
"key-direction 1",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
"comp-lzo",
|
|
||||||
"reneg-sec 0",
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
// "pull-filter ignore \"auth-token\"", // needed for FastestVPN
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
lines = append(lines, "tun-mtu 1500") // FastestVPN specific
|
|
||||||
lines = append(lines, "tun-mtu-extra 32") // FastestVPN specific
|
|
||||||
lines = append(lines, "ping 15") // FastestVPN specific
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.FastestvpnCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSAuth(
|
|
||||||
constants.FastestvpnTLSAuth)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package hidemyass
|
package hidemyass
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,68 +8,18 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (h *HideMyAss) BuildConf(connection models.Connection,
|
func (h *HideMyAss) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
//nolint:gomnd
|
||||||
settings.Ciphers = []string{constants.AES256cbc}
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256cbc,
|
||||||
|
},
|
||||||
|
RemoteCertTLS: true,
|
||||||
|
CA: constants.HideMyAssCA,
|
||||||
|
Cert: constants.HideMyAssCert,
|
||||||
|
RSAKey: constants.HideMyAssRSAKey,
|
||||||
|
Ping: 5,
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// HideMyAss specific
|
|
||||||
"ping 5",
|
|
||||||
"remote-cert-tls server", // updated name of ns-cert-type
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"auth-nocache",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if *settings.Auth != "" {
|
|
||||||
lines = append(lines, "auth "+*settings.Auth)
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.HideMyAssCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCert(
|
|
||||||
constants.HideMyAssCert)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnRSAKey(
|
|
||||||
constants.HideMyAssRSAKey)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package ipvanish
|
package ipvanish
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,64 +8,16 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (i *Ipvanish) BuildConf(connection models.Connection,
|
func (i *Ipvanish) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
settings.Ciphers = []string{constants.AES256cbc}
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256cbc,
|
||||||
|
},
|
||||||
|
Auth: constants.SHA256,
|
||||||
|
VerifyX509Type: "name",
|
||||||
|
TLSCipher: "TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-DSS-WITH-AES-256-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA",
|
||||||
|
CA: constants.IpvanishCA,
|
||||||
}
|
}
|
||||||
auth := *settings.Auth
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA256
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Ipvanish specific
|
|
||||||
"verify-x509-name " + connection.Hostname + " name",
|
|
||||||
"tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-DSS-WITH-AES-256-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"auth-nocache",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(constants.IpvanishCA)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
package ivpn
|
package ivpn
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -11,71 +8,22 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (i *Ivpn) BuildConf(connection models.Connection,
|
func (i *Ivpn) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
//nolint:gomnd
|
||||||
settings.Ciphers = []string{constants.AES256cbc}
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256cbc,
|
||||||
|
},
|
||||||
|
Ping: 5,
|
||||||
|
RemoteCertTLS: true,
|
||||||
|
VerifyX509Type: "name-prefix",
|
||||||
|
TLSCipher: "TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-DSS-WITH-AES-256-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA",
|
||||||
|
CA: constants.IvpnCA,
|
||||||
|
TLSAuth: constants.IvpnTLSAuth,
|
||||||
|
ExtraLines: []string{
|
||||||
|
"key-direction 1",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
namePrefix := strings.Split(connection.Hostname, ".")[0]
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// IVPN specific
|
|
||||||
"ping 5",
|
|
||||||
"remote-cert-tls server", // updated name of ns-cert-type
|
|
||||||
"key-direction 1",
|
|
||||||
"verify-x509-name " + namePrefix + " name-prefix",
|
|
||||||
"tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-DSS-WITH-AES-256-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"auth-nocache",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if *settings.Auth != "" {
|
|
||||||
lines = append(lines, "auth "+*settings.Auth)
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.IvpnCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSAuth(
|
|
||||||
constants.IvpnTLSAuth)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package mullvad
|
package mullvad
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,73 +8,21 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (m *Mullvad) BuildConf(connection models.Connection,
|
func (m *Mullvad) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
//nolint:gomnd
|
||||||
settings.Ciphers = []string{constants.AES256cbc, constants.AES128gcm}
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256cbc,
|
||||||
|
constants.AES128gcm,
|
||||||
|
},
|
||||||
|
Ping: 10,
|
||||||
|
RemoteCertTLS: true,
|
||||||
|
TLSCipher: "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA",
|
||||||
|
SndBuf: 524288,
|
||||||
|
RcvBuf: 524288,
|
||||||
|
CA: constants.MullvadCA,
|
||||||
|
UDPLines: []string{"fast-io"},
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
|
|
||||||
// Mullvad specific
|
|
||||||
"ping 10",
|
|
||||||
"remote-cert-tls server",
|
|
||||||
"sndbuf 524288",
|
|
||||||
"rcvbuf 524288",
|
|
||||||
"tls-cipher TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA",
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if *settings.Auth != "" {
|
|
||||||
lines = append(lines, "auth "+*settings.Auth)
|
|
||||||
}
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "fast-io")
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.MullvadCA)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package nordvpn
|
package nordvpn
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,75 +8,29 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (n *Nordvpn) BuildConf(connection models.Connection,
|
func (n *Nordvpn) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
//nolint:gomnd
|
||||||
settings.Ciphers = []string{constants.AES256cbc, constants.AES256gcm}
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256cbc,
|
||||||
|
constants.AES256gcm,
|
||||||
|
},
|
||||||
|
Auth: constants.SHA512,
|
||||||
|
Ping: 15,
|
||||||
|
RemoteCertTLS: true,
|
||||||
|
MssFix: 1450,
|
||||||
|
CA: constants.NordvpnCA,
|
||||||
|
TLSAuth: constants.NordvpnTLSAuth,
|
||||||
|
TunMTUExtra: 32,
|
||||||
|
RenegDisabled: true,
|
||||||
|
KeyDirection: "1",
|
||||||
|
UDPLines: []string{
|
||||||
|
"fast-io",
|
||||||
|
},
|
||||||
|
ExtraLines: []string{
|
||||||
|
"comp-lzo no", // Explicitly disable compression
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA512
|
|
||||||
}
|
|
||||||
|
|
||||||
mssFix := *settings.MSSFix
|
|
||||||
if mssFix == 0 {
|
|
||||||
mssFix = 1450
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Nordvpn specific
|
|
||||||
"tun-mtu-extra 32",
|
|
||||||
"mssfix " + strconv.Itoa(int(mssFix)),
|
|
||||||
"ping 15",
|
|
||||||
"remote-cert-tls server",
|
|
||||||
"reneg-sec 0",
|
|
||||||
"key-direction 1",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
"comp-lzo no", // Explicitly disable compression
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "fast-io")
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.NordvpnCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSAuth(
|
|
||||||
constants.NordvpnTLSAuth)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package perfectprivacy
|
package perfectprivacy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,81 +8,30 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (p *Perfectprivacy) BuildConf(connection models.Connection,
|
func (p *Perfectprivacy) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
//nolint:gomnd
|
||||||
settings.Ciphers = []string{constants.AES256cbc, constants.AES256gcm}
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256cbc,
|
||||||
|
constants.AES256gcm,
|
||||||
|
},
|
||||||
|
Auth: constants.SHA512,
|
||||||
|
MssFix: 1450,
|
||||||
|
Ping: 5,
|
||||||
|
CA: constants.PerfectprivacyCA,
|
||||||
|
Cert: constants.PerfectprivacyCert,
|
||||||
|
Key: constants.PerfectprivacyKey,
|
||||||
|
TLSCrypt: constants.PerfectprivacyTLSCrypt,
|
||||||
|
TLSCipher: "TLS_CHACHA20_POLY1305_SHA256:TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS_AES_256_GCM_SHA384:TLS-RSA-WITH-AES-256-CBC-SHA", //nolint:lll
|
||||||
|
TunMTU: 1500,
|
||||||
|
TunMTUExtra: 32,
|
||||||
|
RenegSec: 3600,
|
||||||
|
KeyDirection: "1",
|
||||||
|
IPv6Lines: []string{
|
||||||
|
"redirect-gateway def1",
|
||||||
|
`pull-filter ignore "redirect-gateway def1 ipv6"`,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA512
|
|
||||||
}
|
|
||||||
|
|
||||||
mssFix := *settings.MSSFix
|
|
||||||
if mssFix == 0 {
|
|
||||||
mssFix = 1450
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Perfect Privacy specific
|
|
||||||
"ping 5",
|
|
||||||
"tun-mtu 1500",
|
|
||||||
"tun-mtu-extra 32",
|
|
||||||
"mssfix " + strconv.Itoa(int(mssFix)),
|
|
||||||
"reneg-sec 3600",
|
|
||||||
"key-direction 1",
|
|
||||||
"tls-cipher TLS_CHACHA20_POLY1305_SHA256:TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-RSA-WITH-AES-128-GCM-SHA256:TLS-DHE-RSA-WITH-AES-128-CBC-SHA:TLS_AES_256_GCM_SHA384:TLS-RSA-WITH-AES-256-CBC-SHA", //nolint:lll
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Modified variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
// Perfect Privacy specific IPv6
|
|
||||||
lines = append(lines, "redirect-gateway def1")
|
|
||||||
lines = append(lines, `pull-filter ignore "redirect-gateway def1 ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.PerfectprivacyCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCert(
|
|
||||||
constants.PerfectprivacyCert)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnKey(
|
|
||||||
constants.PerfectprivacyKey)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSCrypt(
|
|
||||||
constants.PerfectprivacyTLSCrypt)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package privado
|
package privado
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,67 +8,18 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (p *Privado) BuildConf(connection models.Connection,
|
func (p *Privado) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
//nolint:gomnd
|
||||||
settings.Ciphers = []string{constants.AES256cbc}
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256cbc,
|
||||||
|
},
|
||||||
|
Auth: constants.SHA256,
|
||||||
|
Ping: 10,
|
||||||
|
TLSCipher: "TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-DSS-WITH-AES-256-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA",
|
||||||
|
VerifyX509Type: "name",
|
||||||
|
CA: constants.PrivadoCA,
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA256
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Privado specific
|
|
||||||
"ping 10",
|
|
||||||
"tls-cipher TLS-DHE-RSA-WITH-AES-256-CBC-SHA:TLS-DHE-DSS-WITH-AES-256-CBC-SHA:TLS-RSA-WITH-AES-256-CBC-SHA",
|
|
||||||
"verify-x509-name " + connection.Hostname + " name",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.PrivadoCA)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package privateinternetaccess
|
package privateinternetaccess
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,87 +8,30 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (p *PIA) BuildConf(connection models.Connection,
|
func (p *PIA) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
var defaultCipher, defaultAuth, X509CRL, certificate string
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
|
RemoteCertTLS: true,
|
||||||
|
RenegDisabled: true,
|
||||||
|
AuthUserPass: true,
|
||||||
|
}
|
||||||
|
|
||||||
switch *settings.PIAEncPreset {
|
switch *settings.PIAEncPreset {
|
||||||
case constants.PIAEncryptionPresetNormal:
|
case constants.PIAEncryptionPresetNormal:
|
||||||
defaultCipher = constants.AES128cbc
|
providerSettings.Ciphers = []string{constants.AES128cbc}
|
||||||
defaultAuth = constants.SHA1
|
providerSettings.Auth = constants.SHA1
|
||||||
X509CRL = constants.PiaX509CRLNormal
|
providerSettings.CRLVerify = constants.PiaX509CRLNormal
|
||||||
certificate = constants.PiaCANormal
|
providerSettings.CA = constants.PiaCANormal
|
||||||
case constants.PIAEncryptionPresetNone:
|
case constants.PIAEncryptionPresetNone:
|
||||||
defaultCipher = "none"
|
providerSettings.Ciphers = []string{"none"}
|
||||||
defaultAuth = "none"
|
providerSettings.Auth = "none"
|
||||||
X509CRL = constants.PiaX509CRLNormal
|
providerSettings.CRLVerify = constants.PiaX509CRLNormal
|
||||||
certificate = constants.PiaCANormal
|
providerSettings.CA = constants.PiaCANormal
|
||||||
default: // strong
|
default: // strong
|
||||||
defaultCipher = constants.AES256cbc
|
providerSettings.Ciphers = []string{constants.AES256cbc}
|
||||||
defaultAuth = constants.SHA256
|
providerSettings.Auth = constants.SHA256
|
||||||
X509CRL = constants.PiaX509CRLStrong
|
providerSettings.CRLVerify = constants.PiaX509CRLStrong
|
||||||
certificate = constants.PiaCAStrong
|
providerSettings.CA = constants.PiaCAStrong
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(settings.Ciphers) == 0 {
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
settings.Ciphers = []string{defaultCipher}
|
|
||||||
}
|
|
||||||
|
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = defaultAuth
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// PIA specific
|
|
||||||
"remote-cert-tls server",
|
|
||||||
"reneg-sec 0",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(settings.Ciphers) > 0 {
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
}
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(certificate)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCRLVerify(X509CRL)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package privatevpn
|
package privatevpn
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,68 +8,19 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (p *Privatevpn) BuildConf(connection models.Connection,
|
func (p *Privatevpn) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
settings.Ciphers = []string{constants.AES128gcm}
|
RemoteCertTLS: true,
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES128gcm,
|
||||||
|
},
|
||||||
|
Auth: constants.SHA256,
|
||||||
|
CA: constants.PrivatevpnCA,
|
||||||
|
TLSAuth: constants.PrivatevpnTLSAuth,
|
||||||
|
UDPLines: []string{
|
||||||
|
"key-direction 1",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA256
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Privatevpn specific
|
|
||||||
"remote-cert-tls server",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "key-direction 1")
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.PrivatevpnCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSAuth(
|
|
||||||
constants.PrivatevpnTLSAuth)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package protonvpn
|
package protonvpn
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,74 +8,24 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (p *Protonvpn) BuildConf(connection models.Connection,
|
func (p *Protonvpn) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
//nolint:gomnd
|
||||||
settings.Ciphers = []string{constants.AES256cbc}
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
|
RemoteCertTLS: true,
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256cbc,
|
||||||
|
},
|
||||||
|
Auth: constants.SHA512,
|
||||||
|
MssFix: 1450,
|
||||||
|
TunMTUExtra: 32,
|
||||||
|
RenegDisabled: true,
|
||||||
|
KeyDirection: "1",
|
||||||
|
CA: constants.ProtonvpnCA,
|
||||||
|
TLSAuth: constants.ProtonvpnTLSAuth,
|
||||||
|
UDPLines: []string{
|
||||||
|
"fast-io",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA512
|
|
||||||
}
|
|
||||||
|
|
||||||
mssFix := *settings.MSSFix
|
|
||||||
if mssFix == 0 {
|
|
||||||
const defaultMSSFix = 1450
|
|
||||||
mssFix = defaultMSSFix
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Protonvpn specific
|
|
||||||
"remote-cert-tls server",
|
|
||||||
"tun-mtu-extra 32",
|
|
||||||
"mssfix " + strconv.Itoa(int(mssFix)),
|
|
||||||
"reneg-sec 0",
|
|
||||||
"key-direction 1",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "fast-io")
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.ProtonvpnCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSAuth(
|
|
||||||
constants.ProtonvpnTLSAuth)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ import (
|
|||||||
// Provider contains methods to read and modify the openvpn configuration to connect as a client.
|
// Provider contains methods to read and modify the openvpn configuration to connect as a client.
|
||||||
type Provider interface {
|
type Provider interface {
|
||||||
GetConnection(selection settings.ServerSelection) (connection models.Connection, err error)
|
GetConnection(selection settings.ServerSelection) (connection models.Connection, err error)
|
||||||
BuildConf(connection models.Connection, settings settings.OpenVPN) (lines []string, err error)
|
BuildConf(connection models.Connection, settings settings.OpenVPN) (lines []string)
|
||||||
PortForwarder
|
PortForwarder
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package purevpn
|
package purevpn
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,71 +8,18 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (p *Purevpn) BuildConf(connection models.Connection,
|
func (p *Purevpn) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
settings.Ciphers = []string{constants.AES256gcm}
|
RemoteCertTLS: true,
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256gcm,
|
||||||
|
},
|
||||||
|
Ping: 10, //nolint:gomnd
|
||||||
|
CA: constants.PurevpnCA,
|
||||||
|
Cert: constants.PurevpnCert,
|
||||||
|
Key: constants.PurevpnKey,
|
||||||
|
TLSAuth: constants.PurevpnTLSAuth,
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Purevpn specific
|
|
||||||
"ping 10",
|
|
||||||
"remote-cert-tls server",
|
|
||||||
"key-direction 1",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.Auth != "" {
|
|
||||||
lines = append(lines, "auth "+*settings.Auth)
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.PurevpnCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCert(
|
|
||||||
constants.PurevpnCert)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnKey(
|
|
||||||
constants.PurevpnKey)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSAuth(
|
|
||||||
constants.PurevpnTLSAuth)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package surfshark
|
package surfshark
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,74 +8,21 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (s *Surfshark) BuildConf(connection models.Connection,
|
func (s *Surfshark) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
settings.Ciphers = []string{constants.AES256gcm}
|
RemoteCertTLS: true,
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256gcm,
|
||||||
|
},
|
||||||
|
Auth: constants.SHA512,
|
||||||
|
RenegDisabled: true,
|
||||||
|
KeyDirection: "1",
|
||||||
|
Ping: 15, //nolint:gomnd
|
||||||
|
MssFix: 1450, //nolint:gomnd
|
||||||
|
TunMTUExtra: 32, //nolint:gomnd
|
||||||
|
CA: constants.SurfsharkCA,
|
||||||
|
TLSAuth: constants.SurfsharkTLSAuth,
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA512
|
|
||||||
}
|
|
||||||
|
|
||||||
mssFix := *settings.MSSFix
|
|
||||||
if mssFix == 0 {
|
|
||||||
const defaultMSSFix = 1450
|
|
||||||
mssFix = defaultMSSFix
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Surfshark specific
|
|
||||||
"tun-mtu-extra 32",
|
|
||||||
"mssfix " + strconv.Itoa(int(mssFix)),
|
|
||||||
"ping 15",
|
|
||||||
"remote-cert-tls server",
|
|
||||||
"reneg-sec 0",
|
|
||||||
"key-direction 1",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.SurfsharkCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSAuth(
|
|
||||||
constants.SurfsharkTLSAuth)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package torguard
|
package torguard
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,77 +8,23 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (t *Torguard) BuildConf(connection models.Connection,
|
func (t *Torguard) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
settings.Ciphers = []string{constants.AES256gcm}
|
RemoteCertTLS: true,
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256gcm,
|
||||||
|
},
|
||||||
|
Auth: constants.SHA256,
|
||||||
|
MssFix: 1450, //nolint:gomnd
|
||||||
|
TunMTUExtra: 32, //nolint:gomnd
|
||||||
|
SndBuf: 393216, //nolint:gomnd
|
||||||
|
RcvBuf: 393216, //nolint:gomnd
|
||||||
|
Ping: 5, //nolint:gomnd
|
||||||
|
RenegDisabled: true,
|
||||||
|
KeyDirection: "1",
|
||||||
|
CA: constants.TorguardCA,
|
||||||
|
TLSAuth: constants.TorguardTLSAuth,
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA256
|
|
||||||
}
|
|
||||||
|
|
||||||
mssFix := *settings.MSSFix
|
|
||||||
if mssFix == 0 {
|
|
||||||
const defaultMSSFix = 1450
|
|
||||||
mssFix = defaultMSSFix
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Torguard specific
|
|
||||||
"tun-mtu-extra 32",
|
|
||||||
"mssfix " + strconv.Itoa(int(mssFix)),
|
|
||||||
"sndbuf 393216",
|
|
||||||
"rcvbuf 393216",
|
|
||||||
"ping 5",
|
|
||||||
"remote-cert-tls server",
|
|
||||||
"reneg-sec 0",
|
|
||||||
"key-direction 1",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "fast-io")
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.TorguardCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSAuth(
|
|
||||||
constants.TorguardTLSAuth)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,6 +7,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func CipherLines(ciphers []string, version string) (lines []string) {
|
func CipherLines(ciphers []string, version string) (lines []string) {
|
||||||
|
if len(ciphers) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
switch version {
|
switch version {
|
||||||
case constants.Openvpn24:
|
case constants.Openvpn24:
|
||||||
return []string{
|
return []string{
|
||||||
|
|||||||
@@ -1,5 +1,254 @@
|
|||||||
package utils
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
|
"github.com/qdm12/gluetun/internal/openvpn/parse"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OpenVPNProviderSettings struct {
|
||||||
|
Ping int
|
||||||
|
RemoteCertTLS bool
|
||||||
|
Ciphers []string
|
||||||
|
Auth string
|
||||||
|
CA string
|
||||||
|
CRLVerify string
|
||||||
|
Cert string
|
||||||
|
Key string
|
||||||
|
RSAKey string
|
||||||
|
TLSAuth string
|
||||||
|
TLSCrypt string
|
||||||
|
MssFix uint16
|
||||||
|
FastIO bool
|
||||||
|
AuthUserPass bool
|
||||||
|
AuthToken bool
|
||||||
|
Fragment uint16
|
||||||
|
SndBuf uint32
|
||||||
|
RcvBuf uint32
|
||||||
|
// VerifyX509Name can be set to a custom name to verify against.
|
||||||
|
// Note VerifyX509Type has to be set for it to be verified.
|
||||||
|
// If it is left unset, the code will deduce a name to verify against
|
||||||
|
// using the connection hostname and according to VerifyX509Type.
|
||||||
|
VerifyX509Name string
|
||||||
|
// VerifyX509Type can be "name-prefix", "name"
|
||||||
|
VerifyX509Type string
|
||||||
|
TLSCipher string
|
||||||
|
TunMTU uint16
|
||||||
|
TunMTUExtra uint16
|
||||||
|
RenegDisabled bool
|
||||||
|
RenegSec uint16
|
||||||
|
KeyDirection string
|
||||||
|
ExtraLines []string
|
||||||
|
UDPLines []string
|
||||||
|
IPv6Lines []string
|
||||||
|
}
|
||||||
|
|
||||||
|
//nolint:gocognit,gocyclo
|
||||||
|
func OpenVPNConfig(provider OpenVPNProviderSettings,
|
||||||
|
connection models.Connection,
|
||||||
|
settings settings.OpenVPN) []string {
|
||||||
|
var lines openvpnConfigLines
|
||||||
|
lines.add("client")
|
||||||
|
lines.add("nobind")
|
||||||
|
lines.add("tls-exit") // exit OpenVPN on a TLS error
|
||||||
|
lines.add("auth-nocache") // do not cache auth credentials
|
||||||
|
lines.add("mute-replay-warnings") // these are often ignored by some VPN providers
|
||||||
|
lines.add("auth-retry", "nointeract") // retry authenticating without interaction
|
||||||
|
lines.add("suppress-timestamps") // do not log timestamps, the Gluetun logger takes care of it
|
||||||
|
lines.add("dev", settings.Interface)
|
||||||
|
lines.add("verb", fmt.Sprint(*settings.Verbosity))
|
||||||
|
lines.add("auth-user-pass", constants.OpenVPNAuthConf)
|
||||||
|
lines.add("proto", connection.Protocol)
|
||||||
|
lines.add("remote", connection.IP.String(), fmt.Sprint(connection.Port))
|
||||||
|
|
||||||
|
if !provider.AuthToken {
|
||||||
|
lines.add("pull-filter", "ignore", `"auth-token"`) // prevent auth failed loops
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.KeyDirection != "" {
|
||||||
|
lines.add("key-direction", provider.KeyDirection)
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.Ping > 0 {
|
||||||
|
lines.add("ping", fmt.Sprint(provider.Ping))
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.RenegDisabled {
|
||||||
|
lines.add("reneg-sec", "0")
|
||||||
|
} else if provider.RenegSec > 0 {
|
||||||
|
lines.add("reneg-sec", fmt.Sprint(provider.RenegSec))
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.RemoteCertTLS {
|
||||||
|
// equivalent to older 'ns-cert-type' option
|
||||||
|
lines.add("remote-cert-tls server")
|
||||||
|
}
|
||||||
|
|
||||||
|
x509Type := provider.VerifyX509Type
|
||||||
|
if x509Type != "" {
|
||||||
|
x509Name := provider.VerifyX509Name
|
||||||
|
if x509Name == "" {
|
||||||
|
// find name from connection hostname depending on type
|
||||||
|
switch x509Type {
|
||||||
|
case "name":
|
||||||
|
x509Name = connection.Hostname
|
||||||
|
case "name-prefix":
|
||||||
|
x509Name = strings.Split(connection.Hostname, ".")[0]
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("verify-x509-name type not supported: %q", x509Type))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lines.add("verify-x509-name", x509Name, x509Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.TLSCipher != "" {
|
||||||
|
lines.add("tls-cipher", provider.TLSCipher)
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.FastIO {
|
||||||
|
lines.add("fast-io")
|
||||||
|
}
|
||||||
|
|
||||||
|
ciphers := defaultStringSlice(settings.Ciphers, provider.Ciphers)
|
||||||
|
cipherLines := CipherLines(ciphers, settings.Version)
|
||||||
|
lines.addLines(cipherLines)
|
||||||
|
|
||||||
|
auth := defaultString(*settings.Auth, provider.Auth)
|
||||||
|
if auth != "" {
|
||||||
|
lines.add("auth", auth)
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.TunMTU > 0 {
|
||||||
|
lines.add("tun-mtu", fmt.Sprint(provider.TunMTU))
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.TunMTUExtra > 0 {
|
||||||
|
lines.add("tun-mtu-extra", fmt.Sprint(provider.TunMTUExtra))
|
||||||
|
}
|
||||||
|
|
||||||
|
mssFix := defaultUint16(*settings.MSSFix, provider.MssFix)
|
||||||
|
if mssFix > 0 {
|
||||||
|
lines.add("mssfix", fmt.Sprint(mssFix))
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.SndBuf > 0 {
|
||||||
|
lines.add("sndbuf", fmt.Sprint(provider.SndBuf))
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.RcvBuf > 0 {
|
||||||
|
lines.add("rcvbuf", fmt.Sprint(provider.RcvBuf))
|
||||||
|
}
|
||||||
|
|
||||||
|
if connection.Protocol == constants.UDP {
|
||||||
|
lines.add("explicit-exit-notify")
|
||||||
|
}
|
||||||
|
|
||||||
|
if settings.ProcessUser != "root" {
|
||||||
|
lines.add("user", settings.ProcessUser)
|
||||||
|
lines.add("persist-tun")
|
||||||
|
lines.add("persist-key")
|
||||||
|
}
|
||||||
|
|
||||||
|
if *settings.IPv6 {
|
||||||
|
lines.add("tun-ipv6")
|
||||||
|
} else {
|
||||||
|
lines.add("pull-filter", "ignore", `"route-ipv6"`)
|
||||||
|
lines.add("pull-filter", "ignore", `"ifconfig-ipv6"`)
|
||||||
|
lines.addLines(provider.IPv6Lines)
|
||||||
|
}
|
||||||
|
|
||||||
|
if provider.CA != "" {
|
||||||
|
lines.addLines(WrapOpenvpnCA(provider.CA))
|
||||||
|
}
|
||||||
|
if provider.CRLVerify != "" {
|
||||||
|
lines.addLines(WrapOpenvpnCRLVerify(provider.CRLVerify))
|
||||||
|
}
|
||||||
|
if provider.Cert != "" {
|
||||||
|
lines.addLines(WrapOpenvpnCert(provider.Cert))
|
||||||
|
}
|
||||||
|
if provider.Key != "" {
|
||||||
|
lines.addLines(WrapOpenvpnKey(provider.Key))
|
||||||
|
}
|
||||||
|
if provider.RSAKey != "" {
|
||||||
|
lines.addLines(WrapOpenvpnRSAKey(provider.RSAKey))
|
||||||
|
}
|
||||||
|
if provider.TLSAuth != "" {
|
||||||
|
lines.addLines(WrapOpenvpnTLSAuth(provider.TLSAuth))
|
||||||
|
}
|
||||||
|
if provider.TLSCrypt != "" {
|
||||||
|
lines.addLines(WrapOpenvpnTLSCrypt(provider.TLSCrypt))
|
||||||
|
}
|
||||||
|
|
||||||
|
if *settings.ClientCrt != "" {
|
||||||
|
certData, err := parse.ExtractCert([]byte(*settings.ClientCrt))
|
||||||
|
panicOnError(err, "cannot extract client crt")
|
||||||
|
lines.addLines(WrapOpenvpnCert(certData))
|
||||||
|
}
|
||||||
|
|
||||||
|
if *settings.ClientKey != "" {
|
||||||
|
keyData, err := parse.ExtractPrivateKey([]byte(*settings.ClientKey))
|
||||||
|
panicOnError(err, "cannot extract client private key")
|
||||||
|
lines.addLines(WrapOpenvpnKey(keyData))
|
||||||
|
}
|
||||||
|
|
||||||
|
lines.addLines(provider.ExtraLines)
|
||||||
|
|
||||||
|
// Add a trailing empty line
|
||||||
|
lines.add("")
|
||||||
|
|
||||||
|
return lines
|
||||||
|
}
|
||||||
|
|
||||||
|
type openvpnConfigLines []string
|
||||||
|
|
||||||
|
func (o *openvpnConfigLines) add(words ...string) {
|
||||||
|
*o = append(*o, strings.Join(words, " "))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *openvpnConfigLines) addLines(lines []string) {
|
||||||
|
for _, line := range lines {
|
||||||
|
o.add(line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultString(value, defaultValue string) string {
|
||||||
|
if value == "" {
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultUint16(value, defaultValue uint16) uint16 {
|
||||||
|
if value == 0 {
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
func defaultStringSlice(value, defaultValue []string) (
|
||||||
|
result []string) {
|
||||||
|
if len(value) > 0 {
|
||||||
|
result = make([]string, len(value))
|
||||||
|
copy(result, value)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
result = make([]string, len(defaultValue))
|
||||||
|
copy(result, defaultValue)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
func panicOnError(err error, context string) {
|
||||||
|
if err == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
panicMessage := fmt.Sprintf("%s: %s", context, err)
|
||||||
|
panic(panicMessage)
|
||||||
|
}
|
||||||
|
|
||||||
func WrapOpenvpnCA(certificate string) (lines []string) {
|
func WrapOpenvpnCA(certificate string) (lines []string) {
|
||||||
return []string{
|
return []string{
|
||||||
"<ca>",
|
"<ca>",
|
||||||
|
|||||||
@@ -1,86 +1,23 @@
|
|||||||
package vpnunlimited
|
package vpnunlimited
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
"github.com/qdm12/gluetun/internal/openvpn/parse"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (p *Provider) BuildConf(connection models.Connection,
|
func (p *Provider) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
lines = []string{
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
"client",
|
RemoteCertTLS: true,
|
||||||
"nobind",
|
AuthUserPass: false,
|
||||||
"tls-exit",
|
Ping: 5, //nolint:gomnd
|
||||||
"dev " + settings.Interface,
|
RenegDisabled: true,
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
CA: constants.VPNUnlimitedCA,
|
||||||
|
ExtraLines: []string{
|
||||||
// VPNUnlimited specific
|
"route-metric 1",
|
||||||
"ping 5",
|
},
|
||||||
"remote-cert-tls server",
|
|
||||||
"reneg-sec 0",
|
|
||||||
"route-metric 1",
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
if len(settings.Ciphers) > 0 {
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.Auth != "" {
|
|
||||||
lines = append(lines, "auth "+*settings.Auth)
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.VPNUnlimitedCA)...)
|
|
||||||
|
|
||||||
certData, err := parse.ExtractCert([]byte(*settings.ClientCrt))
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("client cert is not valid: %w", err)
|
|
||||||
}
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCert(certData)...)
|
|
||||||
|
|
||||||
keyData, err := parse.ExtractPrivateKey([]byte(*settings.ClientKey))
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("client key is not valid: %w", err)
|
|
||||||
}
|
|
||||||
lines = append(lines, utils.WrapOpenvpnKey(keyData)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package vyprvpn
|
package vyprvpn
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,64 +8,21 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (v *Vyprvpn) BuildConf(connection models.Connection,
|
func (v *Vyprvpn) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
settings.Ciphers = []string{constants.AES256cbc}
|
RemoteCertTLS: true,
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256cbc,
|
||||||
|
},
|
||||||
|
Auth: constants.SHA256,
|
||||||
|
Ping: 10, //nolint:gomnd
|
||||||
|
CA: constants.VyprvpnCA,
|
||||||
|
TLSCipher: "TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA", //nolint:lll
|
||||||
|
ExtraLines: []string{
|
||||||
|
"comp-lzo",
|
||||||
|
},
|
||||||
|
// VerifyX509Name: []string{"lu1.vyprvpn.com","name"},
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA256
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Vyprvpn specific
|
|
||||||
"ping 10",
|
|
||||||
"remote-cert-tls server",
|
|
||||||
// "verify-x509-name lu1.vyprvpn.com name",
|
|
||||||
"tls-cipher TLS-ECDHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA256:TLS-DHE-RSA-WITH-AES-256-CBC-SHA", //nolint:lll
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
"comp-lzo",
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.VyprvpnCA)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,91 +1,29 @@
|
|||||||
package wevpn
|
package wevpn
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
"github.com/qdm12/gluetun/internal/openvpn/parse"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
"github.com/qdm12/gluetun/internal/provider/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (w *Wevpn) BuildConf(connection models.Connection,
|
func (w *Wevpn) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
settings.Ciphers = []string{constants.AES256gcm}
|
RemoteCertTLS: true,
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
|
constants.AES256gcm,
|
||||||
|
},
|
||||||
|
Auth: constants.SHA512,
|
||||||
|
Ping: 30, //nolint:gomnd
|
||||||
|
RenegDisabled: true,
|
||||||
|
CA: constants.WevpnCA,
|
||||||
|
Cert: constants.WevpnCert,
|
||||||
|
TLSCrypt: constants.WevpnTLSCrypt,
|
||||||
|
ExtraLines: []string{
|
||||||
|
"redirect-gateway def1 bypass-dhcp",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA512
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Wevpn specific
|
|
||||||
"ping 30",
|
|
||||||
"remote-cert-tls server",
|
|
||||||
"redirect-gateway def1 bypass-dhcp",
|
|
||||||
"reneg-sec 0",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Modified variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.IPv6 {
|
|
||||||
lines = append(lines, "tun-ipv6")
|
|
||||||
} else {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
keyData, err := parse.ExtractPrivateKey([]byte(*settings.ClientKey))
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("client key is not valid: %w", err)
|
|
||||||
}
|
|
||||||
lines = append(lines, utils.WrapOpenvpnKey(keyData)...)
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.WevpnCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCert(
|
|
||||||
constants.WevpnCert)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSCrypt(
|
|
||||||
constants.WevpnTLSCrypt)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
package windscribe
|
package windscribe
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
"github.com/qdm12/gluetun/internal/configuration/settings"
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
"github.com/qdm12/gluetun/internal/constants"
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
"github.com/qdm12/gluetun/internal/models"
|
||||||
@@ -10,75 +8,22 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (w *Windscribe) BuildConf(connection models.Connection,
|
func (w *Windscribe) BuildConf(connection models.Connection,
|
||||||
settings settings.OpenVPN) (lines []string, err error) {
|
settings settings.OpenVPN) (lines []string) {
|
||||||
if len(settings.Ciphers) == 0 {
|
providerSettings := utils.OpenVPNProviderSettings{
|
||||||
settings.Ciphers = []string{
|
RemoteCertTLS: true,
|
||||||
|
AuthUserPass: true,
|
||||||
|
Ciphers: []string{
|
||||||
constants.AES256gcm,
|
constants.AES256gcm,
|
||||||
constants.AES256cbc,
|
constants.AES256cbc,
|
||||||
constants.AES128gcm,
|
constants.AES128gcm,
|
||||||
}
|
},
|
||||||
|
Auth: constants.SHA512,
|
||||||
|
Ping: 10, //nolint:gomnd
|
||||||
|
VerifyX509Type: "name",
|
||||||
|
KeyDirection: "1",
|
||||||
|
RenegDisabled: true,
|
||||||
|
CA: constants.WindscribeCA,
|
||||||
|
TLSAuth: constants.WindscribeTLSAuth,
|
||||||
}
|
}
|
||||||
|
return utils.OpenVPNConfig(providerSettings, connection, settings)
|
||||||
auth := *settings.Auth
|
|
||||||
if auth == "" {
|
|
||||||
auth = constants.SHA512
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = []string{
|
|
||||||
"client",
|
|
||||||
"nobind",
|
|
||||||
"tls-exit",
|
|
||||||
"dev " + settings.Interface,
|
|
||||||
"verb " + strconv.Itoa(*settings.Verbosity),
|
|
||||||
|
|
||||||
// Windscribe specific
|
|
||||||
"ping 10",
|
|
||||||
"remote-cert-tls server",
|
|
||||||
"verify-x509-name " + connection.Hostname + " name",
|
|
||||||
"key-direction 1",
|
|
||||||
"reneg-sec 0",
|
|
||||||
"auth-user-pass " + constants.OpenVPNAuthConf,
|
|
||||||
"auth " + auth,
|
|
||||||
|
|
||||||
// Added constant values
|
|
||||||
"auth-nocache",
|
|
||||||
"mute-replay-warnings",
|
|
||||||
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
|
|
||||||
"auth-retry nointeract",
|
|
||||||
"suppress-timestamps",
|
|
||||||
|
|
||||||
// Connection variables
|
|
||||||
connection.OpenVPNProtoLine(),
|
|
||||||
connection.OpenVPNRemoteLine(),
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.CipherLines(settings.Ciphers, settings.Version)...)
|
|
||||||
|
|
||||||
if connection.Protocol == constants.UDP {
|
|
||||||
lines = append(lines, "explicit-exit-notify")
|
|
||||||
}
|
|
||||||
|
|
||||||
if settings.ProcessUser != "root" {
|
|
||||||
lines = append(lines, "user "+settings.ProcessUser)
|
|
||||||
lines = append(lines, "persist-tun")
|
|
||||||
lines = append(lines, "persist-key")
|
|
||||||
}
|
|
||||||
|
|
||||||
if *settings.MSSFix > 0 {
|
|
||||||
lines = append(lines, "mssfix "+strconv.Itoa(int(*settings.MSSFix)))
|
|
||||||
}
|
|
||||||
|
|
||||||
if !*settings.IPv6 {
|
|
||||||
lines = append(lines, `pull-filter ignore "route-ipv6"`)
|
|
||||||
lines = append(lines, `pull-filter ignore "ifconfig-ipv6"`)
|
|
||||||
}
|
|
||||||
|
|
||||||
lines = append(lines, utils.WrapOpenvpnCA(
|
|
||||||
constants.WindscribeCA)...)
|
|
||||||
lines = append(lines, utils.WrapOpenvpnTLSAuth(
|
|
||||||
constants.WindscribeTLSAuth)...)
|
|
||||||
|
|
||||||
lines = append(lines, "")
|
|
||||||
|
|
||||||
return lines, nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,10 +22,7 @@ func setupOpenVPN(ctx context.Context, fw firewall.VPNConnectionSetter,
|
|||||||
return nil, "", fmt.Errorf("failed finding a valid server connection: %w", err)
|
return nil, "", fmt.Errorf("failed finding a valid server connection: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
lines, err := providerConf.BuildConf(connection, settings.OpenVPN)
|
lines := providerConf.BuildConf(connection, settings.OpenVPN)
|
||||||
if err != nil {
|
|
||||||
return nil, "", fmt.Errorf("failed building configuration: %w", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err := openvpnConf.WriteConfig(lines); err != nil {
|
if err := openvpnConf.WriteConfig(lines); err != nil {
|
||||||
return nil, "", fmt.Errorf("failed writing configuration to file: %w", err)
|
return nil, "", fmt.Errorf("failed writing configuration to file: %w", err)
|
||||||
|
|||||||
Reference in New Issue
Block a user