chore(wevpn): removed since it is now decomissioned

This commit is contained in:
Quentin McGaw
2025-12-23 02:12:02 +00:00
parent e627504fb5
commit 92237658c3
18 changed files with 4 additions and 1041 deletions
-1
View File
@@ -67,7 +67,6 @@ body:
- VPNSecure.me
- VPNUnlimited
- VyprVPN
- WeVPN
- Windscribe
validations:
required: true
-2
View File
@@ -86,8 +86,6 @@
color: "cfe8d4"
- name: "☁️ Vyprvpn"
color: "cfe8d4"
- name: "☁️ WeVPN"
color: "cfe8d4"
- name: "☁️ Windscribe"
color: "cfe8d4"
+2 -2
View File
@@ -58,11 +58,11 @@ Lightweight swiss-army-knife-like VPN client to multiple VPN service providers
## Features
- 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 Wireguard both kernelspace and userspace
- 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)
- More in progress, see [#134](https://github.com/qdm12/gluetun/issues/134)
- DNS over TLS baked in with service provider(s) of your choice
+1 -2
View File
@@ -209,8 +209,7 @@ func validateOpenVPNClientKey(vpnProvider, clientKey string) (err error) {
case
providers.Airvpn,
providers.Cyberghost,
providers.VPNUnlimited,
providers.Wevpn:
providers.VPNUnlimited:
if clientKey == "" {
return fmt.Errorf("%w", ErrMissingValue)
}
@@ -108,9 +108,6 @@ func (o OpenVPNSelection) validate(vpnProvider string) (err error) {
case providers.SlickVPN:
allowedTCP = []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:
allowedTCP = []uint16{21, 22, 80, 123, 143, 443, 587, 1194, 3306, 8080, 54783}
allowedUDP = []uint16{53, 80, 123, 443, 1194, 54783}
@@ -27,7 +27,6 @@ const (
VPNSecure = "vpnsecure"
VPNUnlimited = "vpn unlimited"
Vyprvpn = "vyprvpn"
Wevpn = "wevpn"
Windscribe = "windscribe"
)
@@ -56,7 +55,6 @@ func All() []string {
VPNSecure,
VPNUnlimited,
Vyprvpn,
Wevpn,
Windscribe,
}
}
-2
View File
@@ -166,8 +166,6 @@ func getMarkdownHeaders(vpnProvider string) (headers []string, err error) {
return []string{countryHeader, cityHeader, hostnameHeader, freeHeader, streamHeader, tcpHeader, udpHeader}, nil
case providers.Vyprvpn:
return []string{regionHeader, hostnameHeader, tcpHeader, udpHeader}, nil
case providers.Wevpn:
return []string{cityHeader, hostnameHeader, tcpHeader, udpHeader}, nil
case providers.Windscribe:
return []string{regionHeader, cityHeader, hostnameHeader, vpnHeader}, nil
default:
-2
View File
@@ -33,7 +33,6 @@ import (
"github.com/qdm12/gluetun/internal/provider/vpnsecure"
"github.com/qdm12/gluetun/internal/provider/vpnunlimited"
"github.com/qdm12/gluetun/internal/provider/vyprvpn"
"github.com/qdm12/gluetun/internal/provider/wevpn"
"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.VPNUnlimited: vpnunlimited.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),
}
-15
View File
@@ -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)
}
-115
View File
@@ -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)
})
}
}
-32
View File
@@ -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)
}
-30
View File
@@ -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
}
-76
View File
@@ -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,
}
}
-627
View File
@@ -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": {
"version": 2,
"timestamp": 1722459630,