mirror of
https://github.com/qdm12/gluetun.git
synced 2026-05-06 20:10:11 +02:00
chore(wevpn): removed since it is now decomissioned
This commit is contained in:
@@ -67,7 +67,6 @@ body:
|
|||||||
- VPNSecure.me
|
- VPNSecure.me
|
||||||
- VPNUnlimited
|
- VPNUnlimited
|
||||||
- VyprVPN
|
- VyprVPN
|
||||||
- WeVPN
|
|
||||||
- Windscribe
|
- Windscribe
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
@@ -86,8 +86,6 @@
|
|||||||
color: "cfe8d4"
|
color: "cfe8d4"
|
||||||
- name: "☁️ Vyprvpn"
|
- name: "☁️ Vyprvpn"
|
||||||
color: "cfe8d4"
|
color: "cfe8d4"
|
||||||
- name: "☁️ WeVPN"
|
|
||||||
color: "cfe8d4"
|
|
||||||
- name: "☁️ Windscribe"
|
- name: "☁️ Windscribe"
|
||||||
color: "cfe8d4"
|
color: "cfe8d4"
|
||||||
|
|
||||||
|
|||||||
@@ -58,11 +58,11 @@ Lightweight swiss-army-knife-like VPN client to multiple VPN service providers
|
|||||||
## Features
|
## Features
|
||||||
|
|
||||||
- Based on Alpine 3.22 for a small Docker image of 41.1MB
|
- Based on Alpine 3.22 for a small Docker image of 41.1MB
|
||||||
- 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**, **WeVPN**, **Windscribe** servers
|
- 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
|
||||||
- Supports OpenVPN for all providers listed
|
- Supports OpenVPN for all providers listed
|
||||||
- Supports Wireguard both kernelspace and userspace
|
- Supports Wireguard both kernelspace and userspace
|
||||||
- For **AirVPN**, **FastestVPN**, **Ivpn**, **Mullvad**, **NordVPN**, **Perfect privacy**, **ProtonVPN**, **Surfshark** and **Windscribe**
|
- For **AirVPN**, **FastestVPN**, **Ivpn**, **Mullvad**, **NordVPN**, **Perfect privacy**, **ProtonVPN**, **Surfshark** and **Windscribe**
|
||||||
- For **Cyberghost**, **Private Internet Access**, **PrivateVPN**, **PureVPN**, **Torguard**, **VPN Unlimited**, **VyprVPN** and **WeVPN** using [the custom provider](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/custom.md)
|
- For **Cyberghost**, **Private Internet Access**, **PrivateVPN**, **PureVPN**, **Torguard**, **VPN Unlimited** and **VyprVPN** using [the custom provider](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/custom.md)
|
||||||
- For custom Wireguard configurations using [the custom provider](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/custom.md)
|
- For custom Wireguard configurations using [the custom provider](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/custom.md)
|
||||||
- More in progress, see [#134](https://github.com/qdm12/gluetun/issues/134)
|
- More in progress, see [#134](https://github.com/qdm12/gluetun/issues/134)
|
||||||
- DNS over TLS baked in with service provider(s) of your choice
|
- DNS over TLS baked in with service provider(s) of your choice
|
||||||
|
|||||||
@@ -209,8 +209,7 @@ func validateOpenVPNClientKey(vpnProvider, clientKey string) (err error) {
|
|||||||
case
|
case
|
||||||
providers.Airvpn,
|
providers.Airvpn,
|
||||||
providers.Cyberghost,
|
providers.Cyberghost,
|
||||||
providers.VPNUnlimited,
|
providers.VPNUnlimited:
|
||||||
providers.Wevpn:
|
|
||||||
if clientKey == "" {
|
if clientKey == "" {
|
||||||
return fmt.Errorf("%w", ErrMissingValue)
|
return fmt.Errorf("%w", ErrMissingValue)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -108,9 +108,6 @@ func (o OpenVPNSelection) validate(vpnProvider string) (err error) {
|
|||||||
case providers.SlickVPN:
|
case providers.SlickVPN:
|
||||||
allowedTCP = []uint16{443, 8080, 8888}
|
allowedTCP = []uint16{443, 8080, 8888}
|
||||||
allowedUDP = []uint16{443, 8080, 8888}
|
allowedUDP = []uint16{443, 8080, 8888}
|
||||||
case providers.Wevpn:
|
|
||||||
allowedTCP = []uint16{53, 1195, 1199, 2018}
|
|
||||||
allowedUDP = []uint16{80, 1194, 1198}
|
|
||||||
case providers.Windscribe:
|
case providers.Windscribe:
|
||||||
allowedTCP = []uint16{21, 22, 80, 123, 143, 443, 587, 1194, 3306, 8080, 54783}
|
allowedTCP = []uint16{21, 22, 80, 123, 143, 443, 587, 1194, 3306, 8080, 54783}
|
||||||
allowedUDP = []uint16{53, 80, 123, 443, 1194, 54783}
|
allowedUDP = []uint16{53, 80, 123, 443, 1194, 54783}
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ const (
|
|||||||
VPNSecure = "vpnsecure"
|
VPNSecure = "vpnsecure"
|
||||||
VPNUnlimited = "vpn unlimited"
|
VPNUnlimited = "vpn unlimited"
|
||||||
Vyprvpn = "vyprvpn"
|
Vyprvpn = "vyprvpn"
|
||||||
Wevpn = "wevpn"
|
|
||||||
Windscribe = "windscribe"
|
Windscribe = "windscribe"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -56,7 +55,6 @@ func All() []string {
|
|||||||
VPNSecure,
|
VPNSecure,
|
||||||
VPNUnlimited,
|
VPNUnlimited,
|
||||||
Vyprvpn,
|
Vyprvpn,
|
||||||
Wevpn,
|
|
||||||
Windscribe,
|
Windscribe,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -166,8 +166,6 @@ func getMarkdownHeaders(vpnProvider string) (headers []string, err error) {
|
|||||||
return []string{countryHeader, cityHeader, hostnameHeader, freeHeader, streamHeader, tcpHeader, udpHeader}, nil
|
return []string{countryHeader, cityHeader, hostnameHeader, freeHeader, streamHeader, tcpHeader, udpHeader}, nil
|
||||||
case providers.Vyprvpn:
|
case providers.Vyprvpn:
|
||||||
return []string{regionHeader, hostnameHeader, tcpHeader, udpHeader}, nil
|
return []string{regionHeader, hostnameHeader, tcpHeader, udpHeader}, nil
|
||||||
case providers.Wevpn:
|
|
||||||
return []string{cityHeader, hostnameHeader, tcpHeader, udpHeader}, nil
|
|
||||||
case providers.Windscribe:
|
case providers.Windscribe:
|
||||||
return []string{regionHeader, cityHeader, hostnameHeader, vpnHeader}, nil
|
return []string{regionHeader, cityHeader, hostnameHeader, vpnHeader}, nil
|
||||||
default:
|
default:
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ import (
|
|||||||
"github.com/qdm12/gluetun/internal/provider/vpnsecure"
|
"github.com/qdm12/gluetun/internal/provider/vpnsecure"
|
||||||
"github.com/qdm12/gluetun/internal/provider/vpnunlimited"
|
"github.com/qdm12/gluetun/internal/provider/vpnunlimited"
|
||||||
"github.com/qdm12/gluetun/internal/provider/vyprvpn"
|
"github.com/qdm12/gluetun/internal/provider/vyprvpn"
|
||||||
"github.com/qdm12/gluetun/internal/provider/wevpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/windscribe"
|
"github.com/qdm12/gluetun/internal/provider/windscribe"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -83,7 +82,6 @@ func NewProviders(storage Storage, timeNow func() time.Time,
|
|||||||
providers.VPNSecure: vpnsecure.New(storage, randSource, client, updaterWarner, parallelResolver),
|
providers.VPNSecure: vpnsecure.New(storage, randSource, client, updaterWarner, parallelResolver),
|
||||||
providers.VPNUnlimited: vpnunlimited.New(storage, randSource, unzipper, updaterWarner, parallelResolver),
|
providers.VPNUnlimited: vpnunlimited.New(storage, randSource, unzipper, updaterWarner, parallelResolver),
|
||||||
providers.Vyprvpn: vyprvpn.New(storage, randSource, unzipper, updaterWarner, parallelResolver),
|
providers.Vyprvpn: vyprvpn.New(storage, randSource, unzipper, updaterWarner, parallelResolver),
|
||||||
providers.Wevpn: wevpn.New(storage, randSource, updaterWarner, parallelResolver),
|
|
||||||
providers.Windscribe: windscribe.New(storage, randSource, client, updaterWarner),
|
providers.Windscribe: windscribe.New(storage, randSource, client, updaterWarner),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
package wevpn
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (p *Provider) GetConnection(selection settings.ServerSelection, ipv6Supported bool) (
|
|
||||||
connection models.Connection, err error,
|
|
||||||
) {
|
|
||||||
defaults := utils.NewConnectionDefaults(1195, 1194, 0) //nolint:mnd
|
|
||||||
return utils.GetConnection(p.Name(),
|
|
||||||
p.storage, selection, defaults, ipv6Supported, p.randSource)
|
|
||||||
}
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
package wevpn
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"math/rand"
|
|
||||||
"net/netip"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"github.com/golang/mock/gomock"
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants"
|
|
||||||
"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/provider/common"
|
|
||||||
"github.com/stretchr/testify/assert"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Test_Provider_GetConnection(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
|
|
||||||
const provider = providers.Wevpn
|
|
||||||
|
|
||||||
errTest := errors.New("test error")
|
|
||||||
|
|
||||||
testCases := map[string]struct {
|
|
||||||
filteredServers []models.Server
|
|
||||||
storageErr error
|
|
||||||
selection settings.ServerSelection
|
|
||||||
ipv6Supported bool
|
|
||||||
connection models.Connection
|
|
||||||
errWrapped error
|
|
||||||
errMessage string
|
|
||||||
panicMessage string
|
|
||||||
}{
|
|
||||||
"error": {
|
|
||||||
storageErr: errTest,
|
|
||||||
errWrapped: errTest,
|
|
||||||
errMessage: "filtering servers: test error",
|
|
||||||
},
|
|
||||||
"default OpenVPN TCP port": {
|
|
||||||
filteredServers: []models.Server{
|
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
|
||||||
},
|
|
||||||
selection: settings.ServerSelection{
|
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
|
||||||
Protocol: constants.TCP,
|
|
||||||
},
|
|
||||||
}.WithDefaults(provider),
|
|
||||||
connection: models.Connection{
|
|
||||||
Type: vpn.OpenVPN,
|
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
|
||||||
Port: 1195,
|
|
||||||
Protocol: constants.TCP,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"default OpenVPN UDP port": {
|
|
||||||
filteredServers: []models.Server{
|
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}},
|
|
||||||
},
|
|
||||||
selection: settings.ServerSelection{
|
|
||||||
OpenVPN: settings.OpenVPNSelection{
|
|
||||||
Protocol: constants.UDP,
|
|
||||||
},
|
|
||||||
}.WithDefaults(provider),
|
|
||||||
connection: models.Connection{
|
|
||||||
Type: vpn.OpenVPN,
|
|
||||||
IP: netip.AddrFrom4([4]byte{1, 1, 1, 1}),
|
|
||||||
Port: 1194,
|
|
||||||
Protocol: constants.UDP,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
"default Wireguard port": {
|
|
||||||
filteredServers: []models.Server{
|
|
||||||
{IPs: []netip.Addr{netip.AddrFrom4([4]byte{1, 1, 1, 1})}, WgPubKey: "x"},
|
|
||||||
},
|
|
||||||
selection: settings.ServerSelection{
|
|
||||||
VPN: vpn.Wireguard,
|
|
||||||
}.WithDefaults(provider),
|
|
||||||
panicMessage: "no default Wireguard port is defined!",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
for name, testCase := range testCases {
|
|
||||||
t.Run(name, func(t *testing.T) {
|
|
||||||
t.Parallel()
|
|
||||||
ctrl := gomock.NewController(t)
|
|
||||||
|
|
||||||
storage := common.NewMockStorage(ctrl)
|
|
||||||
storage.EXPECT().FilterServers(provider, testCase.selection).
|
|
||||||
Return(testCase.filteredServers, testCase.storageErr)
|
|
||||||
randSource := rand.NewSource(0)
|
|
||||||
|
|
||||||
warner := (common.Warner)(nil)
|
|
||||||
parallelResolver := (common.ParallelResolver)(nil)
|
|
||||||
provider := New(storage, randSource, warner, parallelResolver)
|
|
||||||
|
|
||||||
if testCase.panicMessage != "" {
|
|
||||||
assert.PanicsWithValue(t, testCase.panicMessage, func() {
|
|
||||||
_, _ = provider.GetConnection(testCase.selection, testCase.ipv6Supported)
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
connection, err := provider.GetConnection(testCase.selection, testCase.ipv6Supported)
|
|
||||||
|
|
||||||
assert.ErrorIs(t, err, testCase.errWrapped)
|
|
||||||
if testCase.errWrapped != nil {
|
|
||||||
assert.EqualError(t, err, testCase.errMessage)
|
|
||||||
}
|
|
||||||
|
|
||||||
assert.Equal(t, testCase.connection, connection)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
package wevpn
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/qdm12/gluetun/internal/configuration/settings"
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/openvpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/utils"
|
|
||||||
)
|
|
||||||
|
|
||||||
func (p *Provider) OpenVPNConfig(connection models.Connection,
|
|
||||||
settings settings.OpenVPN, ipv6Supported bool,
|
|
||||||
) (lines []string) {
|
|
||||||
//nolint:mnd
|
|
||||||
providerSettings := utils.OpenVPNProviderSettings{
|
|
||||||
RemoteCertTLS: true,
|
|
||||||
AuthUserPass: true,
|
|
||||||
Ciphers: []string{
|
|
||||||
openvpn.AES256gcm,
|
|
||||||
},
|
|
||||||
Auth: openvpn.SHA512,
|
|
||||||
MssFix: 1320,
|
|
||||||
Ping: 30,
|
|
||||||
RenegDisabled: true,
|
|
||||||
CAs: []string{"MIIDQjCCAiqgAwIBAgIUPppqnRZfvGGrT4GjXFE4Q29QzgowDQYJKoZIhvcNAQELBQAwEzERMA8GA1UEAwwIQ2hhbmdlTWUwHhcNMTkxMTA1MjMzMzIzWhcNMjkxMTAyMjMzMzIzWjATMREwDwYDVQQDDAhDaGFuZ2VNZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL5DFBJlTqhXukJFWlI8TNW9+HEQCZXhyVFvQhJFF2xIGVNx51XzqxiRANjVJZJrA68kV8az0v2Dxj0SFnRWDR6pOjjdp2CyHFcgHyfv+4MrsreAtkue86bB/1ECPWaoIwtaLnwI6SEmFZl98RlI9v4M/8IE4chOnMrM/F22+2OXI//TduvTcbyOMUiiouIP8UG1FB3J5FyuaW6qPZz2G0efDoaOI+E9LSxE87OoFrII7UqdHlWxRb3nUuPU1Ee4rN/d4tFyP4AvPKfsGhVOwyGG21IdRnbXIuDi0xytkCGOZ4j2bq5zqudnp4Izt6yJgdzZpQQWK3kSHB3qTT/Yzl8CAwEAAaOBjTCBijAdBgNVHQ4EFgQUXYkoo4WbkkvbgLVdGob9RScRf3AwTgYDVR0jBEcwRYAUXYkoo4WbkkvbgLVdGob9RScRf3ChF6QVMBMxETAPBgNVBAMMCENoYW5nZU1lghQ+mmqdFl+8YatPgaNcUThDb1DOCjAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAOr1XmyWBRYfTQPNvZZ+DjCfiRYzLOi2AGefZt/jETqPDF8deVbyL1fLhXZzuX+5Etlsil3PflJjpzc/FSeZRuYRaShtwF3j6I08Eww9rBkaCnsukMUcLtMOvhdAU8dUakcRA2wkQ7Z+TWdMBv5+/6MnX10An1fIz7bAy3btMEOPTEFLo8Bst1SxJtUMaqhUteSOJ1VorpK3CWfOFaXxbJAb4E0+3zt6Vsc8mY5tt6wAi8IqiN4WD79ZdvKxENK4FMkR1kNpBY97mvdf82rzpwiBuJgN5ywmH78Ghj+9T8nI6/UIqJ1y22IRYGv6dMif8fHo5WWhCv3qmCqqY8vwuxw=="}, //nolint:lll
|
|
||||||
Cert: "MIIDTDCCAjSgAwIBAgIRAKxt8SMIXezjmHm2KDCAQdIwDQYJKoZIhvcNAQELBQAwEzERMA8GA1UEAwwIQ2hhbmdlTWUwHhcNMTkxMTA1MjMzMzI0WhcNMjkxMTAyMjMzMzI0WjAOMQwwCgYDVQQDDAN0Y3AwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvEwY2erLhMm3Mpsnybm3G6zvGyeblUAaehQVEUs+KM2/5np0Ovx0y8Iz9pIC9ITaWM0B3dM6uBsNEtylZIe4Dd9aFujunSeCFsLRf8i9AbrUombpQ6P4jzYFBxwcEw//UShwa4HZI6JuSYikdpx/dyXdBH2skahwDVc8VUFdBLLSglfKGbuzP9GsdSwQCeBRWgA3dvIzIkQkBwfnt9WQKUfRAe8e5NybaAn8Yuu9sjLkQe6eyV7toxkZTcEXdABG2vtdTEzlAsQilZzIxg3jcdeEgMgRKngng+YNP0rR5nofZ1iDlp+vBj0nuqTTJLHMrRWPIc7bdYFD/f2J49WORAgMBAAGjgZ8wgZwwCQYDVR0TBAIwADAdBgNVHQ4EFgQUmSAFmCo1FAKVq8RQF7jMxMxcMtUwTgYDVR0jBEcwRYAUXYkoo4WbkkvbgLVdGob9RScRf3ChF6QVMBMxETAPBgNVBAMMCENoYW5nZU1lghQ+mmqdFl+8YatPgaNcUThDb1DOCjATBgNVHSUEDDAKBggrBgEFBQcDAjALBgNVHQ8EBAMCB4AwDQYJKoZIhvcNAQELBQADggEBADPqdEgL+0kou8P974QEaNg1XOAXpwP0NNqbkZ/Oj9+Lp96YAhAHOAJig+RWbBktK8zu8oUUGR1qLXAWCmirlXErVuBRnadTEh3A7SOuY02BcsYAtpQ2EU9j5K/LV7nTfagkVdWy7x/av361UD4t9fv1j4YYTh4XLRp7KVXs6AGZ7T1hqPYFMUIoPpFhPzFxH4euJjfazr4SkTR6k6Vhw3pyFd6HP65vcqpzHGxFytSa8HtltBk2DpzIf8yV9TEy+gOXFaaGss0YKQ5OU1ieqZRuLVEGiu17lByYiQGyemIETJbdkyiSg93dDJRxjaTk7c8CEdpipt07ndSIPldMtXA=", //nolint:lll
|
|
||||||
TLSCrypt: "7be66c0df0b8855e076d9e37b19f9ff3c1735ed537dee6dc786e51bdb8502f878077eeba0420a25e2b04814d22bbdcc0191a4fc396fdba1af6eb090a9d8664f18e70012ee98a2e32c28620a771d13cf3a619c417480c2c312562fffaebfd7ba73f57a28edde6c287365e6ce28291a29728da211cb53e01aa46b92f5f276c61fb46bd810b41219022c8f3d9e699fe9ade6bfcbb937fbbf6f49d741740e71c7c008a9a13c2432608038c6310b4f33588d8d234b3dffcf0823395267d73140d0e9a40e323ca92866c37073bfb072ab9de518bb9f2c65df7e219c2f114afbcf7c6e3c401cb08c3ed2901725b0601d2b5de89245719dd32506d52f149d14156215c1e", //nolint:lll
|
|
||||||
ExtraLines: []string{
|
|
||||||
"redirect-gateway def1 bypass-dhcp",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
return utils.OpenVPNConfig(providerSettings, connection, settings, ipv6Supported)
|
|
||||||
}
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
package wevpn
|
|
||||||
|
|
||||||
import (
|
|
||||||
"math/rand"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/providers"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/wevpn/updater"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Provider struct {
|
|
||||||
storage common.Storage
|
|
||||||
randSource rand.Source
|
|
||||||
common.Fetcher
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(storage common.Storage, randSource rand.Source,
|
|
||||||
updaterWarner common.Warner,
|
|
||||||
parallelResolver common.ParallelResolver,
|
|
||||||
) *Provider {
|
|
||||||
return &Provider{
|
|
||||||
storage: storage,
|
|
||||||
randSource: randSource,
|
|
||||||
Fetcher: updater.New(updaterWarner, parallelResolver),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (p *Provider) Name() string {
|
|
||||||
return providers.Wevpn
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
// getAvailableCities get available cities as listed on the WeVPN website.
|
|
||||||
func getAvailableCities() (cities []string) {
|
|
||||||
return []string{
|
|
||||||
"Cairo",
|
|
||||||
"Chennai",
|
|
||||||
"Denizli",
|
|
||||||
"Dubai",
|
|
||||||
"Johannesburg",
|
|
||||||
"Lagos",
|
|
||||||
"Tel Aviv",
|
|
||||||
"Atlanta",
|
|
||||||
"Buenos Aires",
|
|
||||||
"Chicago",
|
|
||||||
"Dallas",
|
|
||||||
"Denver",
|
|
||||||
"Los Angeles",
|
|
||||||
"Los Angeles-PF",
|
|
||||||
"Mexico City",
|
|
||||||
"Miami",
|
|
||||||
"Montreal",
|
|
||||||
"New Jersey",
|
|
||||||
"New York",
|
|
||||||
"New York-PF",
|
|
||||||
"Phoenix",
|
|
||||||
"Salt Lake City",
|
|
||||||
"San Jose",
|
|
||||||
"Sao Paulo",
|
|
||||||
"Seattle",
|
|
||||||
"Toronto",
|
|
||||||
"Vancouver",
|
|
||||||
"Washington DC",
|
|
||||||
"Auckland",
|
|
||||||
"Hanoi",
|
|
||||||
"Hong Kong",
|
|
||||||
"Jakarta",
|
|
||||||
"Manila",
|
|
||||||
"Melbourne",
|
|
||||||
"Moscow",
|
|
||||||
"Seoul",
|
|
||||||
"Sibu",
|
|
||||||
"Singapore",
|
|
||||||
"St Petersburg",
|
|
||||||
"Sydney",
|
|
||||||
"Taipei",
|
|
||||||
"Tokyo",
|
|
||||||
"Amsterdam",
|
|
||||||
"Athens",
|
|
||||||
"Belgrade",
|
|
||||||
"Brussels",
|
|
||||||
"Bucharest",
|
|
||||||
"Budapest",
|
|
||||||
"Copenhagen",
|
|
||||||
"Dublin",
|
|
||||||
"Frankfurt",
|
|
||||||
"Helsinki",
|
|
||||||
"Kiev",
|
|
||||||
"Lisbon",
|
|
||||||
"London",
|
|
||||||
"London-PF",
|
|
||||||
"Luxembourg",
|
|
||||||
"Madrid",
|
|
||||||
"Manchester",
|
|
||||||
"Milan",
|
|
||||||
"Oslo",
|
|
||||||
"Oulu",
|
|
||||||
"Paris",
|
|
||||||
"Prague",
|
|
||||||
"Sofia",
|
|
||||||
"Stockholm",
|
|
||||||
"Vienna",
|
|
||||||
"Warsaw",
|
|
||||||
"Zurich",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
import "strings"
|
|
||||||
|
|
||||||
func getHostnameFromCity(city string) (hostname string) {
|
|
||||||
host := strings.ToLower(city)
|
|
||||||
host = strings.ReplaceAll(host, ".", "")
|
|
||||||
host = strings.ReplaceAll(host, " ", "")
|
|
||||||
|
|
||||||
specialCases := map[string]string{
|
|
||||||
"washingtondc": "washington",
|
|
||||||
"mexicocity": "mexico",
|
|
||||||
"denizli": "bursa",
|
|
||||||
"sibu": "kualalumpur",
|
|
||||||
"kiev": "kyiv",
|
|
||||||
"stpetersburg": "petersburg",
|
|
||||||
}
|
|
||||||
if specialHost, ok := specialCases[host]; ok {
|
|
||||||
host = specialHost
|
|
||||||
}
|
|
||||||
|
|
||||||
hostname = host + ".wevpn.com"
|
|
||||||
return hostname
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/updater/resolver"
|
|
||||||
)
|
|
||||||
|
|
||||||
func parallelResolverSettings(hosts []string) (settings resolver.ParallelSettings) {
|
|
||||||
const (
|
|
||||||
maxFailRatio = 0.1
|
|
||||||
maxDuration = 20 * time.Second
|
|
||||||
betweenDuration = time.Second
|
|
||||||
maxNoNew = 2
|
|
||||||
maxFails = 2
|
|
||||||
)
|
|
||||||
return resolver.ParallelSettings{
|
|
||||||
Hosts: hosts,
|
|
||||||
MaxFailRatio: maxFailRatio,
|
|
||||||
Repeat: resolver.RepeatSettings{
|
|
||||||
MaxDuration: maxDuration,
|
|
||||||
BetweenDuration: betweenDuration,
|
|
||||||
MaxNoNew: maxNoNew,
|
|
||||||
MaxFails: maxFails,
|
|
||||||
SortIPs: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"sort"
|
|
||||||
|
|
||||||
"github.com/qdm12/gluetun/internal/constants/vpn"
|
|
||||||
"github.com/qdm12/gluetun/internal/models"
|
|
||||||
"github.com/qdm12/gluetun/internal/provider/common"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
ErrGetZip = errors.New("cannot get OpenVPN ZIP file")
|
|
||||||
ErrGetAPI = errors.New("cannot fetch server information from API")
|
|
||||||
)
|
|
||||||
|
|
||||||
func (u *Updater) FetchServers(ctx context.Context, minServers int) (
|
|
||||||
servers []models.Server, err error,
|
|
||||||
) {
|
|
||||||
cities := getAvailableCities()
|
|
||||||
servers = make([]models.Server, 0, len(cities))
|
|
||||||
hostnames := make([]string, len(cities))
|
|
||||||
hostnameToCity := make(map[string]string, len(cities))
|
|
||||||
|
|
||||||
for i, city := range cities {
|
|
||||||
hostname := getHostnameFromCity(city)
|
|
||||||
hostnames[i] = hostname
|
|
||||||
hostnameToCity[hostname] = city
|
|
||||||
}
|
|
||||||
|
|
||||||
resolverSettings := parallelResolverSettings(hostnames)
|
|
||||||
hostnameToIPs, warnings, err := u.parallelResolver.Resolve(ctx, resolverSettings)
|
|
||||||
for _, warning := range warnings {
|
|
||||||
u.warner.Warn(warning)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(hostnameToIPs) < minServers {
|
|
||||||
return nil, fmt.Errorf("%w: %d and expected at least %d",
|
|
||||||
common.ErrNotEnoughServers, len(servers), minServers)
|
|
||||||
}
|
|
||||||
|
|
||||||
for hostname, ips := range hostnameToIPs {
|
|
||||||
city := hostnameToCity[hostname]
|
|
||||||
server := models.Server{
|
|
||||||
VPN: vpn.OpenVPN,
|
|
||||||
City: city,
|
|
||||||
Hostname: hostname,
|
|
||||||
UDP: true,
|
|
||||||
IPs: ips,
|
|
||||||
}
|
|
||||||
servers = append(servers, server)
|
|
||||||
}
|
|
||||||
|
|
||||||
sort.Sort(models.SortableServers(servers))
|
|
||||||
|
|
||||||
return servers, nil
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
package updater
|
|
||||||
|
|
||||||
import "github.com/qdm12/gluetun/internal/provider/common"
|
|
||||||
|
|
||||||
type Updater struct {
|
|
||||||
parallelResolver common.ParallelResolver
|
|
||||||
warner common.Warner
|
|
||||||
}
|
|
||||||
|
|
||||||
func New(warner common.Warner, parallelResolver common.ParallelResolver) *Updater {
|
|
||||||
return &Updater{
|
|
||||||
parallelResolver: parallelResolver,
|
|
||||||
warner: warner,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -297189,633 +297189,6 @@
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"wevpn": {
|
|
||||||
"version": 2,
|
|
||||||
"timestamp": 1679755674,
|
|
||||||
"servers": [
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Amsterdam",
|
|
||||||
"hostname": "amsterdam.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"89.238.177.234"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Athens",
|
|
||||||
"hostname": "athens.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"185.51.134.210"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Atlanta",
|
|
||||||
"hostname": "atlanta.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"104.223.91.146"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Auckland",
|
|
||||||
"hostname": "auckland.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"103.108.94.226"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Belgrade",
|
|
||||||
"hostname": "belgrade.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"37.120.193.170"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Brussels",
|
|
||||||
"hostname": "brussels.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"77.243.191.178"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Bucharest",
|
|
||||||
"hostname": "bucharest.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"86.105.25.162"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Budapest",
|
|
||||||
"hostname": "budapest.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"185.128.26.130"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Buenos Aires",
|
|
||||||
"hostname": "buenosaires.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"131.255.4.140"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Cairo",
|
|
||||||
"hostname": "cairo.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"188.214.122.138"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Chennai",
|
|
||||||
"hostname": "chennai.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"169.38.107.52"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Chicago",
|
|
||||||
"hostname": "chicago.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"69.39.239.72"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Copenhagen",
|
|
||||||
"hostname": "copenhagen.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"37.120.194.82"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Dallas",
|
|
||||||
"hostname": "dallas.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"194.110.112.74"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Denizli",
|
|
||||||
"hostname": "bursa.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"89.252.132.138"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Denver",
|
|
||||||
"hostname": "denver.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"70.39.71.2"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Dubai",
|
|
||||||
"hostname": "dubai.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"217.138.193.42"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Dublin",
|
|
||||||
"hostname": "dublin.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"217.138.222.138"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Frankfurt",
|
|
||||||
"hostname": "frankfurt.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"45.141.152.178"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Hanoi",
|
|
||||||
"hostname": "hanoi.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"188.214.152.194"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Helsinki",
|
|
||||||
"hostname": "helsinki.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"185.212.149.152"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Hong Kong",
|
|
||||||
"hostname": "hongkong.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"84.17.37.55"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Jakarta",
|
|
||||||
"hostname": "jakarta.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"45.133.181.58"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Johannesburg",
|
|
||||||
"hostname": "johannesburg.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"102.165.20.38"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Kiev",
|
|
||||||
"hostname": "kyiv.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"37.19.218.197"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Lagos",
|
|
||||||
"hostname": "lagos.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"102.129.144.142"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Lisbon",
|
|
||||||
"hostname": "lisbon.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"185.90.57.152"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "London",
|
|
||||||
"hostname": "london.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"45.141.154.2"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "London-PF",
|
|
||||||
"hostname": "london-pf.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"77.243.177.78"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Los Angeles",
|
|
||||||
"hostname": "losangeles.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"45.152.182.82"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Los Angeles-PF",
|
|
||||||
"hostname": "losangeles-pf.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"66.55.92.75"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Luxembourg",
|
|
||||||
"hostname": "luxembourg.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"5.253.204.194"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Madrid",
|
|
||||||
"hostname": "madrid.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"45.152.183.242"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Manchester",
|
|
||||||
"hostname": "manchester.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"86.106.136.98"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Manila",
|
|
||||||
"hostname": "manila.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"188.214.125.106"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Melbourne",
|
|
||||||
"hostname": "melbourne.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"116.206.230.130"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Mexico City",
|
|
||||||
"hostname": "mexico.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"169.57.35.97"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Miami",
|
|
||||||
"hostname": "miami.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"96.47.224.2"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Milan",
|
|
||||||
"hostname": "milan.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"217.138.197.138"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Montreal",
|
|
||||||
"hostname": "montreal.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"217.138.200.242"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Moscow",
|
|
||||||
"hostname": "moscow.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"80.93.181.194"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "New Jersey",
|
|
||||||
"hostname": "newjersey.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"23.226.131.146"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "New York",
|
|
||||||
"hostname": "newyork.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"217.138.206.98"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "New York-PF",
|
|
||||||
"hostname": "newyork-pf.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"188.241.179.2"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Oslo",
|
|
||||||
"hostname": "oslo.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"84.247.50.10"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Oulu",
|
|
||||||
"hostname": "oulu.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"188.126.89.174"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Paris",
|
|
||||||
"hostname": "paris.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"37.120.136.234"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Phoenix",
|
|
||||||
"hostname": "phoenix.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"170.130.15.34"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Prague",
|
|
||||||
"hostname": "prague.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"217.138.199.138"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Salt Lake City",
|
|
||||||
"hostname": "saltlakecity.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"107.182.234.233"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "San Jose",
|
|
||||||
"hostname": "sanjose.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"66.115.157.226"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Sao Paulo",
|
|
||||||
"hostname": "saopaulo.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"177.54.152.89"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Seattle",
|
|
||||||
"hostname": "seattle.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"104.140.21.178"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Seoul",
|
|
||||||
"hostname": "seoul.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"169.56.83.206"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Sibu",
|
|
||||||
"hostname": "kualalumpur.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"223.25.246.4"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Singapore",
|
|
||||||
"hostname": "singapore.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"84.17.38.144"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Sofia",
|
|
||||||
"hostname": "sofia.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"217.138.221.42"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "St Petersburg",
|
|
||||||
"hostname": "petersburg.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"82.202.220.242"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Stockholm",
|
|
||||||
"hostname": "stockholm.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"45.83.91.66"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Sydney",
|
|
||||||
"hostname": "sydney.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"46.102.153.106"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Taipei",
|
|
||||||
"hostname": "taipei.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"188.214.106.98"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Tel Aviv",
|
|
||||||
"hostname": "telaviv.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"212.199.61.55"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Tokyo",
|
|
||||||
"hostname": "tokyo.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"84.17.34.8"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Toronto",
|
|
||||||
"hostname": "toronto.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"184.75.208.234"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Vancouver",
|
|
||||||
"hostname": "vancouver.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"71.19.249.109"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Vienna",
|
|
||||||
"hostname": "vienna.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"37.120.212.162"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Warsaw",
|
|
||||||
"hostname": "warsaw.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"217.138.209.122"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Washington DC",
|
|
||||||
"hostname": "washington.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"70.32.0.208"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"vpn": "openvpn",
|
|
||||||
"city": "Zurich",
|
|
||||||
"hostname": "zurich.wevpn.com",
|
|
||||||
"udp": true,
|
|
||||||
"ips": [
|
|
||||||
"37.120.137.82"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"windscribe": {
|
"windscribe": {
|
||||||
"version": 2,
|
"version": 2,
|
||||||
"timestamp": 1722459630,
|
"timestamp": 1722459630,
|
||||||
|
|||||||
Reference in New Issue
Block a user