Skip to content

Commit 4698dae

Browse files
committed
chore(mullvad): remove openvpn support
1 parent b0a7567 commit 4698dae

7 files changed

Lines changed: 613 additions & 2215 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ Lightweight swiss-army-knife-like VPN client to multiple VPN service providers
5858
## Features
5959

6060
- Based on Alpine 3.22 for a small Docker image of 41.1MB
61-
- Supports: **AirVPN**, **Cyberghost**, **ExpressVPN**, **FastestVPN**, **Giganews**, **HideMyAss**, **IPVanish**, **IVPN**, **Mullvad**, **NordVPN**, **Perfect Privacy**, **Privado**, **Private Internet Access**, **PrivateVPN**, **ProtonVPN**, **PureVPN**, **SlickVPN**, **Surfshark**, **TorGuard**, **VPNSecure.me**, **VPNUnlimited**, **Vyprvpn**, **Windscribe** servers
61+
- Supports: **AirVPN**, **Cyberghost**, **ExpressVPN**, **FastestVPN**, **Giganews**, **HideMyAss**, **IPVanish**, **IVPN**, **Mullvad** (Wireguard only), **NordVPN**, **Perfect Privacy**, **Privado**, **Private Internet Access**, **PrivateVPN**, **ProtonVPN**, **PureVPN**, **SlickVPN**, **Surfshark**, **TorGuard**, **VPNSecure.me**, **VPNUnlimited**, **Vyprvpn**, **Windscribe** servers
6262
- Supports OpenVPN for all providers listed
6363
- Supports Wireguard both kernelspace and userspace
6464
- For **AirVPN**, **FastestVPN**, **Ivpn**, **Mullvad**, **NordVPN**, **Perfect privacy**, **ProtonVPN**, **Surfshark** and **Windscribe**

internal/configuration/settings/provider.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package settings
22

33
import (
44
"fmt"
5+
"slices"
6+
"sort"
57
"strings"
68

79
"github.com/qdm12/gluetun/internal/constants/providers"
@@ -31,6 +33,11 @@ func (p *Provider) validate(vpnType string, filterChoicesGetter FilterChoicesGet
3133
if vpnType == vpn.OpenVPN {
3234
validNames = providers.AllWithCustom()
3335
validNames = append(validNames, "pia") // Retro-compatibility
36+
// Remove Mullvad since it no longer supports OpenVPN as of January 15th, 2026
37+
mullvadIndex := slices.Index(validNames, providers.Mullvad)
38+
validNames[mullvadIndex], validNames[len(validNames)-1] = validNames[len(validNames)-1], validNames[mullvadIndex]
39+
validNames = validNames[:len(validNames)-1]
40+
sort.Strings(validNames)
3441
} else { // Wireguard
3542
validNames = []string{
3643
providers.Airvpn,
@@ -48,10 +55,6 @@ func (p *Provider) validate(vpnType string, filterChoicesGetter FilterChoicesGet
4855
return fmt.Errorf("%w for Wireguard: %w", ErrVPNProviderNameNotValid, err)
4956
}
5057

51-
if p.Name == providers.Mullvad && vpnType == vpn.OpenVPN {
52-
warner.Warn("https://mullvad.net/en/blog/removing-openvpn-15th-january-2026")
53-
}
54-
5558
err = p.ServerSelection.validate(p.Name, filterChoicesGetter, warner)
5659
if err != nil {
5760
return fmt.Errorf("server selection: %w", err)

internal/provider/mullvad/connection.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
func (p *Provider) GetConnection(selection settings.ServerSelection, ipv6Supported bool) (
1010
connection models.Connection, err error,
1111
) {
12-
defaults := utils.NewConnectionDefaults(443, 1194, 51820) //nolint:mnd
12+
defaults := utils.NewConnectionDefaults(0, 0, 51820) //nolint:mnd
1313
return utils.GetConnection(p.Name(),
1414
p.storage, selection, defaults, ipv6Supported, p.randSource)
1515
}

internal/provider/mullvad/connection_test.go

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -38,38 +38,6 @@ func Test_Provider_GetConnection(t *testing.T) {
3838
errWrapped: errTest,
3939
errMessage: "filtering servers: test error",
4040
},
41-
"default OpenVPN TCP port": {
42-
filteredServers: []models.Server{
43-
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
44-
},
45-
selection: settings.ServerSelection{
46-
OpenVPN: settings.OpenVPNSelection{
47-
Protocol: constants.TCP,
48-
},
49-
}.WithDefaults(provider),
50-
connection: models.Connection{
51-
Type: vpn.OpenVPN,
52-
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
53-
Port: 443,
54-
Protocol: constants.TCP,
55-
},
56-
},
57-
"default OpenVPN UDP port": {
58-
filteredServers: []models.Server{
59-
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
60-
},
61-
selection: settings.ServerSelection{
62-
OpenVPN: settings.OpenVPNSelection{
63-
Protocol: constants.UDP,
64-
},
65-
}.WithDefaults(provider),
66-
connection: models.Connection{
67-
Type: vpn.OpenVPN,
68-
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
69-
Port: 1194,
70-
Protocol: constants.UDP,
71-
},
72-
},
7341
"default Wireguard port": {
7442
filteredServers: []models.Server{
7543
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}, WgPubKey: "x"},

internal/provider/mullvad/openvpnconf.go

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,10 @@ package mullvad
22

33
import (
44
"github.com/qdm12/gluetun/internal/configuration/settings"
5-
"github.com/qdm12/gluetun/internal/constants/openvpn"
65
"github.com/qdm12/gluetun/internal/models"
7-
"github.com/qdm12/gluetun/internal/provider/utils"
86
)
97

10-
func (p *Provider) OpenVPNConfig(connection models.Connection,
11-
settings settings.OpenVPN, ipv6Supported bool,
12-
) (lines []string) {
13-
//nolint:mnd
14-
providerSettings := utils.OpenVPNProviderSettings{
15-
AuthUserPass: true,
16-
Ciphers: []string{
17-
openvpn.AES256cbc,
18-
openvpn.AES128gcm,
19-
openvpn.AES256gcm,
20-
},
21-
MssFix: 1320,
22-
Ping: 10,
23-
RemoteCertTLS: true,
24-
TLSCipher: "TLS-DHE-RSA-WITH-AES-256-GCM-SHA384:TLS-DHE-RSA-WITH-AES-256-CBC-SHA",
25-
SndBuf: 524288,
26-
RcvBuf: 524288,
27-
CAs: []string{"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"}, //nolint:lll
28-
UDPLines: []string{"fast-io"},
29-
}
30-
return utils.OpenVPNConfig(providerSettings, connection, settings, ipv6Supported)
8+
func (p *Provider) OpenVPNConfig(_ models.Connection, _ settings.OpenVPN, _ bool) (lines []string) {
9+
panic("OpenVPN is no longer supported by Mullvad as of January 15th, 2026: " +
10+
"https://mullvad.net/en/blog/removing-openvpn-15th-january-2026")
3111
}

internal/provider/mullvad/updater/hosttoserver.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@ func (hts hostToServer) add(data serverData) (err error) {
3434
}
3535

3636
switch data.Type {
37-
case "openvpn":
38-
server.VPN = vpn.OpenVPN
39-
server.UDP = true
40-
server.TCP = true
4137
case "wireguard":
4238
server.VPN = vpn.Wireguard
4339
case "bridge":

0 commit comments

Comments
 (0)