Skip to content

Commit

Permalink
Use Openvpn 2.4 only
Browse files Browse the repository at this point in the history
  • Loading branch information
qdm12 committed May 2, 2024
1 parent 4d002a3 commit 26f748e
Show file tree
Hide file tree
Showing 13 changed files with 28 additions and 61 deletions.
11 changes: 5 additions & 6 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ ENV VPN_SERVICE_PROVIDER=pia \
OPENVPN_PASSWORD= \
OPENVPN_USER_SECRETFILE=/run/secrets/openvpn_user \
OPENVPN_PASSWORD_SECRETFILE=/run/secrets/openvpn_password \
OPENVPN_VERSION=2.5 \
OPENVPN_VERSION=2.4 \
OPENVPN_VERBOSITY=1 \
OPENVPN_FLAGS= \
OPENVPN_CIPHERS= \
Expand Down Expand Up @@ -215,11 +215,10 @@ EXPOSE 8000/tcp 8888/tcp 8388/tcp 8388/udp
HEALTHCHECK --interval=5s --timeout=5s --start-period=10s --retries=1 CMD /gluetun-entrypoint healthcheck
ARG TARGETPLATFORM
RUN apk add --no-cache --update -l wget && \
apk add --no-cache --update -X "https://dl-cdn.alpinelinux.org/alpine/v3.17/main" openvpn\~2.5 && \
mv /usr/sbin/openvpn /usr/sbin/openvpn2.5 && \
apk del openvpn && \
apk add --no-cache --update openvpn ca-certificates iptables ip6tables unbound tzdata && \
mv /usr/sbin/openvpn /usr/sbin/openvpn2.6 && \
apk add --no-cache --update -X "https://dl-cdn.alpinelinux.org/alpine/v3.12/main" openvpn\~2.4 && \
apk add --no-cache --update -X "https://dl-cdn.alpinelinux.org/alpine/v3.16/main" openssl\~1.1 && \
mv /usr/sbin/openvpn /usr/sbin/openvpn2.4 && \
apk add --no-cache --update ca-certificates iptables ip6tables unbound tzdata && \
# Fix vulnerability issue
apk add --no-cache --update busybox && \
rm -rf /var/cache/apk/* /etc/unbound/* /usr/sbin/unbound-* /etc/openvpn/*.sh /usr/lib/openvpn/plugins/openvpn-plugin-down-root.so && \
Expand Down
3 changes: 1 addition & 2 deletions cmd/gluetun/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,

err = printVersions(ctx, logger, []printVersionElement{
{name: "Alpine", getVersion: alpineConf.Version},
{name: "OpenVPN 2.5", getVersion: ovpnConf.Version25},
{name: "OpenVPN 2.6", getVersion: ovpnConf.Version26},
{name: "OpenVPN 2.4", getVersion: ovpnConf.Version24},
{name: "Unbound", getVersion: dnsConf.Version},
{name: "IPtables", getVersion: func(ctx context.Context) (version string, err error) {
return firewall.Version(ctx, cmder)
Expand Down
6 changes: 3 additions & 3 deletions internal/configuration/settings/openvpn.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import (
// OpenVPN contains settings to configure the OpenVPN client.
type OpenVPN struct {
// Version is the OpenVPN version to run.
// It can only be "2.5" or "2.6".
// It can only be "2.4".
Version string `json:"version"`
// User is the OpenVPN authentication username.
// It cannot be nil in the internal state if OpenVPN is used.
Expand Down Expand Up @@ -90,7 +90,7 @@ var ivpnAccountID = regexp.MustCompile(`^(i|ivpn)\-[a-zA-Z0-9]{4}\-[a-zA-Z0-9]{4

func (o OpenVPN) validate(vpnProvider string) (err error) {
// Validate version
validVersions := []string{openvpn.Openvpn25, openvpn.Openvpn26}
validVersions := []string{openvpn.Openvpn24}
if err = validate.IsOneOf(o.Version, validVersions...); err != nil {
return fmt.Errorf("%w: %w", ErrOpenVPNVersionIsNotValid, err)
}
Expand Down Expand Up @@ -286,7 +286,7 @@ func (o *OpenVPN) overrideWith(other OpenVPN) {
}

func (o *OpenVPN) setDefaults(vpnProvider string) {
o.Version = gosettings.DefaultComparable(o.Version, openvpn.Openvpn25)
o.Version = gosettings.DefaultComparable(o.Version, openvpn.Openvpn24)
o.User = gosettings.DefaultPointer(o.User, "")
if vpnProvider == providers.Mullvad {
o.Password = gosettings.DefaultPointer(o.Password, "m")
Expand Down
14 changes: 0 additions & 14 deletions internal/configuration/settings/settings.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@ import (
"fmt"
"net/netip"

"github.com/qdm12/gluetun/internal/configuration/settings/helpers"
"github.com/qdm12/gluetun/internal/constants/providers"
"github.com/qdm12/gluetun/internal/constants/vpn"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/pprof"
"github.com/qdm12/gosettings/reader"
Expand Down Expand Up @@ -153,18 +151,6 @@ func (s Settings) Warnings() (warnings []string) {
" so this will likely not work anymore. See https://github.com/qdm12/gluetun/issues/1498.")
}

if helpers.IsOneOf(s.VPN.Provider.Name, providers.SlickVPN) &&
s.VPN.Type == vpn.OpenVPN {
warnings = append(warnings, "OpenVPN 2.5 uses OpenSSL 3 "+
"which prohibits the usage of weak security in today's standards. "+
s.VPN.Provider.Name+" uses weak security which is out "+
"of Gluetun's control so the only workaround is to allow such weaknesses "+
`using the OpenVPN option tls-cipher "DEFAULT:@SECLEVEL=0". `+
"You might want to reach to your provider so they upgrade their certificates. "+
"Once this is done, you will have to let the Gluetun maintainers know "+
"by creating an issue, attaching the new certificate and we will update Gluetun.")
}

// TODO remove in v4
if s.DNS.ServerAddress.Unmap().Compare(netip.AddrFrom4([4]byte{127, 0, 0, 1})) != 0 {
warnings = append(warnings, "DNS address is set to "+s.DNS.ServerAddress.String()+
Expand Down
2 changes: 1 addition & 1 deletion internal/configuration/settings/settings_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ func Test_Settings_String(t *testing.T) {
| | ├── Protocol: UDP
| | └── Private Internet Access encryption preset: strong
| └── OpenVPN settings:
| ├── OpenVPN version: 2.5
| ├── OpenVPN version: 2.4
| ├── User: [not set]
| ├── Password: [not set]
| ├── Private Internet Access encryption preset: strong
Expand Down
3 changes: 1 addition & 2 deletions internal/constants/openvpn/versions.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package openvpn

const (
Openvpn25 = "2.5"
Openvpn26 = "2.6"
Openvpn24 = "2.4"
)
9 changes: 3 additions & 6 deletions internal/openvpn/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,15 @@ import (
var ErrVersionUnknown = errors.New("OpenVPN version is unknown")

const (
binOpenvpn25 = "openvpn2.5"
binOpenvpn26 = "openvpn2.6"
binOpenvpn24 = "openvpn2.4"
)

func start(ctx context.Context, starter command.Starter, version string, flags []string) (
stdoutLines, stderrLines chan string, waitError chan error, err error) {
var bin string
switch version {
case openvpn.Openvpn25:
bin = binOpenvpn25
case openvpn.Openvpn26:
bin = binOpenvpn26
case openvpn.Openvpn24:
bin = binOpenvpn24
default:
return nil, nil, nil, fmt.Errorf("%w: %s", ErrVersionUnknown, version)
}
Expand Down
8 changes: 2 additions & 6 deletions internal/openvpn/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,8 @@ import (
"strings"
)

func (c *Configurator) Version25(ctx context.Context) (version string, err error) {
return c.version(ctx, binOpenvpn25)
}

func (c *Configurator) Version26(ctx context.Context) (version string, err error) {
return c.version(ctx, binOpenvpn26)
func (c *Configurator) Version24(ctx context.Context) (version string, err error) {
return c.version(ctx, binOpenvpn24)
}

var ErrVersionTooShort = errors.New("version output is too short")
Expand Down
7 changes: 2 additions & 5 deletions internal/provider/airvpn/openvpnconf.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,8 @@ func (p *Provider) OpenVPNConfig(connection models.Connection,
}

switch settings.Version {
case openvpn.Openvpn25, openvpn.Openvpn26:
providerSettings.Ciphers = []string{
openvpn.AES256gcm, openvpn.AES256cbc, openvpn.AES192gcm,
openvpn.AES192cbc, openvpn.AES128gcm, openvpn.AES128cbc,
openvpn.Chacha20Poly1305}
case openvpn.Openvpn24:
providerSettings.Ciphers = []string{openvpn.AES256cbc}
default:
panic(fmt.Sprintf("openvpn version %q is not implemented", settings.Version))
}
Expand Down
4 changes: 2 additions & 2 deletions internal/provider/custom/openvpnconf_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ func Test_modifyConfig(t *testing.T) {
"suppress-timestamps",
"auth-user-pass /etc/openvpn/auth.conf",
"verb 0",
"data-ciphers-fallback cipher",
"data-ciphers cipher",
"cipher cipher", //nolint:dupword
"ncp-ciphers cipher",
"auth sha512",
"mssfix 1000",
"pull-filter ignore \"route-ipv6\"",
Expand Down
6 changes: 0 additions & 6 deletions internal/provider/slickvpn/openvpnconf.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,5 @@ func (p *Provider) OpenVPNConfig(connection models.Connection,
},
}

// SlickVPN's certificate is sha1WithRSAEncryption and sha1 is now
// rejected by openssl 3.x.x which is used by OpenVPN >= 2.5.
// We lower the security level to 3 to allow this algorithm,
// see https://www.openssl.org/docs/man1.1.1/man3/SSL_CTX_set_security_level.html
providerSettings.TLSCipher = "DEFAULT:@SECLEVEL=0"

return utils.OpenVPNConfig(providerSettings, connection, settings, ipv6Supported)
}
4 changes: 2 additions & 2 deletions internal/provider/utils/cipher.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ func CipherLines(ciphers []string) (lines []string) {
}

return []string{
"data-ciphers-fallback " + ciphers[0],
"data-ciphers " + strings.Join(ciphers, ":"),
"cipher " + ciphers[0],
"ncp-ciphers " + strings.Join(ciphers, ":"),
}
}
12 changes: 6 additions & 6 deletions internal/provider/utils/cipher_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,16 @@ func Test_CipherLines(t *testing.T) {
"empty version": {
ciphers: []string{"AES"},
lines: []string{
"data-ciphers-fallback AES",
"data-ciphers AES",
"cipher AES",
"ncp-ciphers AES",
},
},
"2.5": {
"2.4": {
ciphers: []string{"AES", "CBC"},
version: "2.5",
version: "2.4",
lines: []string{
"data-ciphers-fallback AES",
"data-ciphers AES:CBC",
"cipher AES",
"ncp-ciphers AES:CBC",
},
},
}
Expand Down

0 comments on commit 26f748e

Please sign in to comment.