Compare commits

..

13 Commits

Author SHA1 Message Date
Quentin McGaw
91b037a335 Feature: update hardcoded servers for DNS resolution based VPN providers 2021-05-06 18:51:31 +00:00
Quentin McGaw
d5ef3de64c Feature: more robust updater DNS resolution
- Parallel resolver to resolve multiple hosts
- Repeat resolver to repeat resolution for a single host
- Additional parameters for fault toleration
- Do not update servers if e.g. > 10% DNS resolutions failed
- resolver package in updater package
2021-05-06 18:48:14 +00:00
Quentin McGaw
167a0b0b29 Restart unhealthy (#417) (#441) 2021-05-04 15:36:12 -04:00
Quentin McGaw
954e3c70b2 Feature: Protonvpn support (#437 clone on #434) 2021-04-25 15:44:45 -04:00
Quentin McGaw
b02a80abbd Feature: update PIA server information 2021-04-24 13:54:13 +00:00
Quentin McGaw
04313d3c3b Maintenance: devcontainer changes
- Bind mount for root only
- Support for Windows Hyperv bind mounts
- Run go mod tidy after go mod download
- Use :z flag for possibly shared bind mounts
- Bind mount zsh_history
- Bind mount docker config directory
2021-04-24 13:53:48 +00:00
Quentin McGaw
fb8279f8f0 Fix: remove pull-filter ignore ping-restart 2021-04-19 19:51:00 +00:00
Quentin McGaw
e0e56595c6 Fix: only run ip6tables if it is supported by the Kernel (#431)
- Fix #430
2021-04-19 14:35:29 -04:00
Quentin McGaw
44d8cf9d4e Replace Surfshark default cipher with aes 256 gcm 2021-04-19 18:00:58 +00:00
Quentin McGaw
282c1e53ec Clear firewall rules on shutdown, fix #276 2021-04-19 14:27:38 +00:00
Quentin McGaw
7ba98af1cc Feature/Bugfix: IPv6 blocking (#428)
- Feature/Bugfix: Block all IPv6 traffic with `ip6tables` by default
- Feature: Adapt existing firewall code to handle IPv4 and IPv6, depending on user inputs and environment
- Maintenance: improve error wrapping in the firewall package
2021-04-19 09:24:46 -04:00
Quentin McGaw
d3df5aaa52 Upgrade system and package versions
- Alpine from 3.12 to 3.13 and:
- Openvpn from 2.4.10 to 2.5.1
- Unbound from 1.10.1 to 1.13.0
- Iptables from 1.8.4 to 1.8.6
2021-04-19 00:31:46 +00:00
Quentin McGaw
1c83dcab5e Maintenance: upgrade golangci-lint to 1.39.0 2021-04-19 00:20:43 +00:00
75 changed files with 4221 additions and 1474 deletions

View File

@@ -19,6 +19,7 @@ It works on Linux, Windows and OSX.
1. Open the command palette in Visual Studio Code (CTRL+SHIFT+P).
1. Select `Remote-Containers: Open Folder in Container...` and choose the project directory.
1. For Docker running on Windows HyperV, if you want to use SSH keys, bind mount them at `/tmp/.ssh` by changing the `volumes` section in the [docker-compose.yml](docker-compose.yml).
## Customization

View File

@@ -8,7 +8,7 @@
"vscode"
],
"shutdownAction": "stopCompose",
"postCreateCommand": "go mod download",
"postCreateCommand": "source ~/.windows.sh && go mod download && go mod tidy",
"workspaceFolder": "/workspace",
"extensions": [
"golang.go",

View File

@@ -8,12 +8,17 @@ services:
- ../:/workspace
# Docker socket to access Docker server
- /var/run/docker.sock:/var/run/docker.sock
# SSH directory
- ~/.ssh:/home/vscode/.ssh
- ~/.ssh:/root/.ssh
# Docker configuration
- ~/.docker:/root/.docker:z
# SSH directory for Linux, OSX and WSL
- ~/.ssh:/root/.ssh:z
# For Windows without WSL, a copy will be made
# from /tmp/.ssh to ~/.ssh to fix permissions
#- ~/.ssh:/tmp/.ssh:ro
# Shell history persistence
- ~/.zsh_history:/root/.zsh_history:z
# Git config
- ~/.gitconfig:/home/districter/.gitconfig
- ~/.gitconfig:/root/.gitconfig
- ~/.gitconfig:/root/.gitconfig:z
environment:
- TZ=
cap_add:

2
.github/labels.yml vendored
View File

@@ -39,6 +39,8 @@
- name: ":cloud: PrivateVPN"
color: "cfe8d4"
description: ""
- name: ":cloud: ProtonVPN"
color: "cfe8d4"
- name: ":cloud: PureVPN"
color: "cfe8d4"
description: ""

View File

@@ -1,4 +1,4 @@
ARG ALPINE_VERSION=3.12
ARG ALPINE_VERSION=3.13
ARG GO_VERSION=1.16
ARG BUILDPLATFORM=linux/amd64
@@ -19,7 +19,7 @@ ENV CGO_ENABLED=1
RUN apk --update --no-cache add g++
FROM --platform=$BUILDPLATFORM base AS lint
ARG GOLANGCI_LINT_VERSION=v1.37.0
ARG GOLANGCI_LINT_VERSION=v1.39.0
RUN wget -O- -nv https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | \
sh -s -- -b /usr/local/bin ${GOLANGCI_LINT_VERSION}
COPY .golangci.yml ./

View File

@@ -2,10 +2,10 @@
*Lightweight swiss-knife-like VPN client to tunnel to Cyberghost, FastestVPN,
HideMyAss, Mullvad, NordVPN, Privado, Private Internet Access, PrivateVPN,
PureVPN, Surfshark, TorGuard, VyprVPN and Windscribe VPN servers
ProtonVPN, PureVPN, Surfshark, TorGuard, VyprVPN and Windscribe VPN servers
using Go, OpenVPN, iptables, DNS over TLS, ShadowSocks and an HTTP proxy*
**ANNOUNCEMENT**: *New Docker image name `qmcgaw/gluetun`*
**ANNOUNCEMENT**:
<img height="250" src="https://raw.githubusercontent.com/qdm12/gluetun/master/title.svg?sanitize=true">
@@ -38,8 +38,8 @@ using Go, OpenVPN, iptables, DNS over TLS, ShadowSocks and an HTTP proxy*
## Features
- Based on Alpine 3.12 for a small Docker image of 52MB
- Supports: **Cyberghost**, **FastestVPN**, **HideMyAss**, **Mullvad**, **NordVPN**, **Privado**, **Private Internet Access**, **PrivateVPN**, **PureVPN**, **Surfshark**, **TorGuard**, **Vyprvpn**, **Windscribe**, servers
- Based on Alpine 3.13 for a small Docker image of 52MB
- Supports: **Cyberghost**, **FastestVPN**, **HideMyAss**, **Mullvad**, **NordVPN**, **Privado**, **Private Internet Access**, **PrivateVPN**, **ProtonVPN**, **PureVPN**, **Surfshark**, **TorGuard**, **Vyprvpn**, **Windscribe** servers
- Supports Openvpn only for now
- DNS over TLS baked in with service provider(s) of your choice
- DNS fine blocking of malicious/ads/surveillance hostnames and IP addresses, with live update every 24 hours
@@ -60,6 +60,7 @@ using Go, OpenVPN, iptables, DNS over TLS, ShadowSocks and an HTTP proxy*
1. On some devices you may need to setup your tunnel kernel module on your host with `insmod /lib/modules/tun.ko` or `modprobe tun`
- [Synology users Wiki page](https://github.com/qdm12/gluetun/wiki/Synology-setup)
1. ⚠️ Raspberry Pi users running 32 bit systems: from image `v3.16.0` you need to do [this](https://github.com/alpinelinux/docker-alpine/issues/135#issuecomment-812287338) on your host to run the container.
1. Launch the container with:
```bash

View File

@@ -253,9 +253,10 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
} // TODO move inside firewall?
wg := &sync.WaitGroup{}
healthy := make(chan bool)
openvpnLooper := openvpn.NewLooper(allSettings.OpenVPN, nonRootUsername, puid, pgid, allServers,
ovpnConf, firewallConf, routingConf, logger, httpClient, os.OpenFile, tunnelReadyCh, cancel)
ovpnConf, firewallConf, routingConf, logger, httpClient, os.OpenFile, tunnelReadyCh, healthy, cancel)
wg.Add(1)
// wait for restartOpenvpn
go openvpnLooper.Run(ctx, wg)
@@ -302,7 +303,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
healthcheckServer := healthcheck.NewServer(
constants.HealthcheckAddress, logger)
wg.Add(1)
go healthcheckServer.Run(ctx, wg)
go healthcheckServer.Run(ctx, healthy, wg)
// Start openvpn for the first time in a blocking call
// until openvpn is launched
@@ -317,6 +318,14 @@ func _main(ctx context.Context, buildInfo models.BuildInformation,
}
}
if allSettings.Firewall.Enabled {
const enable = false
err := firewallConf.SetEnabled(context.Background(), enable)
if err != nil {
logger.Error(err)
}
}
wg.Wait()
return nil

View File

@@ -30,6 +30,7 @@ func (c *cli) Update(ctx context.Context, args []string, os os.OS) error {
flagSet.BoolVar(&options.PIA, "pia", false, "Update Private Internet Access post-summer 2020 servers")
flagSet.BoolVar(&options.Privado, "privado", false, "Update Privado servers")
flagSet.BoolVar(&options.Privatevpn, "privatevpn", false, "Update Private VPN servers")
flagSet.BoolVar(&options.Protonvpn, "protonvpn", false, "Update Protonvpn servers")
flagSet.BoolVar(&options.Purevpn, "purevpn", false, "Update Purevpn servers")
flagSet.BoolVar(&options.Surfshark, "surfshark", false, "Update Surfshark servers")
flagSet.BoolVar(&options.Torguard, "torguard", false, "Update Torguard servers")

View File

@@ -62,7 +62,7 @@ var (
func (settings *OpenVPN) read(r reader) (err error) {
vpnsp, err := r.env.Inside("VPNSP", []string{
"cyberghost", "fastestvpn", "hidemyass", "mullvad", "nordvpn",
"privado", "pia", "private internet access", "privatevpn",
"privado", "pia", "private internet access", "privatevpn", "protonvpn",
"purevpn", "surfshark", "torguard", "vyprvpn", "windscribe"},
params.Default("private internet access"))
if err != nil {
@@ -141,6 +141,8 @@ func (settings *OpenVPN) read(r reader) (err error) {
readProvider = settings.Provider.readPrivateInternetAccess
case constants.Privatevpn:
readProvider = settings.Provider.readPrivatevpn
case constants.Protonvpn:
readProvider = settings.Provider.readProtonvpn
case constants.Purevpn:
readProvider = settings.Provider.readPurevpn
case constants.Surfshark:

View File

@@ -16,10 +16,43 @@ func Test_OpenVPN_JSON(t *testing.T) {
Name: "name",
},
}
data, err := json.Marshal(in)
data, err := json.MarshalIndent(in, "", " ")
require.NoError(t, err)
//nolint:lll
assert.Equal(t, `{"user":"","password":"","verbosity":0,"mssfix":0,"run_as_root":true,"cipher":"","auth":"","provider":{"name":"name","server_selection":{"network_protocol":"","regions":null,"group":"","countries":null,"cities":null,"hostnames":null,"isps":null,"owned":false,"custom_port":0,"numbers":null,"encryption_preset":""},"extra_config":{"encryption_preset":"","openvpn_ipv6":false},"port_forwarding":{"enabled":false,"filepath":""}},"custom_config":""}`, string(data))
assert.Equal(t, `{
"user": "",
"password": "",
"verbosity": 0,
"mssfix": 0,
"run_as_root": true,
"cipher": "",
"auth": "",
"provider": {
"name": "name",
"server_selection": {
"network_protocol": "",
"regions": null,
"group": "",
"countries": null,
"cities": null,
"hostnames": null,
"names": null,
"isps": null,
"owned": false,
"custom_port": 0,
"numbers": null,
"encryption_preset": ""
},
"extra_config": {
"encryption_preset": "",
"openvpn_ipv6": false
},
"port_forwarding": {
"enabled": false,
"filepath": ""
}
},
"custom_config": ""
}`, string(data))
var out OpenVPN
err = json.Unmarshal(data, &out)
require.NoError(t, err)

View File

@@ -0,0 +1,75 @@
package configuration
import (
"github.com/qdm12/gluetun/internal/constants"
)
func (settings *Provider) protonvpnLines() (lines []string) {
if len(settings.ServerSelection.Countries) > 0 {
lines = append(lines, lastIndent+"Countries: "+commaJoin(settings.ServerSelection.Countries))
}
if len(settings.ServerSelection.Regions) > 0 {
lines = append(lines, lastIndent+"Regions: "+commaJoin(settings.ServerSelection.Regions))
}
if len(settings.ServerSelection.Cities) > 0 {
lines = append(lines, lastIndent+"Cities: "+commaJoin(settings.ServerSelection.Cities))
}
if len(settings.ServerSelection.Names) > 0 {
lines = append(lines, lastIndent+"Names: "+commaJoin(settings.ServerSelection.Names))
}
if len(settings.ServerSelection.Hostnames) > 0 {
lines = append(lines, lastIndent+"Hostnames: "+commaJoin(settings.ServerSelection.Hostnames))
}
return lines
}
func (settings *Provider) readProtonvpn(r reader) (err error) {
settings.Name = constants.Protonvpn
settings.ServerSelection.Protocol, err = readProtocol(r.env)
if err != nil {
return err
}
settings.ServerSelection.TargetIP, err = readTargetIP(r.env)
if err != nil {
return err
}
settings.ServerSelection.CustomPort, err = readPortOrZero(r.env, "PORT")
if err != nil {
return err
}
settings.ServerSelection.Countries, err = r.env.CSVInside("COUNTRY", constants.ProtonvpnCountryChoices())
if err != nil {
return err
}
settings.ServerSelection.Regions, err = r.env.CSVInside("REGION", constants.ProtonvpnRegionChoices())
if err != nil {
return err
}
settings.ServerSelection.Cities, err = r.env.CSVInside("CITY", constants.ProtonvpnCityChoices())
if err != nil {
return err
}
settings.ServerSelection.Hostnames, err = r.env.CSVInside("SERVER_NAME", constants.ProtonvpnNameChoices())
if err != nil {
return err
}
settings.ServerSelection.Hostnames, err = r.env.CSVInside("SERVER_HOSTNAME", constants.ProtonvpnHostnameChoices())
if err != nil {
return err
}
return nil
}

View File

@@ -45,6 +45,8 @@ func (settings *Provider) lines() (lines []string) {
providerLines = settings.privatevpnLines()
case "private internet access":
providerLines = settings.privateinternetaccessLines()
case "protonvpn":
providerLines = settings.protonvpnLines()
case "purevpn":
providerLines = settings.purevpnLines()
case "surfshark":

View File

@@ -148,6 +148,28 @@ func Test_Provider_lines(t *testing.T) {
" |--Hostnames: a, b",
},
},
"protonvpn": {
settings: Provider{
Name: constants.Protonvpn,
ServerSelection: ServerSelection{
Protocol: constants.UDP,
Countries: []string{"a", "b"},
Regions: []string{"c", "d"},
Cities: []string{"e", "f"},
Names: []string{"g", "h"},
Hostnames: []string{"i", "j"},
},
},
lines: []string{
"|--Protonvpn settings:",
" |--Network protocol: udp",
" |--Countries: a, b",
" |--Regions: c, d",
" |--Cities: e, f",
" |--Names: g, h",
" |--Hostnames: i, j",
},
},
"private internet access": {
settings: Provider{
Name: constants.PrivateInternetAccess,

View File

@@ -9,15 +9,16 @@ type ServerSelection struct {
Protocol string `json:"network_protocol"`
TargetIP net.IP `json:"target_ip,omitempty"`
// TODO comments
// Cyberghost, PIA, Surfshark, Windscribe, Vyprvpn, NordVPN
// Cyberghost, PIA, Protonvpn, Surfshark, Windscribe, Vyprvpn, NordVPN
Regions []string `json:"regions"`
// Cyberghost
Group string `json:"group"`
Countries []string `json:"countries"` // Fastestvpn, HideMyAss, Mullvad, PrivateVPN, PureVPN
Cities []string `json:"cities"` // HideMyAss, Mullvad, PrivateVPN, PureVPN, Windscribe
Hostnames []string `json:"hostnames"` // Fastestvpn, HideMyAss, PrivateVPN, Windscribe, Privado
Countries []string `json:"countries"` // Fastestvpn, HideMyAss, Mullvad, PrivateVPN, Protonvpn, PureVPN
Cities []string `json:"cities"` // HideMyAss, Mullvad, PrivateVPN, Protonvpn, PureVPN, Windscribe
Hostnames []string `json:"hostnames"` // Fastestvpn, HideMyAss, PrivateVPN, Windscribe, Privado, Protonvpn
Names []string `json:"names"` // Protonvpn
// Mullvad
ISPs []string `json:"isps"`

View File

@@ -18,6 +18,7 @@ type Updater struct {
PIA bool `json:"pia"`
Privado bool `json:"privado"`
Privatevpn bool `json:"privatevpn"`
Protonvpn bool `json:"protonvpn"`
Purevpn bool `json:"purevpn"`
Surfshark bool `json:"surfshark"`
Torguard bool `json:"torguard"`
@@ -53,6 +54,7 @@ func (settings *Updater) read(r reader) (err error) {
settings.PIA = true
settings.Privado = true
settings.Privatevpn = true
settings.Protonvpn = true
settings.Purevpn = true
settings.Surfshark = true
settings.Torguard = true

View File

@@ -34,180 +34,161 @@ func CyberghostGroupChoices() (choices []string) {
// of the Cyberghost server.
func CyberghostServers() []models.CyberghostServer {
return []models.CyberghostServer{
{Region: "Albania", Group: "Premium TCP Europe", IPs: []net.IP{{31, 171, 152, 99}, {31, 171, 152, 100}, {31, 171, 152, 101}, {31, 171, 152, 102}, {31, 171, 152, 105}, {31, 171, 152, 108}, {31, 171, 152, 132}, {31, 171, 152, 136}, {31, 171, 152, 139}, {31, 171, 152, 140}}},
{Region: "Albania", Group: "Premium UDP Europe", IPs: []net.IP{{31, 171, 152, 102}, {31, 171, 152, 103}, {31, 171, 152, 105}, {31, 171, 152, 106}, {31, 171, 152, 108}, {31, 171, 152, 109}, {31, 171, 152, 110}, {31, 171, 152, 135}, {31, 171, 152, 137}, {31, 171, 152, 139}}},
{Region: "Algeria", Group: "Premium UDP Europe", IPs: []net.IP{{176, 125, 228, 131}, {176, 125, 228, 132}, {176, 125, 228, 133}, {176, 125, 228, 134}, {176, 125, 228, 135}, {176, 125, 228, 136}, {176, 125, 228, 137}, {176, 125, 228, 140}, {176, 125, 228, 142}, {176, 125, 228, 143}}},
{Region: "Algeria", Group: "Premium TCP Europe", IPs: []net.IP{{176, 125, 228, 131}, {176, 125, 228, 132}, {176, 125, 228, 133}, {176, 125, 228, 134}, {176, 125, 228, 136}, {176, 125, 228, 139}, {176, 125, 228, 140}, {176, 125, 228, 141}, {176, 125, 228, 142}, {176, 125, 228, 143}}},
{Region: "Andorra", Group: "Premium UDP Europe", IPs: []net.IP{{188, 241, 82, 132}, {188, 241, 82, 133}, {188, 241, 82, 135}, {188, 241, 82, 138}, {188, 241, 82, 141}, {188, 241, 82, 144}, {188, 241, 82, 146}, {188, 241, 82, 157}, {188, 241, 82, 159}, {188, 241, 82, 166}}},
{Region: "Andorra", Group: "Premium TCP Europe", IPs: []net.IP{{188, 241, 82, 135}, {188, 241, 82, 136}, {188, 241, 82, 140}, {188, 241, 82, 142}, {188, 241, 82, 149}, {188, 241, 82, 151}, {188, 241, 82, 154}, {188, 241, 82, 160}, {188, 241, 82, 163}, {188, 241, 82, 165}}},
{Region: "Argentina", Group: "Premium UDP USA", IPs: []net.IP{{190, 106, 130, 15}, {190, 106, 130, 16}, {190, 106, 130, 20}, {190, 106, 130, 21}, {190, 106, 130, 22}, {190, 106, 130, 23}, {190, 106, 130, 37}, {190, 106, 130, 39}, {190, 106, 130, 43}, {190, 106, 130, 44}}},
{Region: "Argentina", Group: "Premium TCP USA", IPs: []net.IP{{190, 106, 130, 16}, {190, 106, 130, 17}, {190, 106, 130, 18}, {190, 106, 130, 26}, {190, 106, 130, 38}, {190, 106, 130, 40}, {190, 106, 130, 41}, {190, 106, 130, 42}, {190, 106, 130, 45}, {190, 106, 130, 52}}},
{Region: "Armenia", Group: "Premium UDP Europe", IPs: []net.IP{{185, 253, 160, 131}, {185, 253, 160, 132}, {185, 253, 160, 134}, {185, 253, 160, 135}, {185, 253, 160, 136}, {185, 253, 160, 137}, {185, 253, 160, 138}, {185, 253, 160, 139}, {185, 253, 160, 141}, {185, 253, 160, 144}}},
{Region: "Armenia", Group: "Premium TCP Europe", IPs: []net.IP{{185, 253, 160, 133}, {185, 253, 160, 134}, {185, 253, 160, 136}, {185, 253, 160, 137}, {185, 253, 160, 138}, {185, 253, 160, 139}, {185, 253, 160, 140}, {185, 253, 160, 141}, {185, 253, 160, 143}, {185, 253, 160, 144}}},
{Region: "Australia", Group: "Premium TCP Asia", IPs: []net.IP{{43, 242, 68, 111}, {43, 242, 68, 113}, {43, 242, 68, 120}, {202, 60, 80, 16}, {202, 60, 80, 72}, {202, 60, 80, 96}, {202, 60, 80, 151}, {202, 60, 80, 172}, {202, 60, 80, 173}, {202, 60, 80, 178}}},
{Region: "Australia", Group: "Premium UDP Asia", IPs: []net.IP{{43, 242, 68, 83}, {43, 242, 68, 94}, {202, 60, 80, 11}, {202, 60, 80, 21}, {202, 60, 80, 69}, {202, 60, 80, 107}, {202, 60, 80, 122}, {202, 60, 80, 123}, {202, 60, 80, 132}, {202, 60, 80, 162}}},
{Region: "Austria", Group: "Premium TCP Europe", IPs: []net.IP{{89, 187, 168, 134}, {89, 187, 168, 139}, {89, 187, 168, 140}, {89, 187, 168, 145}, {89, 187, 168, 146}, {89, 187, 168, 150}, {89, 187, 168, 167}, {89, 187, 168, 169}, {89, 187, 168, 180}, {89, 187, 168, 182}}},
{Region: "Austria", Group: "Premium UDP Europe", IPs: []net.IP{{89, 187, 168, 131}, {89, 187, 168, 132}, {89, 187, 168, 144}, {89, 187, 168, 147}, {89, 187, 168, 150}, {89, 187, 168, 151}, {89, 187, 168, 152}, {89, 187, 168, 163}, {89, 187, 168, 175}, {89, 187, 168, 177}}},
{Region: "Bahamas", Group: "Premium TCP USA", IPs: []net.IP{{95, 181, 238, 131}, {95, 181, 238, 132}, {95, 181, 238, 137}, {95, 181, 238, 139}, {95, 181, 238, 140}, {95, 181, 238, 141}, {95, 181, 238, 144}, {95, 181, 238, 146}, {95, 181, 238, 147}, {95, 181, 238, 153}}},
{Region: "Bahamas", Group: "Premium UDP USA", IPs: []net.IP{{95, 181, 238, 131}, {95, 181, 238, 133}, {95, 181, 238, 137}, {95, 181, 238, 138}, {95, 181, 238, 140}, {95, 181, 238, 141}, {95, 181, 238, 142}, {95, 181, 238, 146}, {95, 181, 238, 152}, {95, 181, 238, 153}}},
{Region: "Bangladesh", Group: "Premium UDP Asia", IPs: []net.IP{{84, 252, 93, 131}, {84, 252, 93, 132}, {84, 252, 93, 133}, {84, 252, 93, 134}, {84, 252, 93, 137}, {84, 252, 93, 140}, {84, 252, 93, 142}, {84, 252, 93, 143}, {84, 252, 93, 144}, {84, 252, 93, 145}}},
{Region: "Bangladesh", Group: "Premium TCP Asia", IPs: []net.IP{{84, 252, 93, 131}, {84, 252, 93, 132}, {84, 252, 93, 135}, {84, 252, 93, 136}, {84, 252, 93, 139}, {84, 252, 93, 140}, {84, 252, 93, 141}, {84, 252, 93, 142}, {84, 252, 93, 144}, {84, 252, 93, 145}}},
{Region: "Belarus", Group: "Premium UDP Europe", IPs: []net.IP{{45, 132, 194, 5}, {45, 132, 194, 6}, {45, 132, 194, 10}, {45, 132, 194, 13}, {45, 132, 194, 14}, {45, 132, 194, 20}, {45, 132, 194, 22}, {45, 132, 194, 23}, {45, 132, 194, 38}, {45, 132, 194, 48}}},
{Region: "Belarus", Group: "Premium TCP Europe", IPs: []net.IP{{45, 132, 194, 3}, {45, 132, 194, 5}, {45, 132, 194, 7}, {45, 132, 194, 10}, {45, 132, 194, 15}, {45, 132, 194, 35}, {45, 132, 194, 37}, {45, 132, 194, 40}, {45, 132, 194, 43}, {45, 132, 194, 47}}},
{Region: "Belgium", Group: "Premium UDP Europe", IPs: []net.IP{{185, 210, 217, 14}, {185, 232, 21, 119}, {193, 9, 114, 211}, {193, 9, 114, 221}, {194, 110, 115, 201}, {194, 110, 115, 214}, {194, 110, 115, 216}, {194, 110, 115, 220}, {194, 110, 115, 221}, {194, 110, 115, 233}}},
{Region: "Belgium", Group: "Premium TCP Europe", IPs: []net.IP{{5, 253, 205, 27}, {37, 120, 143, 58}, {37, 120, 143, 59}, {37, 120, 143, 165}, {185, 210, 217, 60}, {185, 232, 21, 115}, {185, 232, 21, 118}, {193, 9, 114, 228}, {194, 110, 115, 215}, {194, 110, 115, 232}}},
{Region: "Albania", Group: "Premium UDP Europe", IPs: []net.IP{{31, 171, 155, 3}, {31, 171, 155, 4}, {31, 171, 155, 5}, {31, 171, 155, 6}, {31, 171, 155, 7}, {31, 171, 155, 8}, {31, 171, 155, 9}, {31, 171, 155, 11}, {31, 171, 155, 12}, {31, 171, 155, 13}}},
{Region: "Albania", Group: "Premium TCP Europe", IPs: []net.IP{{31, 171, 155, 4}, {31, 171, 155, 5}, {31, 171, 155, 6}, {31, 171, 155, 7}, {31, 171, 155, 8}, {31, 171, 155, 9}, {31, 171, 155, 11}, {31, 171, 155, 12}, {31, 171, 155, 13}, {31, 171, 155, 14}}},
{Region: "Algeria", Group: "Premium UDP Europe", IPs: []net.IP{{176, 125, 228, 131}, {176, 125, 228, 132}, {176, 125, 228, 133}, {176, 125, 228, 135}, {176, 125, 228, 136}, {176, 125, 228, 138}, {176, 125, 228, 139}, {176, 125, 228, 140}, {176, 125, 228, 141}, {176, 125, 228, 144}}},
{Region: "Algeria", Group: "Premium TCP Europe", IPs: []net.IP{{176, 125, 228, 131}, {176, 125, 228, 132}, {176, 125, 228, 134}, {176, 125, 228, 136}, {176, 125, 228, 138}, {176, 125, 228, 139}, {176, 125, 228, 140}, {176, 125, 228, 141}, {176, 125, 228, 142}, {176, 125, 228, 143}}},
{Region: "Andorra", Group: "Premium UDP Europe", IPs: []net.IP{{188, 241, 82, 134}, {188, 241, 82, 135}, {188, 241, 82, 143}, {188, 241, 82, 145}, {188, 241, 82, 152}, {188, 241, 82, 155}, {188, 241, 82, 162}, {188, 241, 82, 163}, {188, 241, 82, 166}, {188, 241, 82, 168}}},
{Region: "Argentina", Group: "Premium UDP USA", IPs: []net.IP{{190, 106, 130, 15}, {190, 106, 130, 17}, {190, 106, 130, 18}, {190, 106, 130, 19}, {190, 106, 130, 21}, {190, 106, 130, 23}, {190, 106, 130, 26}, {190, 106, 130, 36}, {190, 106, 130, 38}, {190, 106, 130, 45}}},
{Region: "Argentina", Group: "Premium TCP USA", IPs: []net.IP{{190, 106, 130, 16}, {190, 106, 130, 18}, {190, 106, 130, 20}, {190, 106, 130, 23}, {190, 106, 130, 26}, {190, 106, 130, 36}, {190, 106, 130, 38}, {190, 106, 130, 39}, {190, 106, 130, 41}, {190, 106, 130, 43}}},
{Region: "Armenia", Group: "Premium UDP Europe", IPs: []net.IP{{185, 253, 160, 131}, {185, 253, 160, 133}, {185, 253, 160, 136}, {185, 253, 160, 137}, {185, 253, 160, 138}, {185, 253, 160, 139}, {185, 253, 160, 140}, {185, 253, 160, 142}, {185, 253, 160, 143}, {185, 253, 160, 144}}},
{Region: "Australia", Group: "Premium TCP Asia", IPs: []net.IP{{43, 242, 68, 88}, {43, 242, 68, 99}, {202, 60, 91, 202}, {202, 60, 91, 209}, {202, 60, 91, 210}, {202, 60, 91, 214}, {202, 60, 91, 220}, {202, 60, 91, 230}, {202, 60, 91, 245}, {202, 60, 91, 254}}},
{Region: "Australia", Group: "Premium UDP Asia", IPs: []net.IP{{43, 242, 68, 75}, {43, 242, 68, 78}, {43, 242, 68, 87}, {43, 242, 68, 93}, {43, 242, 68, 102}, {202, 60, 80, 16}, {202, 60, 91, 197}, {202, 60, 91, 210}, {202, 60, 91, 234}, {202, 60, 91, 240}}},
{Region: "Austria", Group: "Premium TCP Europe", IPs: []net.IP{{37, 19, 223, 114}, {37, 19, 223, 119}, {37, 120, 155, 99}, {37, 120, 155, 101}, {89, 187, 168, 161}, {89, 187, 168, 169}, {89, 187, 168, 171}, {89, 187, 168, 174}, {89, 187, 168, 176}, {89, 187, 168, 178}}},
{Region: "Bahamas", Group: "Premium TCP USA", IPs: []net.IP{{95, 181, 238, 131}, {95, 181, 238, 132}, {95, 181, 238, 138}, {95, 181, 238, 139}, {95, 181, 238, 141}, {95, 181, 238, 145}, {95, 181, 238, 146}, {95, 181, 238, 147}, {95, 181, 238, 149}, {95, 181, 238, 150}}},
{Region: "Bangladesh", Group: "Premium UDP Asia", IPs: []net.IP{{84, 252, 93, 131}, {84, 252, 93, 133}, {84, 252, 93, 134}, {84, 252, 93, 135}, {84, 252, 93, 137}, {84, 252, 93, 139}, {84, 252, 93, 141}, {84, 252, 93, 142}, {84, 252, 93, 144}, {84, 252, 93, 145}}},
{Region: "Belarus", Group: "Premium UDP Europe", IPs: []net.IP{{45, 132, 194, 3}, {45, 132, 194, 10}, {45, 132, 194, 15}, {45, 132, 194, 25}, {45, 132, 194, 29}, {45, 132, 194, 37}, {45, 132, 194, 38}, {45, 132, 194, 39}, {45, 132, 194, 45}, {45, 132, 194, 49}}},
{Region: "Belarus", Group: "Premium TCP Europe", IPs: []net.IP{{45, 132, 194, 3}, {45, 132, 194, 6}, {45, 132, 194, 9}, {45, 132, 194, 14}, {45, 132, 194, 15}, {45, 132, 194, 22}, {45, 132, 194, 33}, {45, 132, 194, 35}, {45, 132, 194, 37}, {45, 132, 194, 49}}},
{Region: "Belgium", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 143, 53}, {37, 120, 143, 168}, {185, 210, 217, 10}, {185, 210, 217, 60}, {185, 210, 217, 253}, {193, 9, 114, 220}, {193, 9, 114, 222}, {193, 9, 114, 233}, {193, 9, 114, 245}, {194, 110, 115, 233}}},
{Region: "Belgium", Group: "Premium UDP Europe", IPs: []net.IP{{185, 210, 217, 54}, {185, 210, 217, 247}, {185, 210, 217, 250}, {185, 232, 21, 120}, {185, 232, 21, 122}, {193, 9, 114, 212}, {193, 9, 114, 213}, {194, 110, 115, 203}, {194, 110, 115, 213}, {194, 110, 115, 220}}},
{Region: "Bosnia and Herzegovina", Group: "Premium UDP Europe", IPs: []net.IP{{185, 99, 3, 57}, {185, 99, 3, 58}, {185, 99, 3, 72}, {185, 99, 3, 73}, {185, 99, 3, 74}, {185, 99, 3, 130}, {185, 99, 3, 131}, {185, 99, 3, 134}, {185, 99, 3, 135}, {185, 99, 3, 136}}},
{Region: "Bosnia and Herzegovina", Group: "Premium TCP Europe", IPs: []net.IP{{185, 99, 3, 57}, {185, 99, 3, 58}, {185, 99, 3, 72}, {185, 99, 3, 73}, {185, 99, 3, 74}, {185, 99, 3, 130}, {185, 99, 3, 131}, {185, 99, 3, 134}, {185, 99, 3, 135}, {185, 99, 3, 136}}},
{Region: "Brazil", Group: "Premium UDP USA", IPs: []net.IP{{188, 241, 177, 8}, {188, 241, 177, 10}, {188, 241, 177, 12}, {188, 241, 177, 13}, {188, 241, 177, 14}, {188, 241, 177, 30}, {188, 241, 177, 36}, {188, 241, 177, 42}, {188, 241, 177, 45}, {188, 241, 177, 46}}},
{Region: "Brazil", Group: "Premium TCP USA", IPs: []net.IP{{188, 241, 177, 9}, {188, 241, 177, 12}, {188, 241, 177, 13}, {188, 241, 177, 19}, {188, 241, 177, 29}, {188, 241, 177, 35}, {188, 241, 177, 40}, {188, 241, 177, 41}, {188, 241, 177, 43}, {188, 241, 177, 44}}},
{Region: "Bulgaria", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 152, 100}, {37, 120, 152, 101}, {37, 120, 152, 102}, {37, 120, 152, 103}, {37, 120, 152, 104}, {37, 120, 152, 105}, {37, 120, 152, 106}, {37, 120, 152, 108}, {37, 120, 152, 109}, {37, 120, 152, 110}}},
{Region: "Bulgaria", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 152, 99}, {37, 120, 152, 100}, {37, 120, 152, 101}, {37, 120, 152, 102}, {37, 120, 152, 104}, {37, 120, 152, 105}, {37, 120, 152, 106}, {37, 120, 152, 107}, {37, 120, 152, 108}, {37, 120, 152, 109}}},
{Region: "Cambodia", Group: "Premium TCP Asia", IPs: []net.IP{{188, 215, 235, 37}, {188, 215, 235, 41}, {188, 215, 235, 45}, {188, 215, 235, 46}, {188, 215, 235, 47}, {188, 215, 235, 49}, {188, 215, 235, 52}, {188, 215, 235, 53}, {188, 215, 235, 54}, {188, 215, 235, 57}}},
{Region: "Cambodia", Group: "Premium UDP Asia", IPs: []net.IP{{188, 215, 235, 36}, {188, 215, 235, 37}, {188, 215, 235, 40}, {188, 215, 235, 41}, {188, 215, 235, 45}, {188, 215, 235, 47}, {188, 215, 235, 50}, {188, 215, 235, 51}, {188, 215, 235, 56}, {188, 215, 235, 57}}},
{Region: "Canada", Group: "Premium TCP USA", IPs: []net.IP{{37, 120, 205, 4}, {37, 120, 205, 26}, {66, 115, 142, 171}, {89, 47, 234, 103}, {176, 113, 74, 22}, {176, 113, 74, 77}, {176, 113, 74, 135}, {176, 113, 74, 137}, {176, 113, 74, 201}, {176, 113, 74, 205}}},
{Region: "Canada", Group: "Premium UDP USA", IPs: []net.IP{{37, 120, 205, 24}, {66, 115, 142, 162}, {66, 115, 142, 172}, {89, 47, 234, 85}, {89, 47, 234, 118}, {172, 98, 89, 146}, {172, 98, 89, 159}, {172, 98, 89, 172}, {176, 113, 74, 156}, {176, 113, 74, 206}}},
{Region: "China", Group: "Premium TCP Asia", IPs: []net.IP{{188, 241, 80, 131}, {188, 241, 80, 132}, {188, 241, 80, 133}, {188, 241, 80, 134}, {188, 241, 80, 136}, {188, 241, 80, 137}, {188, 241, 80, 139}, {188, 241, 80, 140}, {188, 241, 80, 141}, {188, 241, 80, 142}}},
{Region: "China", Group: "Premium UDP Asia", IPs: []net.IP{{188, 241, 80, 132}, {188, 241, 80, 133}, {188, 241, 80, 134}, {188, 241, 80, 135}, {188, 241, 80, 136}, {188, 241, 80, 137}, {188, 241, 80, 138}, {188, 241, 80, 139}, {188, 241, 80, 140}, {188, 241, 80, 141}}},
{Region: "Costa Rica", Group: "Premium TCP USA", IPs: []net.IP{{143, 202, 160, 67}, {143, 202, 160, 68}, {143, 202, 160, 69}, {143, 202, 160, 70}, {143, 202, 160, 72}, {143, 202, 160, 73}, {143, 202, 160, 74}, {143, 202, 160, 75}, {143, 202, 160, 76}, {143, 202, 160, 78}}},
{Region: "Cyprus", Group: "Premium UDP Europe", IPs: []net.IP{{185, 253, 162, 131}, {185, 253, 162, 134}, {185, 253, 162, 136}, {185, 253, 162, 137}, {185, 253, 162, 139}, {185, 253, 162, 140}, {185, 253, 162, 141}, {185, 253, 162, 142}, {185, 253, 162, 143}, {185, 253, 162, 144}}},
{Region: "Cyprus", Group: "Premium TCP Europe", IPs: []net.IP{{185, 253, 162, 131}, {185, 253, 162, 132}, {185, 253, 162, 134}, {185, 253, 162, 135}, {185, 253, 162, 136}, {185, 253, 162, 139}, {185, 253, 162, 140}, {185, 253, 162, 141}, {185, 253, 162, 143}, {185, 253, 162, 144}}},
{Region: "Czech Republic", Group: "Premium TCP Europe", IPs: []net.IP{{185, 216, 35, 231}, {185, 216, 35, 236}, {195, 181, 161, 3}, {195, 181, 161, 7}, {195, 181, 161, 11}, {195, 181, 161, 14}, {195, 181, 161, 15}, {195, 181, 161, 16}, {195, 181, 161, 17}, {195, 181, 161, 22}}},
{Region: "Czech Republic", Group: "Premium UDP Europe", IPs: []net.IP{{185, 216, 35, 227}, {185, 216, 35, 235}, {195, 181, 161, 3}, {195, 181, 161, 5}, {195, 181, 161, 7}, {195, 181, 161, 11}, {195, 181, 161, 12}, {195, 181, 161, 14}, {195, 181, 161, 15}, {195, 181, 161, 20}}},
{Region: "Denmark", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 145, 86}, {37, 120, 194, 45}, {37, 120, 194, 46}, {37, 120, 194, 61}, {95, 174, 65, 172}, {95, 174, 65, 174}, {185, 206, 224, 237}, {185, 206, 224, 244}, {185, 206, 224, 245}, {185, 206, 224, 246}}},
{Region: "Denmark", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 194, 56}, {37, 120, 194, 61}, {95, 174, 65, 164}, {95, 174, 65, 165}, {95, 174, 65, 167}, {95, 174, 65, 172}, {185, 206, 224, 235}, {185, 206, 224, 244}, {185, 206, 224, 247}, {185, 206, 224, 249}}},
{Region: "Egypt", Group: "Premium TCP Europe", IPs: []net.IP{{188, 214, 122, 37}, {188, 214, 122, 39}, {188, 214, 122, 40}, {188, 214, 122, 51}, {188, 214, 122, 53}, {188, 214, 122, 54}, {188, 214, 122, 56}, {188, 214, 122, 58}, {188, 214, 122, 59}, {188, 214, 122, 62}}},
{Region: "Egypt", Group: "Premium UDP Europe", IPs: []net.IP{{188, 214, 122, 35}, {188, 214, 122, 38}, {188, 214, 122, 39}, {188, 214, 122, 44}, {188, 214, 122, 46}, {188, 214, 122, 48}, {188, 214, 122, 50}, {188, 214, 122, 52}, {188, 214, 122, 54}, {188, 214, 122, 58}}},
{Region: "Estonia", Group: "Premium TCP Europe", IPs: []net.IP{{95, 153, 31, 82}, {95, 153, 31, 83}, {95, 153, 31, 84}, {95, 153, 31, 85}, {95, 153, 31, 86}, {95, 153, 31, 87}, {95, 153, 31, 89}, {95, 153, 31, 90}, {95, 153, 31, 92}, {95, 153, 31, 93}}},
{Region: "Estonia", Group: "Premium UDP Europe", IPs: []net.IP{{95, 153, 31, 83}, {95, 153, 31, 84}, {95, 153, 31, 85}, {95, 153, 31, 86}, {95, 153, 31, 87}, {95, 153, 31, 88}, {95, 153, 31, 90}, {95, 153, 31, 92}, {95, 153, 31, 93}, {95, 153, 31, 94}}},
{Region: "Finland", Group: "Premium UDP Europe", IPs: []net.IP{{188, 126, 89, 133}, {188, 126, 89, 134}, {188, 126, 89, 137}, {188, 126, 89, 138}, {188, 126, 89, 143}, {188, 126, 89, 144}, {188, 126, 89, 149}, {188, 126, 89, 150}, {188, 126, 89, 152}, {188, 126, 89, 154}}},
{Region: "Finland", Group: "Premium TCP Europe", IPs: []net.IP{{188, 126, 89, 131}, {188, 126, 89, 132}, {188, 126, 89, 133}, {188, 126, 89, 137}, {188, 126, 89, 138}, {188, 126, 89, 142}, {188, 126, 89, 145}, {188, 126, 89, 153}, {188, 126, 89, 154}, {188, 126, 89, 155}}},
{Region: "France", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 60, 31}, {84, 17, 60, 93}, {84, 17, 60, 136}, {84, 17, 60, 173}, {84, 17, 60, 177}, {84, 17, 60, 184}, {84, 17, 61, 10}, {84, 17, 61, 92}, {84, 17, 61, 155}, {138, 199, 26, 174}}},
{Region: "France", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 60, 40}, {84, 17, 60, 85}, {84, 17, 60, 98}, {84, 17, 60, 150}, {84, 17, 60, 178}, {84, 17, 61, 5}, {84, 17, 61, 212}, {138, 199, 26, 76}, {138, 199, 26, 147}, {138, 199, 26, 219}}},
{Region: "Georgia", Group: "Premium TCP Europe", IPs: []net.IP{{95, 181, 236, 131}, {95, 181, 236, 132}, {95, 181, 236, 133}, {95, 181, 236, 135}, {95, 181, 236, 137}, {95, 181, 236, 138}, {95, 181, 236, 139}, {95, 181, 236, 140}, {95, 181, 236, 142}, {95, 181, 236, 144}}},
{Region: "Georgia", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 236, 131}, {95, 181, 236, 132}, {95, 181, 236, 133}, {95, 181, 236, 134}, {95, 181, 236, 138}, {95, 181, 236, 139}, {95, 181, 236, 140}, {95, 181, 236, 141}, {95, 181, 236, 143}, {95, 181, 236, 144}}},
{Region: "Germany", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 217, 30}, {37, 120, 217, 61}, {84, 17, 48, 13}, {84, 17, 48, 18}, {84, 17, 48, 22}, {84, 17, 48, 81}, {84, 17, 48, 185}, {84, 17, 49, 242}, {154, 28, 188, 128}, {154, 28, 188, 167}}},
{Region: "Germany", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 217, 38}, {84, 17, 48, 55}, {84, 17, 48, 140}, {84, 17, 48, 188}, {84, 17, 48, 192}, {84, 17, 48, 205}, {84, 17, 49, 128}, {84, 17, 49, 191}, {84, 17, 49, 236}, {154, 28, 188, 82}}},
{Region: "Greece", Group: "Premium UDP Europe", IPs: []net.IP{{154, 57, 3, 131}, {154, 57, 3, 133}, {154, 57, 3, 136}, {154, 57, 3, 137}, {154, 57, 3, 140}, {154, 57, 3, 141}, {188, 123, 126, 167}, {188, 123, 126, 171}, {188, 123, 126, 175}, {188, 123, 126, 176}}},
{Region: "Greece", Group: "Premium TCP Europe", IPs: []net.IP{{154, 57, 3, 131}, {154, 57, 3, 133}, {154, 57, 3, 134}, {154, 57, 3, 137}, {154, 57, 3, 139}, {188, 123, 126, 170}, {188, 123, 126, 172}, {188, 123, 126, 173}, {188, 123, 126, 175}, {188, 123, 126, 177}}},
{Region: "Greenland", Group: "Premium UDP Europe", IPs: []net.IP{{91, 90, 120, 3}, {91, 90, 120, 5}, {91, 90, 120, 6}, {91, 90, 120, 7}, {91, 90, 120, 8}, {91, 90, 120, 9}, {91, 90, 120, 10}, {91, 90, 120, 14}, {91, 90, 120, 15}, {91, 90, 120, 17}}},
{Region: "Greenland", Group: "Premium TCP Europe", IPs: []net.IP{{91, 90, 120, 3}, {91, 90, 120, 4}, {91, 90, 120, 5}, {91, 90, 120, 6}, {91, 90, 120, 9}, {91, 90, 120, 10}, {91, 90, 120, 11}, {91, 90, 120, 13}, {91, 90, 120, 14}, {91, 90, 120, 17}}},
{Region: "Hong Kong", Group: "Premium TCP Asia", IPs: []net.IP{{84, 17, 56, 34}, {84, 17, 56, 41}, {84, 17, 56, 133}, {84, 17, 56, 147}, {84, 17, 56, 148}, {84, 17, 56, 153}, {84, 17, 56, 163}, {84, 17, 56, 167}, {84, 17, 56, 171}, {84, 17, 56, 184}}},
{Region: "Hong Kong", Group: "Premium UDP Asia", IPs: []net.IP{{84, 17, 56, 39}, {84, 17, 56, 52}, {84, 17, 56, 55}, {84, 17, 56, 135}, {84, 17, 56, 136}, {84, 17, 56, 145}, {84, 17, 56, 149}, {84, 17, 56, 165}, {84, 17, 56, 167}, {84, 17, 56, 170}}},
{Region: "Hungary", Group: "Premium TCP Europe", IPs: []net.IP{{86, 106, 74, 243}, {86, 106, 74, 244}, {86, 106, 74, 247}, {86, 106, 74, 251}, {86, 106, 74, 252}, {86, 106, 74, 253}, {185, 189, 114, 117}, {185, 189, 114, 119}, {185, 189, 114, 124}, {185, 189, 114, 126}}},
{Region: "Hungary", Group: "Premium UDP Europe", IPs: []net.IP{{86, 106, 74, 252}, {86, 106, 74, 253}, {86, 106, 74, 254}, {185, 189, 114, 116}, {185, 189, 114, 117}, {185, 189, 114, 118}, {185, 189, 114, 121}, {185, 189, 114, 123}, {185, 189, 114, 125}, {185, 189, 114, 126}}},
{Region: "Iceland", Group: "Premium UDP Europe", IPs: []net.IP{{45, 133, 193, 4}, {45, 133, 193, 5}, {45, 133, 193, 6}, {45, 133, 193, 8}, {45, 133, 193, 9}, {45, 133, 193, 10}, {45, 133, 193, 11}, {45, 133, 193, 12}, {45, 133, 193, 13}, {45, 133, 193, 14}}},
{Region: "Iceland", Group: "Premium TCP Europe", IPs: []net.IP{{45, 133, 193, 3}, {45, 133, 193, 4}, {45, 133, 193, 5}, {45, 133, 193, 6}, {45, 133, 193, 7}, {45, 133, 193, 8}, {45, 133, 193, 9}, {45, 133, 193, 10}, {45, 133, 193, 11}, {45, 133, 193, 13}}},
{Region: "India", Group: "Premium TCP Europe", IPs: []net.IP{{43, 241, 71, 117}, {43, 241, 71, 118}, {43, 241, 71, 122}, {43, 241, 71, 123}, {43, 241, 71, 125}, {43, 241, 71, 148}, {43, 241, 71, 151}, {43, 241, 71, 152}, {43, 241, 71, 154}, {43, 241, 71, 156}}},
{Region: "India", Group: "Premium UDP Europe", IPs: []net.IP{{43, 241, 71, 115}, {43, 241, 71, 119}, {43, 241, 71, 123}, {43, 241, 71, 124}, {43, 241, 71, 148}, {43, 241, 71, 149}, {43, 241, 71, 151}, {43, 241, 71, 153}, {43, 241, 71, 155}, {43, 241, 71, 157}}},
{Region: "Indonesia", Group: "Premium TCP Asia", IPs: []net.IP{{113, 20, 29, 243}, {113, 20, 29, 244}, {113, 20, 29, 245}, {113, 20, 29, 246}, {113, 20, 29, 247}, {113, 20, 29, 249}, {113, 20, 29, 250}, {113, 20, 29, 252}, {113, 20, 29, 253}, {113, 20, 29, 254}}},
{Region: "Indonesia", Group: "Premium UDP Asia", IPs: []net.IP{{113, 20, 29, 243}, {113, 20, 29, 244}, {113, 20, 29, 245}, {113, 20, 29, 246}, {113, 20, 29, 247}, {113, 20, 29, 248}, {113, 20, 29, 249}, {113, 20, 29, 250}, {113, 20, 29, 251}, {113, 20, 29, 253}}},
{Region: "Iran", Group: "Premium UDP Asia", IPs: []net.IP{{62, 133, 46, 3}, {62, 133, 46, 5}, {62, 133, 46, 7}, {62, 133, 46, 8}, {62, 133, 46, 9}, {62, 133, 46, 11}, {62, 133, 46, 12}, {62, 133, 46, 13}, {62, 133, 46, 14}, {62, 133, 46, 15}}},
{Region: "Iran", Group: "Premium TCP Asia", IPs: []net.IP{{62, 133, 46, 3}, {62, 133, 46, 6}, {62, 133, 46, 7}, {62, 133, 46, 8}, {62, 133, 46, 9}, {62, 133, 46, 10}, {62, 133, 46, 11}, {62, 133, 46, 12}, {62, 133, 46, 14}, {62, 133, 46, 15}}},
{Region: "Ireland", Group: "Premium UDP Europe", IPs: []net.IP{{77, 81, 139, 35}, {77, 81, 139, 40}, {77, 81, 139, 41}, {77, 81, 139, 45}, {84, 247, 48, 3}, {84, 247, 48, 8}, {84, 247, 48, 10}, {84, 247, 48, 19}, {84, 247, 48, 21}, {84, 247, 48, 29}}},
{Region: "Ireland", Group: "Premium TCP Europe", IPs: []net.IP{{77, 81, 139, 40}, {84, 247, 48, 3}, {84, 247, 48, 4}, {84, 247, 48, 7}, {84, 247, 48, 10}, {84, 247, 48, 20}, {84, 247, 48, 23}, {84, 247, 48, 24}, {84, 247, 48, 26}, {84, 247, 48, 30}}},
{Region: "Isle of Man", Group: "Premium TCP Europe", IPs: []net.IP{{91, 90, 124, 147}, {91, 90, 124, 148}, {91, 90, 124, 149}, {91, 90, 124, 152}, {91, 90, 124, 153}, {91, 90, 124, 155}, {91, 90, 124, 156}, {91, 90, 124, 157}, {91, 90, 124, 158}, {91, 90, 124, 159}}},
{Region: "Isle of Man", Group: "Premium UDP Europe", IPs: []net.IP{{91, 90, 124, 148}, {91, 90, 124, 149}, {91, 90, 124, 150}, {91, 90, 124, 152}, {91, 90, 124, 153}, {91, 90, 124, 154}, {91, 90, 124, 155}, {91, 90, 124, 157}, {91, 90, 124, 158}, {91, 90, 124, 159}}},
{Region: "Israel", Group: "Premium TCP Europe", IPs: []net.IP{{160, 116, 0, 163}, {160, 116, 0, 164}, {160, 116, 0, 165}, {160, 116, 0, 166}, {160, 116, 0, 168}, {160, 116, 0, 169}, {160, 116, 0, 170}, {160, 116, 0, 171}, {160, 116, 0, 172}, {160, 116, 0, 174}}},
{Region: "Israel", Group: "Premium UDP Europe", IPs: []net.IP{{160, 116, 0, 163}, {160, 116, 0, 164}, {160, 116, 0, 165}, {160, 116, 0, 166}, {160, 116, 0, 167}, {160, 116, 0, 168}, {160, 116, 0, 169}, {160, 116, 0, 170}, {160, 116, 0, 171}, {160, 116, 0, 172}}},
{Region: "Italy", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 58, 21}, {84, 17, 58, 94}, {87, 101, 94, 68}, {185, 217, 71, 132}, {185, 217, 71, 135}, {185, 217, 71, 154}, {212, 102, 55, 97}, {212, 102, 55, 111}, {212, 102, 55, 113}, {212, 102, 55, 118}}},
{Region: "Italy", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 58, 13}, {84, 17, 58, 22}, {84, 17, 58, 23}, {84, 17, 58, 110}, {185, 217, 71, 134}, {185, 217, 71, 155}, {212, 102, 55, 97}, {212, 102, 55, 104}, {212, 102, 55, 114}, {212, 102, 55, 118}}},
{Region: "Japan", Group: "Premium UDP Asia", IPs: []net.IP{{156, 146, 35, 7}, {156, 146, 35, 8}, {156, 146, 35, 10}, {156, 146, 35, 12}, {156, 146, 35, 13}, {156, 146, 35, 14}, {156, 146, 35, 15}, {156, 146, 35, 16}, {156, 146, 35, 22}, {156, 146, 35, 49}}},
{Region: "Japan", Group: "Premium TCP Asia", IPs: []net.IP{{156, 146, 35, 4}, {156, 146, 35, 6}, {156, 146, 35, 9}, {156, 146, 35, 12}, {156, 146, 35, 16}, {156, 146, 35, 21}, {156, 146, 35, 22}, {156, 146, 35, 28}, {156, 146, 35, 29}, {156, 146, 35, 49}}},
{Region: "Kazakhstan", Group: "Premium UDP Europe", IPs: []net.IP{{62, 133, 47, 131}, {62, 133, 47, 132}, {62, 133, 47, 133}, {62, 133, 47, 134}, {62, 133, 47, 135}, {62, 133, 47, 137}, {62, 133, 47, 139}, {62, 133, 47, 140}, {62, 133, 47, 143}, {62, 133, 47, 144}}},
{Region: "Kazakhstan", Group: "Premium TCP Europe", IPs: []net.IP{{62, 133, 47, 132}, {62, 133, 47, 133}, {62, 133, 47, 135}, {62, 133, 47, 137}, {62, 133, 47, 138}, {62, 133, 47, 140}, {62, 133, 47, 141}, {62, 133, 47, 142}, {62, 133, 47, 143}, {62, 133, 47, 144}}},
{Region: "Brazil", Group: "Premium UDP USA", IPs: []net.IP{{188, 241, 177, 6}, {188, 241, 177, 14}, {188, 241, 177, 20}, {188, 241, 177, 21}, {188, 241, 177, 37}, {188, 241, 177, 43}, {188, 241, 177, 141}, {188, 241, 177, 148}, {188, 241, 177, 149}, {188, 241, 177, 150}}},
{Region: "Brazil", Group: "Premium TCP USA", IPs: []net.IP{{188, 241, 177, 4}, {188, 241, 177, 22}, {188, 241, 177, 23}, {188, 241, 177, 40}, {188, 241, 177, 44}, {188, 241, 177, 46}, {188, 241, 177, 131}, {188, 241, 177, 133}, {188, 241, 177, 149}, {188, 241, 177, 153}}},
{Region: "Bulgaria", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 152, 99}, {37, 120, 152, 100}, {37, 120, 152, 101}, {37, 120, 152, 102}, {37, 120, 152, 103}, {37, 120, 152, 104}, {37, 120, 152, 105}, {37, 120, 152, 106}, {37, 120, 152, 107}, {37, 120, 152, 109}}},
{Region: "Cambodia", Group: "Premium UDP Asia", IPs: []net.IP{{188, 215, 235, 37}, {188, 215, 235, 41}, {188, 215, 235, 43}, {188, 215, 235, 44}, {188, 215, 235, 48}, {188, 215, 235, 49}, {188, 215, 235, 52}, {188, 215, 235, 53}, {188, 215, 235, 56}, {188, 215, 235, 57}}},
{Region: "Cambodia", Group: "Premium TCP Asia", IPs: []net.IP{{188, 215, 235, 35}, {188, 215, 235, 36}, {188, 215, 235, 40}, {188, 215, 235, 43}, {188, 215, 235, 46}, {188, 215, 235, 47}, {188, 215, 235, 50}, {188, 215, 235, 51}, {188, 215, 235, 55}, {188, 215, 235, 57}}},
{Region: "Canada", Group: "Premium UDP USA", IPs: []net.IP{{66, 115, 142, 190}, {104, 200, 151, 28}, {104, 200, 151, 37}, {104, 200, 151, 48}, {104, 200, 151, 67}, {104, 200, 151, 72}, {104, 200, 151, 121}, {172, 98, 89, 145}, {172, 98, 89, 152}, {172, 98, 89, 169}}},
{Region: "Canada", Group: "Premium TCP USA", IPs: []net.IP{{104, 200, 151, 25}, {104, 200, 151, 33}, {104, 200, 151, 43}, {104, 200, 151, 90}, {104, 200, 151, 118}, {104, 200, 151, 125}, {104, 200, 151, 147}, {172, 98, 89, 147}, {172, 98, 89, 158}, {172, 98, 89, 190}}},
{Region: "Chile", Group: "Premium UDP USA", IPs: []net.IP{{146, 70, 11, 3}, {146, 70, 11, 4}, {146, 70, 11, 6}, {146, 70, 11, 7}, {146, 70, 11, 8}, {146, 70, 11, 9}, {146, 70, 11, 11}, {146, 70, 11, 12}, {146, 70, 11, 13}, {146, 70, 11, 14}}},
{Region: "Chile", Group: "Premium TCP USA", IPs: []net.IP{{146, 70, 11, 3}, {146, 70, 11, 4}, {146, 70, 11, 5}, {146, 70, 11, 6}, {146, 70, 11, 8}, {146, 70, 11, 9}, {146, 70, 11, 10}, {146, 70, 11, 11}, {146, 70, 11, 13}, {146, 70, 11, 14}}},
{Region: "China", Group: "Premium UDP Asia", IPs: []net.IP{{188, 241, 80, 131}, {188, 241, 80, 132}, {188, 241, 80, 133}, {188, 241, 80, 136}, {188, 241, 80, 137}, {188, 241, 80, 138}, {188, 241, 80, 139}, {188, 241, 80, 140}, {188, 241, 80, 141}, {188, 241, 80, 142}}},
{Region: "China", Group: "Premium TCP Asia", IPs: []net.IP{{188, 241, 80, 131}, {188, 241, 80, 133}, {188, 241, 80, 134}, {188, 241, 80, 135}, {188, 241, 80, 137}, {188, 241, 80, 138}, {188, 241, 80, 139}, {188, 241, 80, 140}, {188, 241, 80, 141}, {188, 241, 80, 142}}},
{Region: "Colombia", Group: "Premium UDP USA", IPs: []net.IP{{146, 70, 9, 3}, {146, 70, 9, 4}, {146, 70, 9, 5}, {146, 70, 9, 6}, {146, 70, 9, 7}, {146, 70, 9, 9}, {146, 70, 9, 10}, {146, 70, 9, 11}, {146, 70, 9, 12}, {146, 70, 9, 14}}},
{Region: "Costa Rica", Group: "Premium TCP USA", IPs: []net.IP{{146, 70, 10, 3}, {146, 70, 10, 4}, {146, 70, 10, 6}, {146, 70, 10, 7}, {146, 70, 10, 9}, {146, 70, 10, 10}, {146, 70, 10, 11}, {146, 70, 10, 12}, {146, 70, 10, 13}, {146, 70, 10, 14}}},
{Region: "Costa Rica", Group: "Premium UDP USA", IPs: []net.IP{{146, 70, 10, 3}, {146, 70, 10, 4}, {146, 70, 10, 6}, {146, 70, 10, 7}, {146, 70, 10, 8}, {146, 70, 10, 9}, {146, 70, 10, 10}, {146, 70, 10, 12}, {146, 70, 10, 13}, {146, 70, 10, 14}}},
{Region: "Croatia", Group: "Premium UDP Europe", IPs: []net.IP{{146, 70, 8, 3}, {146, 70, 8, 4}, {146, 70, 8, 5}, {146, 70, 8, 6}, {146, 70, 8, 7}, {146, 70, 8, 8}, {146, 70, 8, 9}, {146, 70, 8, 11}, {146, 70, 8, 12}, {146, 70, 8, 16}}},
{Region: "Croatia", Group: "Premium TCP Europe", IPs: []net.IP{{146, 70, 8, 3}, {146, 70, 8, 4}, {146, 70, 8, 6}, {146, 70, 8, 8}, {146, 70, 8, 10}, {146, 70, 8, 11}, {146, 70, 8, 12}, {146, 70, 8, 14}, {146, 70, 8, 15}, {146, 70, 8, 16}}},
{Region: "Cyprus", Group: "Premium TCP Europe", IPs: []net.IP{{185, 253, 162, 131}, {185, 253, 162, 133}, {185, 253, 162, 136}, {185, 253, 162, 137}, {185, 253, 162, 139}, {185, 253, 162, 140}, {185, 253, 162, 141}, {185, 253, 162, 142}, {185, 253, 162, 143}, {185, 253, 162, 144}}},
{Region: "Czech Republic", Group: "Premium UDP Europe", IPs: []net.IP{{195, 181, 161, 2}, {195, 181, 161, 3}, {195, 181, 161, 6}, {195, 181, 161, 12}, {195, 181, 161, 13}, {195, 181, 161, 17}, {195, 181, 161, 19}, {195, 181, 161, 21}, {195, 181, 161, 22}, {195, 181, 161, 23}}},
{Region: "Denmark", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 194, 37}, {37, 120, 194, 40}, {37, 120, 194, 41}, {37, 120, 194, 62}, {95, 174, 65, 174}, {185, 206, 224, 231}, {185, 206, 224, 235}, {185, 206, 224, 246}, {185, 206, 224, 247}, {185, 206, 224, 254}}},
{Region: "Denmark", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 145, 93}, {37, 120, 145, 94}, {37, 120, 194, 40}, {37, 120, 194, 42}, {37, 120, 194, 43}, {37, 120, 194, 44}, {37, 120, 194, 53}, {37, 120, 194, 54}, {185, 206, 224, 232}, {185, 206, 224, 249}}},
{Region: "Egypt", Group: "Premium TCP Europe", IPs: []net.IP{{188, 214, 122, 47}, {188, 214, 122, 51}, {188, 214, 122, 55}, {188, 214, 122, 59}, {188, 214, 122, 60}, {188, 214, 122, 62}, {188, 214, 122, 67}, {188, 214, 122, 72}, {188, 214, 122, 73}, {188, 214, 122, 78}}},
{Region: "Egypt", Group: "Premium UDP Europe", IPs: []net.IP{{188, 214, 122, 36}, {188, 214, 122, 45}, {188, 214, 122, 53}, {188, 214, 122, 59}, {188, 214, 122, 61}, {188, 214, 122, 68}, {188, 214, 122, 72}, {188, 214, 122, 73}, {188, 214, 122, 74}, {188, 214, 122, 77}}},
{Region: "Estonia", Group: "Premium TCP Europe", IPs: []net.IP{{95, 153, 32, 83}, {95, 153, 32, 85}, {95, 153, 32, 86}, {95, 153, 32, 87}, {95, 153, 32, 89}, {95, 153, 32, 90}, {95, 153, 32, 91}, {95, 153, 32, 92}, {95, 153, 32, 93}, {95, 153, 32, 94}}},
{Region: "Estonia", Group: "Premium UDP Europe", IPs: []net.IP{{95, 153, 32, 83}, {95, 153, 32, 84}, {95, 153, 32, 87}, {95, 153, 32, 88}, {95, 153, 32, 89}, {95, 153, 32, 90}, {95, 153, 32, 91}, {95, 153, 32, 92}, {95, 153, 32, 93}, {95, 153, 32, 94}}},
{Region: "France", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 60, 34}, {84, 17, 60, 41}, {84, 17, 60, 61}, {84, 17, 60, 115}, {84, 17, 60, 136}, {84, 17, 60, 167}, {92, 204, 174, 86}, {191, 101, 31, 84}, {191, 101, 31, 186}, {191, 101, 31, 249}}},
{Region: "France", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 43, 167}, {84, 17, 60, 33}, {84, 17, 60, 58}, {84, 17, 60, 68}, {84, 17, 60, 92}, {84, 17, 60, 144}, {191, 101, 31, 170}, {191, 101, 31, 254}, {191, 101, 217, 176}, {191, 101, 217, 193}}},
{Region: "Georgia", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 236, 131}, {95, 181, 236, 133}, {95, 181, 236, 136}, {95, 181, 236, 137}, {95, 181, 236, 138}, {95, 181, 236, 139}, {95, 181, 236, 140}, {95, 181, 236, 142}, {95, 181, 236, 143}, {95, 181, 236, 144}}},
{Region: "Germany", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 48, 35}, {84, 17, 48, 186}, {84, 17, 49, 43}, {84, 17, 49, 48}, {84, 17, 49, 52}, {84, 17, 49, 134}, {84, 17, 49, 231}, {84, 17, 49, 249}, {154, 13, 1, 159}, {154, 28, 188, 47}}},
{Region: "Germany", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 48, 7}, {84, 17, 48, 9}, {84, 17, 48, 33}, {84, 17, 48, 143}, {84, 17, 49, 41}, {84, 17, 49, 184}, {138, 199, 36, 134}, {138, 199, 36, 200}, {154, 28, 188, 135}, {154, 28, 188, 162}}},
{Region: "Greece", Group: "Premium UDP Europe", IPs: []net.IP{{185, 51, 134, 163}, {185, 51, 134, 170}, {185, 51, 134, 171}, {185, 51, 134, 174}, {185, 51, 134, 243}, {185, 51, 134, 244}, {185, 51, 134, 247}, {185, 51, 134, 248}, {185, 51, 134, 249}, {185, 51, 134, 251}}},
{Region: "Greece", Group: "Premium TCP Europe", IPs: []net.IP{{185, 51, 134, 163}, {185, 51, 134, 166}, {185, 51, 134, 168}, {185, 51, 134, 170}, {185, 51, 134, 171}, {185, 51, 134, 174}, {185, 51, 134, 243}, {185, 51, 134, 245}, {185, 51, 134, 246}, {185, 51, 134, 252}}},
{Region: "Greenland", Group: "Premium TCP Europe", IPs: []net.IP{{91, 90, 120, 4}, {91, 90, 120, 5}, {91, 90, 120, 6}, {91, 90, 120, 7}, {91, 90, 120, 8}, {91, 90, 120, 10}, {91, 90, 120, 11}, {91, 90, 120, 15}, {91, 90, 120, 16}, {91, 90, 120, 17}}},
{Region: "Greenland", Group: "Premium UDP Europe", IPs: []net.IP{{91, 90, 120, 3}, {91, 90, 120, 7}, {91, 90, 120, 8}, {91, 90, 120, 10}, {91, 90, 120, 11}, {91, 90, 120, 12}, {91, 90, 120, 13}, {91, 90, 120, 15}, {91, 90, 120, 16}, {91, 90, 120, 17}}},
{Region: "Hong Kong", Group: "Premium UDP Asia", IPs: []net.IP{{84, 17, 56, 130}, {84, 17, 56, 134}, {84, 17, 56, 135}, {84, 17, 56, 151}, {84, 17, 56, 153}, {84, 17, 56, 162}, {84, 17, 56, 172}, {84, 17, 56, 175}, {84, 17, 56, 179}, {84, 17, 56, 180}}},
{Region: "Hong Kong", Group: "Premium TCP Asia", IPs: []net.IP{{84, 17, 56, 130}, {84, 17, 56, 132}, {84, 17, 56, 138}, {84, 17, 56, 142}, {84, 17, 56, 161}, {84, 17, 56, 166}, {84, 17, 56, 173}, {84, 17, 56, 175}, {84, 17, 56, 181}, {84, 17, 56, 184}}},
{Region: "Hungary", Group: "Premium TCP Europe", IPs: []net.IP{{86, 106, 74, 249}, {86, 106, 74, 250}, {86, 106, 74, 251}, {86, 106, 74, 252}, {86, 106, 74, 253}, {185, 189, 114, 115}, {185, 189, 114, 117}, {185, 189, 114, 121}, {185, 189, 114, 123}, {185, 189, 114, 124}}},
{Region: "Iceland", Group: "Premium UDP Europe", IPs: []net.IP{{45, 133, 193, 3}, {45, 133, 193, 4}, {45, 133, 193, 5}, {45, 133, 193, 7}, {45, 133, 193, 8}, {45, 133, 193, 9}, {45, 133, 193, 11}, {45, 133, 193, 12}, {45, 133, 193, 13}, {45, 133, 193, 14}}},
{Region: "India", Group: "Premium UDP Europe", IPs: []net.IP{{103, 13, 112, 50}, {103, 13, 112, 52}, {103, 13, 112, 54}, {103, 13, 112, 58}, {103, 13, 112, 68}, {103, 13, 112, 69}, {103, 13, 112, 70}, {103, 13, 112, 72}, {103, 13, 112, 74}, {103, 13, 112, 75}}},
{Region: "India", Group: "Premium TCP Europe", IPs: []net.IP{{103, 13, 112, 52}, {103, 13, 112, 54}, {103, 13, 112, 57}, {103, 13, 112, 59}, {103, 13, 112, 60}, {103, 13, 112, 62}, {103, 13, 112, 73}, {103, 13, 112, 77}, {103, 13, 112, 78}, {103, 13, 112, 79}}},
{Region: "Indonesia", Group: "Premium UDP Asia", IPs: []net.IP{{146, 70, 14, 3}, {146, 70, 14, 5}, {146, 70, 14, 6}, {146, 70, 14, 8}, {146, 70, 14, 9}, {146, 70, 14, 10}, {146, 70, 14, 12}, {146, 70, 14, 13}, {146, 70, 14, 14}, {146, 70, 14, 16}}},
{Region: "Indonesia", Group: "Premium TCP Asia", IPs: []net.IP{{146, 70, 14, 3}, {146, 70, 14, 5}, {146, 70, 14, 6}, {146, 70, 14, 7}, {146, 70, 14, 8}, {146, 70, 14, 9}, {146, 70, 14, 11}, {146, 70, 14, 12}, {146, 70, 14, 13}, {146, 70, 14, 16}}},
{Region: "Iran", Group: "Premium UDP Asia", IPs: []net.IP{{62, 133, 46, 4}, {62, 133, 46, 5}, {62, 133, 46, 6}, {62, 133, 46, 7}, {62, 133, 46, 10}, {62, 133, 46, 11}, {62, 133, 46, 12}, {62, 133, 46, 13}, {62, 133, 46, 14}, {62, 133, 46, 15}}},
{Region: "Iran", Group: "Premium TCP Asia", IPs: []net.IP{{62, 133, 46, 4}, {62, 133, 46, 5}, {62, 133, 46, 6}, {62, 133, 46, 8}, {62, 133, 46, 9}, {62, 133, 46, 10}, {62, 133, 46, 11}, {62, 133, 46, 12}, {62, 133, 46, 13}, {62, 133, 46, 14}}},
{Region: "Ireland", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 235, 147}, {37, 120, 235, 149}, {37, 120, 235, 158}, {37, 120, 235, 170}, {77, 81, 139, 41}, {77, 81, 139, 42}, {77, 81, 139, 45}, {84, 247, 48, 21}, {84, 247, 48, 27}, {84, 247, 48, 30}}},
{Region: "Ireland", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 235, 149}, {37, 120, 235, 150}, {37, 120, 235, 155}, {37, 120, 235, 156}, {37, 120, 235, 157}, {37, 120, 235, 166}, {37, 120, 235, 168}, {37, 120, 235, 171}, {84, 247, 48, 4}, {84, 247, 48, 6}}},
{Region: "Isle of Man", Group: "Premium UDP Europe", IPs: []net.IP{{91, 90, 124, 147}, {91, 90, 124, 148}, {91, 90, 124, 149}, {91, 90, 124, 150}, {91, 90, 124, 152}, {91, 90, 124, 154}, {91, 90, 124, 156}, {91, 90, 124, 157}, {91, 90, 124, 158}, {91, 90, 124, 159}}},
{Region: "Isle of Man", Group: "Premium TCP Europe", IPs: []net.IP{{91, 90, 124, 148}, {91, 90, 124, 150}, {91, 90, 124, 151}, {91, 90, 124, 153}, {91, 90, 124, 154}, {91, 90, 124, 155}, {91, 90, 124, 156}, {91, 90, 124, 157}, {91, 90, 124, 158}, {91, 90, 124, 159}}},
{Region: "Israel", Group: "Premium TCP Europe", IPs: []net.IP{{160, 116, 0, 165}, {160, 116, 0, 170}, {185, 77, 248, 103}, {185, 77, 248, 108}, {185, 77, 248, 110}, {185, 77, 248, 112}, {185, 77, 248, 116}, {185, 77, 248, 123}, {185, 77, 248, 125}, {185, 77, 248, 129}}},
{Region: "Italy", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 58, 100}, {84, 17, 58, 117}, {84, 17, 58, 119}, {87, 101, 94, 117}, {87, 101, 94, 124}, {185, 217, 71, 134}, {212, 102, 55, 108}, {212, 102, 55, 110}, {212, 102, 55, 113}, {212, 102, 55, 120}}},
{Region: "Italy", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 58, 4}, {84, 17, 58, 14}, {84, 17, 58, 21}, {84, 17, 58, 101}, {84, 17, 58, 102}, {87, 101, 94, 75}, {212, 102, 55, 101}, {212, 102, 55, 102}, {212, 102, 55, 113}, {212, 102, 55, 120}}},
{Region: "Japan", Group: "Premium TCP Asia", IPs: []net.IP{{156, 146, 35, 7}, {156, 146, 35, 8}, {156, 146, 35, 11}, {156, 146, 35, 20}, {156, 146, 35, 22}, {156, 146, 35, 32}, {156, 146, 35, 33}, {156, 146, 35, 42}, {156, 146, 35, 43}, {156, 146, 35, 44}}},
{Region: "Kazakhstan", Group: "Premium UDP Europe", IPs: []net.IP{{62, 133, 47, 132}, {62, 133, 47, 133}, {62, 133, 47, 134}, {62, 133, 47, 136}, {62, 133, 47, 137}, {62, 133, 47, 139}, {62, 133, 47, 140}, {62, 133, 47, 141}, {62, 133, 47, 142}, {62, 133, 47, 143}}},
{Region: "Kazakhstan", Group: "Premium TCP Europe", IPs: []net.IP{{62, 133, 47, 131}, {62, 133, 47, 133}, {62, 133, 47, 134}, {62, 133, 47, 136}, {62, 133, 47, 137}, {62, 133, 47, 138}, {62, 133, 47, 139}, {62, 133, 47, 141}, {62, 133, 47, 143}, {62, 133, 47, 144}}},
{Region: "Kenya", Group: "Premium TCP Asia", IPs: []net.IP{{62, 12, 118, 195}, {62, 12, 118, 196}, {62, 12, 118, 197}, {62, 12, 118, 198}, {62, 12, 118, 199}, {62, 12, 118, 200}, {62, 12, 118, 201}, {62, 12, 118, 202}, {62, 12, 118, 203}, {62, 12, 118, 204}}},
{Region: "Kenya", Group: "Premium UDP Asia", IPs: []net.IP{{62, 12, 118, 195}, {62, 12, 118, 196}, {62, 12, 118, 197}, {62, 12, 118, 198}, {62, 12, 118, 199}, {62, 12, 118, 200}, {62, 12, 118, 201}, {62, 12, 118, 202}, {62, 12, 118, 203}, {62, 12, 118, 204}}},
{Region: "Korea", Group: "Premium TCP Asia", IPs: []net.IP{{27, 255, 75, 227}, {27, 255, 75, 228}, {27, 255, 75, 229}, {27, 255, 75, 238}, {27, 255, 75, 243}, {27, 255, 75, 245}, {27, 255, 75, 246}, {27, 255, 75, 249}, {27, 255, 75, 252}, {27, 255, 75, 254}}},
{Region: "Korea", Group: "Premium UDP Asia", IPs: []net.IP{{27, 255, 75, 227}, {27, 255, 75, 229}, {27, 255, 75, 231}, {27, 255, 75, 232}, {27, 255, 75, 234}, {27, 255, 75, 235}, {27, 255, 75, 236}, {27, 255, 75, 245}, {27, 255, 75, 247}, {27, 255, 75, 253}}},
{Region: "Latvia", Group: "Premium UDP Europe", IPs: []net.IP{{109, 248, 148, 245}, {109, 248, 148, 247}, {109, 248, 148, 252}, {109, 248, 148, 254}, {109, 248, 149, 20}, {109, 248, 149, 21}, {109, 248, 149, 27}, {109, 248, 149, 28}, {109, 248, 149, 29}, {109, 248, 149, 30}}},
{Region: "Latvia", Group: "Premium TCP Europe", IPs: []net.IP{{109, 248, 148, 243}, {109, 248, 148, 244}, {109, 248, 148, 252}, {109, 248, 149, 19}, {109, 248, 149, 23}, {109, 248, 149, 25}, {109, 248, 149, 27}, {109, 248, 149, 28}, {109, 248, 149, 29}, {109, 248, 149, 30}}},
{Region: "Liechtenstein", Group: "Premium TCP Europe", IPs: []net.IP{{91, 90, 122, 131}, {91, 90, 122, 133}, {91, 90, 122, 134}, {91, 90, 122, 135}, {91, 90, 122, 136}, {91, 90, 122, 137}, {91, 90, 122, 142}, {91, 90, 122, 143}, {91, 90, 122, 144}, {91, 90, 122, 145}}},
{Region: "Liechtenstein", Group: "Premium UDP Europe", IPs: []net.IP{{91, 90, 122, 131}, {91, 90, 122, 132}, {91, 90, 122, 134}, {91, 90, 122, 136}, {91, 90, 122, 138}, {91, 90, 122, 141}, {91, 90, 122, 142}, {91, 90, 122, 143}, {91, 90, 122, 144}, {91, 90, 122, 145}}},
{Region: "Lithuania", Group: "Premium TCP Europe", IPs: []net.IP{{85, 206, 162, 209}, {85, 206, 162, 211}, {85, 206, 162, 216}, {85, 206, 162, 217}, {85, 206, 162, 218}, {85, 206, 162, 221}, {85, 206, 165, 25}, {85, 206, 165, 26}, {85, 206, 165, 30}, {85, 206, 165, 31}}},
{Region: "Lithuania", Group: "Premium UDP Europe", IPs: []net.IP{{85, 206, 162, 209}, {85, 206, 162, 211}, {85, 206, 162, 216}, {85, 206, 162, 217}, {85, 206, 162, 219}, {85, 206, 162, 221}, {85, 206, 165, 19}, {85, 206, 165, 20}, {85, 206, 165, 23}, {85, 206, 165, 30}}},
{Region: "Luxembourg", Group: "Premium UDP Europe", IPs: []net.IP{{5, 253, 204, 19}, {5, 253, 204, 20}, {5, 253, 204, 22}, {5, 253, 204, 23}, {5, 253, 204, 24}, {5, 253, 204, 27}, {5, 253, 204, 29}, {5, 253, 204, 35}, {5, 253, 204, 44}, {5, 253, 204, 45}}},
{Region: "Luxembourg", Group: "Premium TCP Europe", IPs: []net.IP{{5, 253, 204, 9}, {5, 253, 204, 10}, {5, 253, 204, 24}, {5, 253, 204, 28}, {5, 253, 204, 30}, {5, 253, 204, 35}, {5, 253, 204, 38}, {5, 253, 204, 39}, {5, 253, 204, 41}, {5, 253, 204, 46}}},
{Region: "Macao", Group: "Premium TCP Asia", IPs: []net.IP{{84, 252, 92, 131}, {84, 252, 92, 133}, {84, 252, 92, 134}, {84, 252, 92, 135}, {84, 252, 92, 136}, {84, 252, 92, 139}, {84, 252, 92, 141}, {84, 252, 92, 143}, {84, 252, 92, 144}, {84, 252, 92, 145}}},
{Region: "Macao", Group: "Premium UDP Asia", IPs: []net.IP{{84, 252, 92, 131}, {84, 252, 92, 132}, {84, 252, 92, 133}, {84, 252, 92, 138}, {84, 252, 92, 140}, {84, 252, 92, 141}, {84, 252, 92, 142}, {84, 252, 92, 143}, {84, 252, 92, 144}, {84, 252, 92, 145}}},
{Region: "Korea", Group: "Premium UDP Asia", IPs: []net.IP{{79, 110, 55, 132}, {79, 110, 55, 136}, {79, 110, 55, 138}, {79, 110, 55, 141}, {79, 110, 55, 142}, {79, 110, 55, 149}, {79, 110, 55, 153}, {79, 110, 55, 154}, {79, 110, 55, 157}, {79, 110, 55, 158}}},
{Region: "Latvia", Group: "Premium UDP Europe", IPs: []net.IP{{109, 248, 148, 243}, {109, 248, 148, 244}, {109, 248, 148, 248}, {109, 248, 148, 249}, {109, 248, 148, 250}, {109, 248, 148, 252}, {109, 248, 149, 19}, {109, 248, 149, 20}, {109, 248, 149, 24}, {109, 248, 149, 29}}},
{Region: "Latvia", Group: "Premium TCP Europe", IPs: []net.IP{{109, 248, 148, 243}, {109, 248, 148, 245}, {109, 248, 148, 251}, {109, 248, 148, 252}, {109, 248, 149, 22}, {109, 248, 149, 23}, {109, 248, 149, 24}, {109, 248, 149, 26}, {109, 248, 149, 28}, {109, 248, 149, 29}}},
{Region: "Liechtenstein", Group: "Premium UDP Europe", IPs: []net.IP{{91, 90, 122, 131}, {91, 90, 122, 134}, {91, 90, 122, 135}, {91, 90, 122, 136}, {91, 90, 122, 137}, {91, 90, 122, 138}, {91, 90, 122, 141}, {91, 90, 122, 142}, {91, 90, 122, 143}, {91, 90, 122, 144}}},
{Region: "Lithuania", Group: "Premium UDP Europe", IPs: []net.IP{{85, 206, 162, 209}, {85, 206, 162, 211}, {85, 206, 162, 216}, {85, 206, 162, 217}, {85, 206, 162, 218}, {85, 206, 162, 220}, {85, 206, 165, 20}, {85, 206, 165, 23}, {85, 206, 165, 25}, {85, 206, 165, 30}}},
{Region: "Lithuania", Group: "Premium TCP Europe", IPs: []net.IP{{85, 206, 162, 211}, {85, 206, 162, 214}, {85, 206, 162, 215}, {85, 206, 162, 217}, {85, 206, 162, 221}, {85, 206, 162, 222}, {85, 206, 165, 20}, {85, 206, 165, 23}, {85, 206, 165, 24}, {85, 206, 165, 26}}},
{Region: "Luxembourg", Group: "Premium TCP Europe", IPs: []net.IP{{5, 253, 204, 6}, {5, 253, 204, 7}, {5, 253, 204, 13}, {5, 253, 204, 22}, {5, 253, 204, 26}, {5, 253, 204, 29}, {5, 253, 204, 39}, {5, 253, 204, 42}, {5, 253, 204, 43}, {5, 253, 204, 44}}},
{Region: "Luxembourg", Group: "Premium UDP Europe", IPs: []net.IP{{5, 253, 204, 3}, {5, 253, 204, 8}, {5, 253, 204, 10}, {5, 253, 204, 13}, {5, 253, 204, 14}, {5, 253, 204, 22}, {5, 253, 204, 25}, {5, 253, 204, 29}, {5, 253, 204, 36}, {5, 253, 204, 39}}},
{Region: "Macao", Group: "Premium UDP Asia", IPs: []net.IP{{84, 252, 92, 133}, {84, 252, 92, 135}, {84, 252, 92, 137}, {84, 252, 92, 138}, {84, 252, 92, 139}, {84, 252, 92, 140}, {84, 252, 92, 141}, {84, 252, 92, 142}, {84, 252, 92, 143}, {84, 252, 92, 144}}},
{Region: "Macao", Group: "Premium TCP Asia", IPs: []net.IP{{84, 252, 92, 132}, {84, 252, 92, 134}, {84, 252, 92, 137}, {84, 252, 92, 138}, {84, 252, 92, 139}, {84, 252, 92, 140}, {84, 252, 92, 141}, {84, 252, 92, 142}, {84, 252, 92, 143}, {84, 252, 92, 145}}},
{Region: "Macedonia", Group: "Premium UDP Europe", IPs: []net.IP{{185, 225, 28, 3}, {185, 225, 28, 4}, {185, 225, 28, 5}, {185, 225, 28, 6}, {185, 225, 28, 7}, {185, 225, 28, 8}, {185, 225, 28, 9}, {185, 225, 28, 10}, {185, 225, 28, 11}, {185, 225, 28, 12}}},
{Region: "Macedonia", Group: "Premium TCP Europe", IPs: []net.IP{{185, 225, 28, 3}, {185, 225, 28, 4}, {185, 225, 28, 5}, {185, 225, 28, 6}, {185, 225, 28, 7}, {185, 225, 28, 8}, {185, 225, 28, 9}, {185, 225, 28, 10}, {185, 225, 28, 11}, {185, 225, 28, 12}}},
{Region: "Malaysia", Group: "Premium TCP Asia", IPs: []net.IP{{139, 5, 177, 69}, {139, 5, 177, 70}, {139, 5, 177, 71}, {139, 5, 177, 72}, {139, 5, 177, 73}, {139, 5, 177, 74}, {139, 5, 177, 75}, {139, 5, 177, 76}, {139, 5, 177, 77}, {139, 5, 177, 78}}},
{Region: "Malaysia", Group: "Premium UDP Asia", IPs: []net.IP{{139, 5, 177, 69}, {139, 5, 177, 70}, {139, 5, 177, 71}, {139, 5, 177, 72}, {139, 5, 177, 73}, {139, 5, 177, 74}, {139, 5, 177, 75}, {139, 5, 177, 76}, {139, 5, 177, 77}, {139, 5, 177, 78}}},
{Region: "Malta", Group: "Premium UDP Europe", IPs: []net.IP{{176, 125, 230, 131}, {176, 125, 230, 132}, {176, 125, 230, 133}, {176, 125, 230, 135}, {176, 125, 230, 136}, {176, 125, 230, 140}, {176, 125, 230, 141}, {176, 125, 230, 142}, {176, 125, 230, 143}, {176, 125, 230, 145}}},
{Region: "Malta", Group: "Premium TCP Europe", IPs: []net.IP{{176, 125, 230, 132}, {176, 125, 230, 133}, {176, 125, 230, 134}, {176, 125, 230, 135}, {176, 125, 230, 136}, {176, 125, 230, 138}, {176, 125, 230, 140}, {176, 125, 230, 142}, {176, 125, 230, 143}, {176, 125, 230, 144}}},
{Region: "Mexico", Group: "Premium UDP USA", IPs: []net.IP{{77, 81, 142, 132}, {77, 81, 142, 136}, {77, 81, 142, 137}, {77, 81, 142, 139}, {77, 81, 142, 140}, {77, 81, 142, 143}, {77, 81, 142, 146}, {77, 81, 142, 149}, {77, 81, 142, 154}, {77, 81, 142, 155}}},
{Region: "Mexico", Group: "Premium TCP USA", IPs: []net.IP{{77, 81, 142, 130}, {77, 81, 142, 132}, {77, 81, 142, 134}, {77, 81, 142, 136}, {77, 81, 142, 138}, {77, 81, 142, 142}, {77, 81, 142, 146}, {77, 81, 142, 150}, {77, 81, 142, 154}, {77, 81, 142, 155}}},
{Region: "Moldova", Group: "Premium UDP Europe", IPs: []net.IP{{178, 175, 130, 243}, {178, 175, 130, 244}, {178, 175, 130, 245}, {178, 175, 130, 246}, {178, 175, 130, 250}, {178, 175, 130, 251}, {178, 175, 130, 252}, {178, 175, 130, 254}, {178, 175, 142, 133}, {178, 175, 142, 134}}},
{Region: "Moldova", Group: "Premium TCP Europe", IPs: []net.IP{{178, 175, 130, 243}, {178, 175, 130, 244}, {178, 175, 130, 245}, {178, 175, 130, 246}, {178, 175, 130, 250}, {178, 175, 130, 252}, {178, 175, 130, 253}, {178, 175, 130, 254}, {178, 175, 142, 132}, {178, 175, 142, 134}}},
{Region: "Monaco", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 233, 131}, {95, 181, 233, 134}, {95, 181, 233, 135}, {95, 181, 233, 136}, {95, 181, 233, 137}, {95, 181, 233, 138}, {95, 181, 233, 140}, {95, 181, 233, 141}, {95, 181, 233, 142}, {95, 181, 233, 143}}},
{Region: "Monaco", Group: "Premium TCP Europe", IPs: []net.IP{{95, 181, 233, 131}, {95, 181, 233, 132}, {95, 181, 233, 134}, {95, 181, 233, 136}, {95, 181, 233, 137}, {95, 181, 233, 140}, {95, 181, 233, 141}, {95, 181, 233, 142}, {95, 181, 233, 143}, {95, 181, 233, 144}}},
{Region: "Mongolia", Group: "Premium TCP Asia", IPs: []net.IP{{185, 253, 163, 132}, {185, 253, 163, 134}, {185, 253, 163, 136}, {185, 253, 163, 137}, {185, 253, 163, 138}, {185, 253, 163, 139}, {185, 253, 163, 140}, {185, 253, 163, 142}, {185, 253, 163, 144}, {185, 253, 163, 145}}},
{Region: "Mongolia", Group: "Premium UDP Asia", IPs: []net.IP{{185, 253, 163, 131}, {185, 253, 163, 134}, {185, 253, 163, 136}, {185, 253, 163, 137}, {185, 253, 163, 139}, {185, 253, 163, 140}, {185, 253, 163, 141}, {185, 253, 163, 142}, {185, 253, 163, 144}, {185, 253, 163, 145}}},
{Region: "Montenegro", Group: "Premium UDP Europe", IPs: []net.IP{{176, 125, 229, 132}, {176, 125, 229, 133}, {176, 125, 229, 134}, {176, 125, 229, 135}, {176, 125, 229, 137}, {176, 125, 229, 139}, {176, 125, 229, 140}, {176, 125, 229, 141}, {176, 125, 229, 142}, {176, 125, 229, 145}}},
{Region: "Montenegro", Group: "Premium TCP Europe", IPs: []net.IP{{176, 125, 229, 131}, {176, 125, 229, 134}, {176, 125, 229, 135}, {176, 125, 229, 137}, {176, 125, 229, 138}, {176, 125, 229, 140}, {176, 125, 229, 141}, {176, 125, 229, 142}, {176, 125, 229, 143}, {176, 125, 229, 145}}},
{Region: "Morocco", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 232, 131}, {95, 181, 232, 132}, {95, 181, 232, 134}, {95, 181, 232, 135}, {95, 181, 232, 139}, {95, 181, 232, 140}, {95, 181, 232, 141}, {95, 181, 232, 142}, {95, 181, 232, 143}, {95, 181, 232, 144}}},
{Region: "Morocco", Group: "Premium TCP Europe", IPs: []net.IP{{95, 181, 232, 131}, {95, 181, 232, 133}, {95, 181, 232, 134}, {95, 181, 232, 135}, {95, 181, 232, 137}, {95, 181, 232, 138}, {95, 181, 232, 139}, {95, 181, 232, 141}, {95, 181, 232, 142}, {95, 181, 232, 143}}},
{Region: "Netherlands", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 47, 2}, {84, 17, 47, 3}, {84, 17, 47, 9}, {84, 17, 47, 15}, {84, 17, 47, 16}, {84, 17, 47, 54}, {84, 17, 47, 69}, {84, 17, 47, 81}, {84, 17, 47, 111}, {195, 181, 172, 72}}},
{Region: "Netherlands", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 47, 9}, {84, 17, 47, 34}, {84, 17, 47, 52}, {84, 17, 47, 53}, {84, 17, 47, 66}, {84, 17, 47, 73}, {84, 17, 47, 95}, {139, 28, 217, 222}, {195, 181, 172, 67}, {195, 181, 172, 68}}},
{Region: "New Zealand", Group: "Premium TCP Asia", IPs: []net.IP{{114, 141, 194, 2}, {114, 141, 194, 3}, {114, 141, 194, 4}, {114, 141, 194, 5}, {114, 141, 194, 7}, {114, 141, 194, 8}, {114, 141, 194, 10}, {114, 141, 194, 12}, {114, 141, 194, 13}, {114, 141, 194, 14}}},
{Region: "New Zealand", Group: "Premium UDP Asia", IPs: []net.IP{{114, 141, 194, 2}, {114, 141, 194, 3}, {114, 141, 194, 5}, {114, 141, 194, 6}, {114, 141, 194, 7}, {114, 141, 194, 8}, {114, 141, 194, 9}, {114, 141, 194, 11}, {114, 141, 194, 12}, {114, 141, 194, 13}}},
{Region: "Nigeria", Group: "Premium TCP Europe", IPs: []net.IP{{102, 165, 25, 68}, {102, 165, 25, 69}, {102, 165, 25, 70}, {102, 165, 25, 71}, {102, 165, 25, 72}, {102, 165, 25, 73}, {102, 165, 25, 74}, {102, 165, 25, 76}, {102, 165, 25, 77}, {102, 165, 25, 78}}},
{Region: "Nigeria", Group: "Premium UDP Europe", IPs: []net.IP{{102, 165, 25, 68}, {102, 165, 25, 69}, {102, 165, 25, 70}, {102, 165, 25, 71}, {102, 165, 25, 72}, {102, 165, 25, 74}, {102, 165, 25, 75}, {102, 165, 25, 76}, {102, 165, 25, 77}, {102, 165, 25, 78}}},
{Region: "Norway", Group: "Premium UDP Europe", IPs: []net.IP{{45, 12, 223, 137}, {45, 12, 223, 140}, {45, 12, 223, 141}, {82, 102, 27, 92}, {185, 206, 225, 29}, {185, 206, 225, 231}, {185, 206, 225, 235}, {185, 253, 97, 248}, {185, 253, 97, 249}, {185, 253, 97, 250}}},
{Region: "Norway", Group: "Premium TCP Europe", IPs: []net.IP{{185, 206, 225, 229}, {185, 206, 225, 230}, {185, 206, 225, 231}, {185, 206, 225, 232}, {185, 206, 225, 234}, {185, 253, 97, 236}, {185, 253, 97, 243}, {185, 253, 97, 245}, {185, 253, 97, 247}, {185, 253, 97, 251}}},
{Region: "Pakistan", Group: "Premium TCP Europe", IPs: []net.IP{{103, 76, 3, 244}, {103, 76, 3, 245}, {103, 76, 3, 246}, {103, 76, 3, 247}, {103, 76, 3, 248}, {103, 76, 3, 249}, {103, 76, 3, 250}, {103, 76, 3, 251}, {103, 76, 3, 252}, {103, 76, 3, 253}}},
{Region: "Pakistan", Group: "Premium UDP Europe", IPs: []net.IP{{103, 76, 3, 244}, {103, 76, 3, 245}, {103, 76, 3, 246}, {103, 76, 3, 247}, {103, 76, 3, 248}, {103, 76, 3, 249}, {103, 76, 3, 250}, {103, 76, 3, 251}, {103, 76, 3, 252}, {103, 76, 3, 253}}},
{Region: "Panama", Group: "Premium UDP Europe", IPs: []net.IP{{91, 90, 126, 131}, {91, 90, 126, 132}, {91, 90, 126, 133}, {91, 90, 126, 134}, {91, 90, 126, 135}, {91, 90, 126, 136}, {91, 90, 126, 139}, {91, 90, 126, 141}, {91, 90, 126, 143}, {91, 90, 126, 144}}},
{Region: "Panama", Group: "Premium TCP Europe", IPs: []net.IP{{91, 90, 126, 131}, {91, 90, 126, 132}, {91, 90, 126, 134}, {91, 90, 126, 135}, {91, 90, 126, 137}, {91, 90, 126, 139}, {91, 90, 126, 140}, {91, 90, 126, 142}, {91, 90, 126, 144}, {91, 90, 126, 145}}},
{Region: "Philippines", Group: "Premium UDP Asia", IPs: []net.IP{{188, 214, 125, 35}, {188, 214, 125, 36}, {188, 214, 125, 41}, {188, 214, 125, 44}, {188, 214, 125, 47}, {188, 214, 125, 52}, {188, 214, 125, 53}, {188, 214, 125, 54}, {188, 214, 125, 55}, {188, 214, 125, 60}}},
{Region: "Philippines", Group: "Premium TCP Asia", IPs: []net.IP{{188, 214, 125, 36}, {188, 214, 125, 37}, {188, 214, 125, 39}, {188, 214, 125, 43}, {188, 214, 125, 45}, {188, 214, 125, 47}, {188, 214, 125, 48}, {188, 214, 125, 57}, {188, 214, 125, 58}, {188, 214, 125, 59}}},
{Region: "Poland", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 156, 5}, {37, 120, 156, 9}, {37, 120, 156, 19}, {37, 120, 156, 27}, {37, 120, 156, 29}, {37, 120, 156, 35}, {37, 120, 156, 36}, {51, 75, 56, 40}, {51, 75, 56, 41}, {51, 75, 56, 44}}},
{Region: "Poland", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 156, 4}, {37, 120, 156, 10}, {37, 120, 156, 16}, {37, 120, 156, 23}, {37, 120, 156, 27}, {37, 120, 156, 29}, {37, 120, 156, 30}, {37, 120, 156, 38}, {37, 120, 156, 39}, {51, 75, 56, 36}}},
{Region: "Portugal", Group: "Premium TCP Europe", IPs: []net.IP{{89, 26, 243, 1}, {89, 26, 243, 98}, {89, 26, 243, 112}, {89, 26, 243, 113}, {89, 26, 243, 115}, {89, 26, 243, 195}, {89, 26, 243, 196}, {89, 26, 243, 197}, {89, 26, 243, 198}, {89, 26, 243, 199}}},
{Region: "Portugal", Group: "Premium UDP Europe", IPs: []net.IP{{89, 26, 243, 1}, {89, 26, 243, 99}, {89, 26, 243, 113}, {89, 26, 243, 115}, {89, 26, 243, 194}, {89, 26, 243, 195}, {89, 26, 243, 196}, {89, 26, 243, 197}, {89, 26, 243, 198}, {89, 26, 243, 199}}},
{Region: "Qatar", Group: "Premium TCP Europe", IPs: []net.IP{{95, 181, 234, 132}, {95, 181, 234, 133}, {95, 181, 234, 134}, {95, 181, 234, 136}, {95, 181, 234, 138}, {95, 181, 234, 140}, {95, 181, 234, 141}, {95, 181, 234, 142}, {95, 181, 234, 143}, {95, 181, 234, 144}}},
{Region: "Qatar", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 234, 131}, {95, 181, 234, 132}, {95, 181, 234, 133}, {95, 181, 234, 134}, {95, 181, 234, 137}, {95, 181, 234, 138}, {95, 181, 234, 141}, {95, 181, 234, 142}, {95, 181, 234, 143}, {95, 181, 234, 144}}},
{Region: "Russian Federation", Group: "Premium TCP Europe", IPs: []net.IP{{5, 8, 16, 67}, {5, 8, 16, 71}, {5, 8, 16, 73}, {5, 8, 16, 75}, {5, 8, 16, 76}, {5, 8, 16, 87}, {5, 8, 16, 88}, {5, 8, 16, 89}, {5, 8, 16, 90}, {5, 8, 16, 104}}},
{Region: "Russian Federation", Group: "Premium UDP Europe", IPs: []net.IP{{5, 8, 16, 68}, {5, 8, 16, 75}, {5, 8, 16, 84}, {5, 8, 16, 86}, {5, 8, 16, 87}, {5, 8, 16, 88}, {5, 8, 16, 104}, {5, 8, 16, 106}, {5, 8, 16, 107}, {5, 8, 16, 110}}},
{Region: "Saudi Arabia", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 235, 132}, {95, 181, 235, 133}, {95, 181, 235, 134}, {95, 181, 235, 135}, {95, 181, 235, 136}, {95, 181, 235, 137}, {95, 181, 235, 139}, {95, 181, 235, 141}, {95, 181, 235, 142}, {95, 181, 235, 143}}},
{Region: "Saudi Arabia", Group: "Premium TCP Europe", IPs: []net.IP{{95, 181, 235, 134}, {95, 181, 235, 136}, {95, 181, 235, 137}, {95, 181, 235, 138}, {95, 181, 235, 139}, {95, 181, 235, 140}, {95, 181, 235, 141}, {95, 181, 235, 142}, {95, 181, 235, 143}, {95, 181, 235, 144}}},
{Region: "Serbia", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 193, 182}, {37, 120, 193, 185}, {37, 120, 193, 187}, {141, 98, 103, 35}, {141, 98, 103, 37}, {141, 98, 103, 39}, {141, 98, 103, 41}, {141, 98, 103, 42}, {141, 98, 103, 44}, {141, 98, 103, 46}}},
{Region: "Serbia", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 193, 180}, {37, 120, 193, 182}, {37, 120, 193, 183}, {37, 120, 193, 184}, {37, 120, 193, 190}, {141, 98, 103, 35}, {141, 98, 103, 36}, {141, 98, 103, 39}, {141, 98, 103, 40}, {141, 98, 103, 42}}},
{Region: "Singapore", Group: "Premium TCP Asia", IPs: []net.IP{{37, 120, 151, 59}, {37, 120, 151, 134}, {37, 120, 151, 135}, {37, 120, 151, 136}, {37, 120, 151, 140}, {37, 120, 151, 141}, {84, 17, 39, 172}, {84, 17, 39, 173}, {84, 17, 39, 178}, {84, 17, 39, 179}}},
{Region: "Singapore", Group: "Premium UDP Asia", IPs: []net.IP{{37, 120, 151, 52}, {37, 120, 151, 133}, {37, 120, 151, 138}, {37, 120, 151, 140}, {37, 120, 151, 142}, {84, 17, 39, 171}, {84, 17, 39, 176}, {84, 17, 39, 177}, {84, 17, 39, 179}, {84, 17, 39, 182}}},
{Region: "Malaysia", Group: "Premium TCP Asia", IPs: []net.IP{{146, 70, 15, 7}, {146, 70, 15, 8}, {146, 70, 15, 9}, {146, 70, 15, 10}, {146, 70, 15, 11}, {146, 70, 15, 12}, {146, 70, 15, 13}, {146, 70, 15, 14}, {146, 70, 15, 15}, {146, 70, 15, 16}}},
{Region: "Malaysia", Group: "Premium UDP Asia", IPs: []net.IP{{146, 70, 15, 4}, {146, 70, 15, 6}, {146, 70, 15, 7}, {146, 70, 15, 8}, {146, 70, 15, 9}, {146, 70, 15, 12}, {146, 70, 15, 13}, {146, 70, 15, 14}, {146, 70, 15, 15}, {146, 70, 15, 16}}},
{Region: "Malta", Group: "Premium TCP Europe", IPs: []net.IP{{176, 125, 230, 132}, {176, 125, 230, 135}, {176, 125, 230, 136}, {176, 125, 230, 137}, {176, 125, 230, 138}, {176, 125, 230, 139}, {176, 125, 230, 140}, {176, 125, 230, 141}, {176, 125, 230, 142}, {176, 125, 230, 143}}},
{Region: "Malta", Group: "Premium UDP Europe", IPs: []net.IP{{176, 125, 230, 131}, {176, 125, 230, 133}, {176, 125, 230, 134}, {176, 125, 230, 135}, {176, 125, 230, 137}, {176, 125, 230, 138}, {176, 125, 230, 139}, {176, 125, 230, 140}, {176, 125, 230, 141}, {176, 125, 230, 145}}},
{Region: "Mexico", Group: "Premium TCP USA", IPs: []net.IP{{77, 81, 142, 130}, {77, 81, 142, 131}, {77, 81, 142, 137}, {77, 81, 142, 139}, {77, 81, 142, 144}, {77, 81, 142, 149}, {77, 81, 142, 150}, {77, 81, 142, 154}, {77, 81, 142, 156}, {77, 81, 142, 157}}},
{Region: "Mexico", Group: "Premium UDP USA", IPs: []net.IP{{77, 81, 142, 130}, {77, 81, 142, 131}, {77, 81, 142, 135}, {77, 81, 142, 138}, {77, 81, 142, 139}, {77, 81, 142, 140}, {77, 81, 142, 144}, {77, 81, 142, 155}, {77, 81, 142, 156}, {77, 81, 142, 157}}},
{Region: "Moldova", Group: "Premium UDP Europe", IPs: []net.IP{{178, 175, 130, 243}, {178, 175, 130, 244}, {178, 175, 130, 245}, {178, 175, 130, 246}, {178, 175, 130, 250}, {178, 175, 130, 252}, {178, 175, 130, 253}, {178, 175, 130, 254}, {178, 175, 142, 133}, {178, 175, 142, 134}}},
{Region: "Moldova", Group: "Premium TCP Europe", IPs: []net.IP{{178, 175, 130, 243}, {178, 175, 130, 245}, {178, 175, 130, 246}, {178, 175, 130, 250}, {178, 175, 130, 251}, {178, 175, 130, 252}, {178, 175, 130, 254}, {178, 175, 142, 131}, {178, 175, 142, 132}, {178, 175, 142, 134}}},
{Region: "Monaco", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 233, 131}, {95, 181, 233, 132}, {95, 181, 233, 135}, {95, 181, 233, 136}, {95, 181, 233, 137}, {95, 181, 233, 139}, {95, 181, 233, 140}, {95, 181, 233, 141}, {95, 181, 233, 143}, {95, 181, 233, 144}}},
{Region: "Monaco", Group: "Premium TCP Europe", IPs: []net.IP{{95, 181, 233, 131}, {95, 181, 233, 132}, {95, 181, 233, 133}, {95, 181, 233, 136}, {95, 181, 233, 138}, {95, 181, 233, 139}, {95, 181, 233, 140}, {95, 181, 233, 141}, {95, 181, 233, 142}, {95, 181, 233, 144}}},
{Region: "Mongolia", Group: "Premium TCP Asia", IPs: []net.IP{{185, 253, 163, 131}, {185, 253, 163, 132}, {185, 253, 163, 134}, {185, 253, 163, 135}, {185, 253, 163, 137}, {185, 253, 163, 139}, {185, 253, 163, 141}, {185, 253, 163, 142}, {185, 253, 163, 144}, {185, 253, 163, 145}}},
{Region: "Mongolia", Group: "Premium UDP Asia", IPs: []net.IP{{185, 253, 163, 131}, {185, 253, 163, 132}, {185, 253, 163, 133}, {185, 253, 163, 134}, {185, 253, 163, 137}, {185, 253, 163, 138}, {185, 253, 163, 140}, {185, 253, 163, 142}, {185, 253, 163, 143}, {185, 253, 163, 145}}},
{Region: "Montenegro", Group: "Premium TCP Europe", IPs: []net.IP{{176, 125, 229, 131}, {176, 125, 229, 132}, {176, 125, 229, 133}, {176, 125, 229, 134}, {176, 125, 229, 135}, {176, 125, 229, 138}, {176, 125, 229, 139}, {176, 125, 229, 141}, {176, 125, 229, 142}, {176, 125, 229, 144}}},
{Region: "Morocco", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 232, 131}, {95, 181, 232, 132}, {95, 181, 232, 133}, {95, 181, 232, 135}, {95, 181, 232, 138}, {95, 181, 232, 139}, {95, 181, 232, 140}, {95, 181, 232, 141}, {95, 181, 232, 143}, {95, 181, 232, 144}}},
{Region: "Morocco", Group: "Premium TCP Europe", IPs: []net.IP{{95, 181, 232, 131}, {95, 181, 232, 132}, {95, 181, 232, 133}, {95, 181, 232, 134}, {95, 181, 232, 135}, {95, 181, 232, 136}, {95, 181, 232, 137}, {95, 181, 232, 138}, {95, 181, 232, 140}, {95, 181, 232, 142}}},
{Region: "Netherlands", Group: "Premium UDP Europe", IPs: []net.IP{{181, 214, 206, 16}, {181, 214, 206, 18}, {191, 96, 168, 19}, {191, 96, 168, 115}, {191, 96, 168, 128}, {195, 78, 54, 31}, {195, 78, 54, 123}, {195, 78, 54, 125}, {195, 78, 54, 131}, {195, 78, 54, 144}}},
{Region: "Netherlands", Group: "Premium TCP Europe", IPs: []net.IP{{191, 96, 168, 18}, {191, 96, 168, 40}, {191, 96, 168, 50}, {191, 96, 168, 112}, {191, 96, 168, 127}, {195, 78, 54, 8}, {195, 78, 54, 50}, {195, 78, 54, 118}, {195, 78, 54, 145}, {195, 181, 172, 78}}},
{Region: "New Zealand", Group: "Premium TCP Asia", IPs: []net.IP{{114, 141, 194, 2}, {114, 141, 194, 3}, {114, 141, 194, 5}, {114, 141, 194, 6}, {114, 141, 194, 7}, {114, 141, 194, 9}, {114, 141, 194, 10}, {114, 141, 194, 11}, {114, 141, 194, 13}, {114, 141, 194, 14}}},
{Region: "New Zealand", Group: "Premium UDP Asia", IPs: []net.IP{{114, 141, 194, 3}, {114, 141, 194, 4}, {114, 141, 194, 6}, {114, 141, 194, 7}, {114, 141, 194, 8}, {114, 141, 194, 9}, {114, 141, 194, 10}, {114, 141, 194, 11}, {114, 141, 194, 13}, {114, 141, 194, 14}}},
{Region: "Nigeria", Group: "Premium UDP Europe", IPs: []net.IP{{102, 165, 25, 68}, {102, 165, 25, 69}, {102, 165, 25, 70}, {102, 165, 25, 71}, {102, 165, 25, 72}, {102, 165, 25, 73}, {102, 165, 25, 74}, {102, 165, 25, 76}, {102, 165, 25, 77}, {102, 165, 25, 78}}},
{Region: "Nigeria", Group: "Premium TCP Europe", IPs: []net.IP{{102, 165, 25, 68}, {102, 165, 25, 70}, {102, 165, 25, 71}, {102, 165, 25, 72}, {102, 165, 25, 73}, {102, 165, 25, 74}, {102, 165, 25, 75}, {102, 165, 25, 76}, {102, 165, 25, 77}, {102, 165, 25, 78}}},
{Region: "Norway", Group: "Premium TCP Europe", IPs: []net.IP{{45, 12, 223, 131}, {45, 12, 223, 132}, {45, 12, 223, 134}, {45, 12, 223, 138}, {45, 12, 223, 141}, {82, 102, 27, 93}, {185, 206, 225, 235}, {185, 253, 97, 236}, {185, 253, 97, 245}, {185, 253, 97, 247}}},
{Region: "Norway", Group: "Premium UDP Europe", IPs: []net.IP{{45, 12, 223, 136}, {45, 12, 223, 141}, {82, 102, 27, 93}, {185, 206, 225, 28}, {185, 206, 225, 29}, {185, 206, 225, 231}, {185, 206, 225, 233}, {185, 253, 97, 245}, {185, 253, 97, 247}, {185, 253, 97, 249}}},
{Region: "Pakistan", Group: "Premium TCP Asia", IPs: []net.IP{{146, 70, 12, 3}, {146, 70, 12, 4}, {146, 70, 12, 5}, {146, 70, 12, 6}, {146, 70, 12, 7}, {146, 70, 12, 8}, {146, 70, 12, 9}, {146, 70, 12, 11}, {146, 70, 12, 12}, {146, 70, 12, 14}}},
{Region: "Pakistan", Group: "Premium UDP Asia", IPs: []net.IP{{146, 70, 12, 3}, {146, 70, 12, 4}, {146, 70, 12, 5}, {146, 70, 12, 7}, {146, 70, 12, 9}, {146, 70, 12, 10}, {146, 70, 12, 11}, {146, 70, 12, 12}, {146, 70, 12, 13}, {146, 70, 12, 14}}},
{Region: "Panama", Group: "Premium UDP Europe", IPs: []net.IP{{91, 90, 126, 131}, {91, 90, 126, 132}, {91, 90, 126, 133}, {91, 90, 126, 135}, {91, 90, 126, 137}, {91, 90, 126, 139}, {91, 90, 126, 140}, {91, 90, 126, 141}, {91, 90, 126, 143}, {91, 90, 126, 145}}},
{Region: "Panama", Group: "Premium TCP Europe", IPs: []net.IP{{91, 90, 126, 133}, {91, 90, 126, 134}, {91, 90, 126, 135}, {91, 90, 126, 137}, {91, 90, 126, 138}, {91, 90, 126, 139}, {91, 90, 126, 140}, {91, 90, 126, 141}, {91, 90, 126, 142}, {91, 90, 126, 145}}},
{Region: "Philippines", Group: "Premium TCP Asia", IPs: []net.IP{{188, 214, 125, 35}, {188, 214, 125, 36}, {188, 214, 125, 37}, {188, 214, 125, 38}, {188, 214, 125, 44}, {188, 214, 125, 52}, {188, 214, 125, 53}, {188, 214, 125, 54}, {188, 214, 125, 60}, {188, 214, 125, 62}}},
{Region: "Philippines", Group: "Premium UDP Asia", IPs: []net.IP{{188, 214, 125, 35}, {188, 214, 125, 37}, {188, 214, 125, 39}, {188, 214, 125, 41}, {188, 214, 125, 42}, {188, 214, 125, 43}, {188, 214, 125, 48}, {188, 214, 125, 52}, {188, 214, 125, 57}, {188, 214, 125, 62}}},
{Region: "Poland", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 156, 5}, {37, 120, 156, 14}, {37, 120, 156, 18}, {37, 120, 156, 21}, {37, 120, 156, 23}, {37, 120, 156, 39}, {37, 120, 156, 40}, {51, 75, 56, 34}, {51, 75, 56, 37}, {51, 75, 56, 43}}},
{Region: "Poland", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 156, 9}, {37, 120, 156, 10}, {37, 120, 156, 12}, {37, 120, 156, 17}, {37, 120, 156, 20}, {37, 120, 156, 22}, {37, 120, 156, 39}, {51, 75, 56, 41}, {51, 75, 56, 43}, {51, 75, 56, 44}}},
{Region: "Portugal", Group: "Premium TCP Europe", IPs: []net.IP{{89, 26, 243, 2}, {89, 26, 243, 100}, {89, 26, 243, 197}, {89, 26, 243, 198}, {89, 26, 243, 216}, {89, 26, 243, 219}, {89, 26, 243, 222}, {89, 26, 243, 224}, {89, 26, 243, 226}, {89, 26, 243, 227}}},
{Region: "Qatar", Group: "Premium TCP Europe", IPs: []net.IP{{95, 181, 234, 131}, {95, 181, 234, 133}, {95, 181, 234, 134}, {95, 181, 234, 135}, {95, 181, 234, 136}, {95, 181, 234, 137}, {95, 181, 234, 138}, {95, 181, 234, 142}, {95, 181, 234, 143}, {95, 181, 234, 144}}},
{Region: "Qatar", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 234, 131}, {95, 181, 234, 132}, {95, 181, 234, 134}, {95, 181, 234, 135}, {95, 181, 234, 136}, {95, 181, 234, 138}, {95, 181, 234, 140}, {95, 181, 234, 142}, {95, 181, 234, 143}, {95, 181, 234, 144}}},
{Region: "Russian Federation", Group: "Premium UDP Europe", IPs: []net.IP{{5, 8, 16, 74}, {5, 8, 16, 88}, {5, 8, 16, 89}, {5, 8, 16, 90}, {5, 8, 16, 91}, {5, 8, 16, 94}, {5, 8, 16, 109}, {5, 8, 16, 124}, {5, 8, 16, 125}, {5, 8, 16, 131}}},
{Region: "Russian Federation", Group: "Premium TCP Europe", IPs: []net.IP{{5, 8, 16, 75}, {5, 8, 16, 87}, {5, 8, 16, 94}, {5, 8, 16, 116}, {5, 8, 16, 117}, {5, 8, 16, 118}, {5, 8, 16, 126}, {5, 8, 16, 133}, {5, 8, 16, 134}, {5, 8, 16, 142}}},
{Region: "Saudi Arabia", Group: "Premium TCP Europe", IPs: []net.IP{{95, 181, 235, 131}, {95, 181, 235, 132}, {95, 181, 235, 133}, {95, 181, 235, 134}, {95, 181, 235, 135}, {95, 181, 235, 136}, {95, 181, 235, 137}, {95, 181, 235, 138}, {95, 181, 235, 140}, {95, 181, 235, 141}}},
{Region: "Saudi Arabia", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 235, 131}, {95, 181, 235, 132}, {95, 181, 235, 133}, {95, 181, 235, 134}, {95, 181, 235, 137}, {95, 181, 235, 138}, {95, 181, 235, 139}, {95, 181, 235, 140}, {95, 181, 235, 141}, {95, 181, 235, 143}}},
{Region: "Serbia", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 193, 180}, {37, 120, 193, 181}, {37, 120, 193, 183}, {37, 120, 193, 184}, {37, 120, 193, 185}, {37, 120, 193, 189}, {141, 98, 103, 35}, {141, 98, 103, 40}, {141, 98, 103, 43}, {141, 98, 103, 46}}},
{Region: "Singapore", Group: "Premium TCP Asia", IPs: []net.IP{{84, 17, 39, 162}, {84, 17, 39, 167}, {84, 17, 39, 170}, {84, 17, 39, 175}, {84, 17, 39, 176}, {84, 17, 39, 177}, {84, 17, 39, 179}, {84, 17, 39, 181}, {84, 17, 39, 183}, {84, 17, 39, 185}}},
{Region: "Singapore", Group: "Premium UDP Asia", IPs: []net.IP{{84, 17, 39, 162}, {84, 17, 39, 165}, {84, 17, 39, 166}, {84, 17, 39, 167}, {84, 17, 39, 168}, {84, 17, 39, 171}, {84, 17, 39, 172}, {84, 17, 39, 173}, {84, 17, 39, 175}, {84, 17, 39, 185}}},
{Region: "Slovakia", Group: "Premium TCP Europe", IPs: []net.IP{{185, 245, 85, 227}, {185, 245, 85, 228}, {185, 245, 85, 229}, {185, 245, 85, 230}, {185, 245, 85, 231}, {185, 245, 85, 232}, {185, 245, 85, 233}, {185, 245, 85, 234}, {185, 245, 85, 235}, {185, 245, 85, 236}}},
{Region: "Slovakia", Group: "Premium UDP Europe", IPs: []net.IP{{185, 245, 85, 227}, {185, 245, 85, 228}, {185, 245, 85, 229}, {185, 245, 85, 230}, {185, 245, 85, 231}, {185, 245, 85, 232}, {185, 245, 85, 233}, {185, 245, 85, 234}, {185, 245, 85, 235}, {185, 245, 85, 236}}},
{Region: "Slovenia", Group: "Premium TCP Europe", IPs: []net.IP{{146, 247, 25, 79}, {146, 247, 25, 80}, {146, 247, 25, 81}, {146, 247, 25, 82}, {146, 247, 25, 83}, {146, 247, 25, 84}, {146, 247, 25, 85}, {146, 247, 25, 86}, {146, 247, 25, 88}, {146, 247, 25, 89}}},
{Region: "Slovenia", Group: "Premium UDP Europe", IPs: []net.IP{{146, 247, 25, 79}, {146, 247, 25, 80}, {146, 247, 25, 81}, {146, 247, 25, 82}, {146, 247, 25, 83}, {146, 247, 25, 84}, {146, 247, 25, 86}, {146, 247, 25, 88}, {146, 247, 25, 89}, {146, 247, 25, 90}}},
{Region: "South Africa", Group: "Premium UDP Europe", IPs: []net.IP{{197, 85, 7, 26}, {197, 85, 7, 27}, {197, 85, 7, 28}, {197, 85, 7, 29}, {197, 85, 7, 30}, {197, 85, 7, 31}, {197, 85, 7, 131}, {197, 85, 7, 132}, {197, 85, 7, 133}, {197, 85, 7, 134}}},
{Region: "South Africa", Group: "Premium UDP Asia", IPs: []net.IP{{165, 73, 248, 211}, {165, 73, 248, 213}, {165, 73, 248, 215}, {165, 73, 248, 219}, {165, 73, 248, 221}, {165, 73, 248, 228}, {165, 73, 248, 231}, {165, 73, 248, 232}, {165, 73, 248, 235}, {165, 73, 248, 237}}},
{Region: "Slovenia", Group: "Premium TCP Europe", IPs: []net.IP{{195, 80, 150, 211}, {195, 80, 150, 212}, {195, 80, 150, 213}, {195, 80, 150, 214}, {195, 80, 150, 215}, {195, 80, 150, 216}, {195, 80, 150, 217}, {195, 80, 150, 219}, {195, 80, 150, 221}, {195, 80, 150, 222}}},
{Region: "Slovenia", Group: "Premium UDP Europe", IPs: []net.IP{{195, 80, 150, 211}, {195, 80, 150, 212}, {195, 80, 150, 213}, {195, 80, 150, 214}, {195, 80, 150, 217}, {195, 80, 150, 218}, {195, 80, 150, 219}, {195, 80, 150, 220}, {195, 80, 150, 221}, {195, 80, 150, 222}}},
{Region: "South Africa", Group: "Premium TCP Europe", IPs: []net.IP{{197, 85, 7, 26}, {197, 85, 7, 27}, {197, 85, 7, 28}, {197, 85, 7, 29}, {197, 85, 7, 30}, {197, 85, 7, 31}, {197, 85, 7, 131}, {197, 85, 7, 132}, {197, 85, 7, 133}, {197, 85, 7, 134}}},
{Region: "South Africa", Group: "Premium TCP Asia", IPs: []net.IP{{165, 73, 248, 214}, {165, 73, 248, 215}, {165, 73, 248, 216}, {165, 73, 248, 218}, {165, 73, 248, 219}, {165, 73, 248, 221}, {165, 73, 248, 229}, {165, 73, 248, 235}, {165, 73, 248, 236}, {165, 73, 248, 238}}},
{Region: "Spain", Group: "Premium TCP Europe", IPs: []net.IP{{82, 102, 26, 204}, {82, 102, 26, 205}, {84, 17, 62, 130}, {84, 17, 62, 131}, {84, 17, 62, 140}, {84, 17, 62, 147}, {185, 93, 3, 109}, {185, 93, 3, 110}, {185, 93, 3, 112}, {185, 253, 99, 205}}},
{Region: "Spain", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 142, 54}, {37, 120, 142, 55}, {37, 120, 142, 58}, {37, 120, 142, 150}, {82, 102, 26, 196}, {82, 102, 26, 218}, {84, 17, 62, 138}, {185, 93, 3, 106}, {185, 93, 182, 139}, {185, 253, 99, 202}}},
{Region: "Sri Lanka", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 239, 131}, {95, 181, 239, 134}, {95, 181, 239, 136}, {95, 181, 239, 137}, {95, 181, 239, 138}, {95, 181, 239, 139}, {95, 181, 239, 140}, {95, 181, 239, 141}, {95, 181, 239, 142}, {95, 181, 239, 143}}},
{Region: "Sri Lanka", Group: "Premium TCP Europe", IPs: []net.IP{{95, 181, 239, 131}, {95, 181, 239, 133}, {95, 181, 239, 134}, {95, 181, 239, 135}, {95, 181, 239, 136}, {95, 181, 239, 137}, {95, 181, 239, 140}, {95, 181, 239, 141}, {95, 181, 239, 143}, {95, 181, 239, 144}}},
{Region: "Sweden", Group: "Premium UDP Europe", IPs: []net.IP{{188, 126, 73, 202}, {188, 126, 73, 209}, {188, 126, 73, 215}, {188, 126, 73, 221}, {195, 246, 120, 150}, {195, 246, 120, 156}, {195, 246, 120, 160}, {195, 246, 120, 169}, {195, 246, 120, 170}, {195, 246, 120, 173}}},
{Region: "Sweden", Group: "Premium TCP Europe", IPs: []net.IP{{188, 126, 73, 204}, {188, 126, 73, 214}, {188, 126, 73, 218}, {188, 126, 73, 221}, {195, 246, 120, 145}, {195, 246, 120, 149}, {195, 246, 120, 151}, {195, 246, 120, 154}, {195, 246, 120, 171}, {195, 246, 120, 179}}},
{Region: "Switzerland", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 52, 11}, {84, 17, 52, 12}, {84, 17, 52, 22}, {84, 17, 52, 49}, {84, 17, 52, 55}, {84, 17, 52, 62}, {84, 17, 52, 85}, {185, 32, 222, 13}, {185, 189, 150, 61}, {185, 189, 150, 73}}},
{Region: "Switzerland", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 52, 20}, {84, 17, 52, 33}, {84, 17, 52, 38}, {84, 17, 52, 51}, {84, 17, 52, 69}, {84, 17, 52, 74}, {185, 32, 222, 16}, {185, 32, 222, 118}, {185, 32, 222, 120}, {195, 225, 118, 52}}},
{Region: "Taiwan", Group: "Premium TCP Asia", IPs: []net.IP{{45, 133, 181, 102}, {45, 133, 181, 103}, {45, 133, 181, 106}, {45, 133, 181, 108}, {45, 133, 181, 109}, {45, 133, 181, 110}, {45, 133, 181, 112}, {45, 133, 181, 116}, {45, 133, 181, 120}, {45, 133, 181, 123}}},
{Region: "Taiwan", Group: "Premium UDP Asia", IPs: []net.IP{{45, 133, 181, 99}, {45, 133, 181, 101}, {45, 133, 181, 105}, {45, 133, 181, 110}, {45, 133, 181, 111}, {45, 133, 181, 114}, {45, 133, 181, 116}, {45, 133, 181, 117}, {45, 133, 181, 121}, {45, 133, 181, 123}}},
{Region: "Thailand", Group: "Premium UDP Asia", IPs: []net.IP{{119, 59, 121, 163}, {119, 59, 121, 165}, {119, 59, 121, 166}, {119, 59, 121, 167}, {119, 59, 121, 168}, {119, 59, 121, 169}, {119, 59, 121, 170}, {119, 59, 121, 172}, {119, 59, 121, 173}, {119, 59, 121, 175}}},
{Region: "Thailand", Group: "Premium TCP Asia", IPs: []net.IP{{119, 59, 98, 213}, {119, 59, 98, 244}, {119, 59, 121, 163}, {119, 59, 121, 164}, {119, 59, 121, 166}, {119, 59, 121, 169}, {119, 59, 121, 170}, {119, 59, 121, 171}, {119, 59, 121, 172}, {119, 59, 121, 175}}},
{Region: "Turkey", Group: "Premium TCP Europe", IPs: []net.IP{{188, 213, 34, 3}, {188, 213, 34, 6}, {188, 213, 34, 10}, {188, 213, 34, 19}, {188, 213, 34, 24}, {188, 213, 34, 28}, {188, 213, 34, 37}, {188, 213, 34, 43}, {188, 213, 34, 104}, {188, 213, 34, 109}}},
{Region: "Turkey", Group: "Premium UDP Europe", IPs: []net.IP{{188, 213, 34, 14}, {188, 213, 34, 22}, {188, 213, 34, 26}, {188, 213, 34, 27}, {188, 213, 34, 30}, {188, 213, 34, 39}, {188, 213, 34, 42}, {188, 213, 34, 43}, {188, 213, 34, 100}, {188, 213, 34, 106}}},
{Region: "Ukraine", Group: "Premium TCP Europe", IPs: []net.IP{{31, 28, 161, 21}, {31, 28, 163, 40}, {31, 28, 163, 43}, {31, 28, 163, 50}, {62, 149, 7, 165}, {62, 149, 7, 166}, {62, 149, 7, 173}, {62, 149, 29, 36}, {62, 149, 29, 48}, {62, 149, 29, 56}}},
{Region: "Ukraine", Group: "Premium UDP Europe", IPs: []net.IP{{31, 28, 161, 20}, {31, 28, 163, 35}, {31, 28, 163, 40}, {31, 28, 163, 42}, {31, 28, 163, 52}, {31, 28, 163, 55}, {62, 149, 7, 172}, {62, 149, 7, 173}, {62, 149, 29, 37}, {62, 149, 29, 58}}},
{Region: "United Arab Emirates", Group: "Premium TCP Europe", IPs: []net.IP{{217, 138, 193, 179}, {217, 138, 193, 180}, {217, 138, 193, 182}, {217, 138, 193, 184}, {217, 138, 193, 185}, {217, 138, 193, 186}, {217, 138, 193, 187}, {217, 138, 193, 188}, {217, 138, 193, 189}, {217, 138, 193, 190}}},
{Region: "United Arab Emirates", Group: "Premium UDP Europe", IPs: []net.IP{{217, 138, 193, 179}, {217, 138, 193, 180}, {217, 138, 193, 182}, {217, 138, 193, 183}, {217, 138, 193, 184}, {217, 138, 193, 185}, {217, 138, 193, 186}, {217, 138, 193, 187}, {217, 138, 193, 188}, {217, 138, 193, 189}}},
{Region: "United Kingdom", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 159, 101}, {37, 235, 96, 9}, {81, 92, 206, 164}, {81, 92, 206, 169}, {84, 17, 51, 97}, {84, 17, 51, 123}, {89, 238, 167, 85}, {89, 238, 167, 91}, {109, 169, 14, 97}, {141, 98, 100, 73}}},
{Region: "United Kingdom", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 133, 165}, {37, 120, 159, 81}, {37, 235, 96, 9}, {84, 17, 51, 44}, {84, 17, 51, 107}, {89, 238, 167, 39}, {89, 238, 167, 54}, {143, 244, 39, 135}, {143, 244, 39, 221}, {143, 244, 39, 232}}},
{Region: "United States", Group: "Premium UDP USA", IPs: []net.IP{{23, 105, 161, 116}, {143, 244, 51, 84}, {156, 146, 37, 43}, {156, 146, 37, 73}, {156, 146, 37, 100}, {156, 146, 37, 103}, {156, 146, 51, 20}, {156, 146, 51, 103}, {156, 146, 51, 128}, {156, 146, 59, 172}}},
{Region: "United States", Group: "Premium TCP USA", IPs: []net.IP{{89, 187, 171, 139}, {89, 187, 171, 161}, {89, 187, 182, 38}, {143, 244, 51, 111}, {156, 146, 37, 101}, {156, 146, 37, 123}, {156, 146, 49, 133}, {156, 146, 51, 103}, {156, 146, 51, 146}, {185, 242, 5, 115}}},
{Region: "Venezuela", Group: "Premium TCP USA", IPs: []net.IP{{95, 181, 237, 131}, {95, 181, 237, 134}, {95, 181, 237, 136}, {95, 181, 237, 137}, {95, 181, 237, 138}, {95, 181, 237, 139}, {95, 181, 237, 140}, {95, 181, 237, 141}, {95, 181, 237, 142}, {95, 181, 237, 143}}},
{Region: "Venezuela", Group: "Premium UDP USA", IPs: []net.IP{{95, 181, 237, 131}, {95, 181, 237, 132}, {95, 181, 237, 135}, {95, 181, 237, 136}, {95, 181, 237, 137}, {95, 181, 237, 138}, {95, 181, 237, 140}, {95, 181, 237, 142}, {95, 181, 237, 143}, {95, 181, 237, 144}}},
{Region: "Vietnam", Group: "Premium TCP Asia", IPs: []net.IP{{188, 214, 152, 99}, {188, 214, 152, 100}, {188, 214, 152, 101}, {188, 214, 152, 102}, {188, 214, 152, 103}, {188, 214, 152, 105}, {188, 214, 152, 106}, {188, 214, 152, 107}, {188, 214, 152, 108}, {188, 214, 152, 110}}},
{Region: "Vietnam", Group: "Premium UDP Asia", IPs: []net.IP{{188, 214, 152, 99}, {188, 214, 152, 100}, {188, 214, 152, 102}, {188, 214, 152, 103}, {188, 214, 152, 104}, {188, 214, 152, 105}, {188, 214, 152, 106}, {188, 214, 152, 108}, {188, 214, 152, 109}, {188, 214, 152, 110}}},
{Region: "South Africa", Group: "Premium UDP Asia", IPs: []net.IP{{154, 127, 50, 212}, {154, 127, 50, 215}, {154, 127, 50, 218}, {154, 127, 50, 219}, {154, 127, 50, 222}, {154, 127, 60, 195}, {154, 127, 60, 198}, {154, 127, 60, 201}, {154, 127, 60, 204}, {154, 127, 60, 205}}},
{Region: "South Africa", Group: "Premium TCP Asia", IPs: []net.IP{{154, 127, 50, 212}, {154, 127, 50, 213}, {154, 127, 50, 216}, {154, 127, 50, 217}, {154, 127, 60, 195}, {154, 127, 60, 199}, {154, 127, 60, 201}, {154, 127, 60, 203}, {154, 127, 60, 205}, {154, 127, 60, 206}}},
{Region: "South Africa", Group: "Premium UDP Europe", IPs: []net.IP{{197, 85, 7, 26}, {197, 85, 7, 27}, {197, 85, 7, 28}, {197, 85, 7, 29}, {197, 85, 7, 30}, {197, 85, 7, 31}, {197, 85, 7, 131}, {197, 85, 7, 132}, {197, 85, 7, 133}, {197, 85, 7, 134}}},
{Region: "Spain", Group: "Premium TCP Europe", IPs: []net.IP{{37, 120, 142, 39}, {37, 120, 142, 42}, {37, 120, 142, 51}, {37, 120, 142, 56}, {37, 120, 142, 170}, {82, 102, 26, 211}, {82, 102, 26, 212}, {82, 102, 26, 213}, {82, 102, 26, 214}, {84, 17, 62, 138}}},
{Region: "Spain", Group: "Premium UDP Europe", IPs: []net.IP{{37, 120, 142, 44}, {37, 120, 142, 59}, {37, 120, 142, 60}, {45, 128, 39, 6}, {82, 102, 26, 195}, {82, 102, 26, 198}, {84, 17, 62, 131}, {84, 17, 62, 144}, {84, 17, 62, 152}, {185, 253, 99, 201}}},
{Region: "Sri Lanka", Group: "Premium UDP Europe", IPs: []net.IP{{95, 181, 239, 132}, {95, 181, 239, 133}, {95, 181, 239, 135}, {95, 181, 239, 136}, {95, 181, 239, 137}, {95, 181, 239, 138}, {95, 181, 239, 139}, {95, 181, 239, 141}, {95, 181, 239, 143}, {95, 181, 239, 144}}},
{Region: "Sri Lanka", Group: "Premium TCP Europe", IPs: []net.IP{{95, 181, 239, 131}, {95, 181, 239, 132}, {95, 181, 239, 133}, {95, 181, 239, 135}, {95, 181, 239, 138}, {95, 181, 239, 139}, {95, 181, 239, 140}, {95, 181, 239, 141}, {95, 181, 239, 142}, {95, 181, 239, 143}}},
{Region: "Sweden", Group: "Premium UDP Europe", IPs: []net.IP{{188, 126, 73, 206}, {188, 126, 73, 221}, {188, 126, 73, 222}, {188, 126, 79, 15}, {188, 126, 79, 16}, {188, 126, 79, 26}, {188, 126, 79, 30}, {195, 246, 120, 171}, {195, 246, 120, 175}, {195, 246, 120, 176}}},
{Region: "Sweden", Group: "Premium TCP Europe", IPs: []net.IP{{188, 126, 73, 197}, {188, 126, 73, 200}, {188, 126, 73, 203}, {188, 126, 79, 13}, {188, 126, 79, 14}, {188, 126, 79, 16}, {188, 126, 79, 24}, {188, 126, 79, 25}, {188, 126, 79, 28}, {195, 246, 120, 172}}},
{Region: "Switzerland", Group: "Premium TCP Europe", IPs: []net.IP{{84, 17, 52, 18}, {84, 17, 52, 19}, {84, 17, 52, 24}, {84, 17, 52, 39}, {84, 17, 52, 78}, {84, 17, 52, 82}, {185, 32, 222, 5}, {195, 225, 118, 36}, {195, 225, 118, 42}, {195, 225, 118, 60}}},
{Region: "Switzerland", Group: "Premium UDP Europe", IPs: []net.IP{{84, 17, 52, 14}, {84, 17, 52, 39}, {84, 17, 52, 42}, {84, 17, 52, 50}, {84, 17, 52, 55}, {84, 17, 52, 84}, {185, 32, 222, 17}, {185, 32, 222, 106}, {185, 189, 150, 53}, {195, 225, 118, 57}}},
{Region: "Taiwan", Group: "Premium UDP Asia", IPs: []net.IP{{45, 133, 181, 106}, {45, 133, 181, 107}, {45, 133, 181, 111}, {45, 133, 181, 112}, {45, 133, 181, 113}, {45, 133, 181, 116}, {45, 133, 181, 119}, {45, 133, 181, 120}, {45, 133, 181, 122}, {45, 133, 181, 126}}},
{Region: "Taiwan", Group: "Premium TCP Asia", IPs: []net.IP{{45, 133, 181, 99}, {45, 133, 181, 100}, {45, 133, 181, 105}, {45, 133, 181, 108}, {45, 133, 181, 113}, {45, 133, 181, 116}, {45, 133, 181, 119}, {45, 133, 181, 120}, {45, 133, 181, 121}, {45, 133, 181, 125}}},
{Region: "Thailand", Group: "Premium TCP Asia", IPs: []net.IP{{146, 70, 13, 3}, {146, 70, 13, 6}, {146, 70, 13, 7}, {146, 70, 13, 8}, {146, 70, 13, 9}, {146, 70, 13, 10}, {146, 70, 13, 12}, {146, 70, 13, 13}, {146, 70, 13, 14}, {146, 70, 13, 16}}},
{Region: "Turkey", Group: "Premium UDP Europe", IPs: []net.IP{{188, 213, 34, 5}, {188, 213, 34, 7}, {188, 213, 34, 10}, {188, 213, 34, 14}, {188, 213, 34, 15}, {188, 213, 34, 23}, {188, 213, 34, 26}, {188, 213, 34, 27}, {188, 213, 34, 104}, {188, 213, 34, 106}}},
{Region: "Ukraine", Group: "Premium UDP Europe", IPs: []net.IP{{31, 28, 163, 36}, {31, 28, 163, 50}, {31, 28, 163, 51}, {31, 28, 163, 59}, {62, 149, 7, 162}, {62, 149, 7, 163}, {62, 149, 29, 35}, {62, 149, 29, 37}, {62, 149, 29, 45}, {62, 149, 29, 55}}},
{Region: "United Arab Emirates", Group: "Premium TCP Europe", IPs: []net.IP{{217, 138, 193, 179}, {217, 138, 193, 180}, {217, 138, 193, 182}, {217, 138, 193, 183}, {217, 138, 193, 184}, {217, 138, 193, 185}, {217, 138, 193, 187}, {217, 138, 193, 188}, {217, 138, 193, 189}, {217, 138, 193, 190}}},
{Region: "United Arab Emirates", Group: "Premium UDP Europe", IPs: []net.IP{{217, 138, 193, 179}, {217, 138, 193, 180}, {217, 138, 193, 181}, {217, 138, 193, 182}, {217, 138, 193, 183}, {217, 138, 193, 184}, {217, 138, 193, 185}, {217, 138, 193, 186}, {217, 138, 193, 188}, {217, 138, 193, 189}}},
{Region: "United Kingdom", Group: "Premium UDP Europe", IPs: []net.IP{{45, 133, 172, 140}, {45, 133, 172, 157}, {95, 154, 200, 161}, {95, 154, 200, 166}, {95, 154, 200, 168}, {181, 215, 176, 138}, {181, 215, 176, 155}, {181, 215, 176, 243}, {191, 101, 209, 147}, {194, 110, 13, 103}}},
{Region: "United Kingdom", Group: "Premium TCP Europe", IPs: []net.IP{{45, 133, 172, 112}, {45, 133, 172, 113}, {45, 133, 172, 134}, {45, 133, 172, 140}, {45, 133, 173, 47}, {95, 154, 200, 173}, {181, 215, 176, 157}, {191, 101, 209, 70}, {191, 101, 209, 93}, {194, 110, 13, 119}}},
{Region: "United States", Group: "Premium TCP USA", IPs: []net.IP{{23, 82, 9, 164}, {23, 105, 161, 115}, {23, 105, 191, 51}, {45, 89, 173, 214}, {84, 17, 35, 55}, {84, 17, 40, 73}, {84, 17, 40, 99}, {156, 146, 37, 98}, {156, 146, 59, 66}, {212, 102, 41, 28}}},
{Region: "Venezuela", Group: "Premium UDP USA", IPs: []net.IP{{95, 181, 237, 131}, {95, 181, 237, 132}, {95, 181, 237, 133}, {95, 181, 237, 134}, {95, 181, 237, 135}, {95, 181, 237, 136}, {95, 181, 237, 137}, {95, 181, 237, 139}, {95, 181, 237, 140}, {95, 181, 237, 143}}},
{Region: "Venezuela", Group: "Premium TCP USA", IPs: []net.IP{{95, 181, 237, 132}, {95, 181, 237, 133}, {95, 181, 237, 134}, {95, 181, 237, 135}, {95, 181, 237, 136}, {95, 181, 237, 138}, {95, 181, 237, 139}, {95, 181, 237, 142}, {95, 181, 237, 143}, {95, 181, 237, 144}}},
{Region: "Vietnam", Group: "Premium UDP Asia", IPs: []net.IP{{188, 214, 152, 99}, {188, 214, 152, 100}, {188, 214, 152, 101}, {188, 214, 152, 102}, {188, 214, 152, 103}, {188, 214, 152, 104}, {188, 214, 152, 105}, {188, 214, 152, 107}, {188, 214, 152, 108}, {188, 214, 152, 110}}},
{Region: "Vietnam", Group: "Premium TCP Asia", IPs: []net.IP{{188, 214, 152, 99}, {188, 214, 152, 100}, {188, 214, 152, 101}, {188, 214, 152, 102}, {188, 214, 152, 103}, {188, 214, 152, 104}, {188, 214, 152, 106}, {188, 214, 152, 107}, {188, 214, 152, 108}, {188, 214, 152, 109}}},
}
}

View File

@@ -38,14 +38,15 @@ func FastestvpnServers() []models.FastestvpnServer {
{Country: "Australia", Hostname: "au-sd-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{139, 99, 149, 10}}},
{Country: "Australia", Hostname: "au2-sd-ovtcp-01.jumptoserver.com", UDP: false, TCP: true, IPs: []net.IP{{139, 99, 131, 126}}},
{Country: "Australia", Hostname: "au2-sd-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{139, 99, 131, 126}}},
{Country: "Austria", Hostname: "at.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{86, 107, 21, 146}}},
{Country: "Austria", Hostname: "at.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{185, 210, 219, 86}}},
{Country: "Belgium", Hostname: "bel1.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{217, 138, 211, 67}}},
{Country: "Belgium", Hostname: "bel2.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{217, 138, 211, 68}}},
{Country: "Belgium", Hostname: "bel3.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{217, 138, 211, 69}}},
{Country: "Brazil", Hostname: "br-jp-ovtcp-01.jumptoserver.com", UDP: false, TCP: true, IPs: []net.IP{{45, 179, 88, 31}}},
{Country: "Brazil", Hostname: "br-jp-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{45, 179, 88, 31}}},
{Country: "Bulgaria", Hostname: "bg.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{37, 46, 114, 46}}},
{Country: "Canada", Hostname: "canada.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{158, 69, 26, 75}}},
{Country: "Canada", Hostname: "ca1.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{192, 99, 103, 48}}},
{Country: "Canada", Hostname: "ca2.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{192, 99, 103, 49}}},
{Country: "Czechia", Hostname: "cz-pr-ovtcp-01.jumptoserver.com", UDP: false, TCP: true, IPs: []net.IP{{185, 216, 35, 218}}},
{Country: "Czechia", Hostname: "cz-pr-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{185, 216, 35, 218}}},
{Country: "Denmark", Hostname: "dk.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{185, 245, 84, 70}}},
@@ -56,8 +57,10 @@ func FastestvpnServers() []models.FastestvpnServer {
{Country: "Germany", Hostname: "de1.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{83, 143, 245, 254}}},
{Country: "Hong.Kong", Hostname: "hk-ovtcp-01.jumptoserver.com", UDP: false, TCP: true, IPs: []net.IP{{64, 120, 88, 115}}},
{Country: "Hong.Kong", Hostname: "hk-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{64, 120, 88, 115}}},
{Country: "India", Hostname: "in41.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{101, 53, 128, 39}}},
{Country: "India", Hostname: "in45.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{101, 53, 128, 148}}},
{Country: "India", Hostname: "in50.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{103, 104, 74, 32}}},
{Country: "India-Stream", Hostname: "in-stream.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{103, 104, 74, 30}}},
{Country: "India-stream", Hostname: "in-stream.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{103, 104, 74, 30}}},
{Country: "Italy", Hostname: "it.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{37, 120, 207, 90}}},
{Country: "Japan", Hostname: "jp-tk-ovtcp-01.jumptoserver.com", UDP: false, TCP: true, IPs: []net.IP{{202, 239, 38, 147}}},
{Country: "Japan", Hostname: "jp-tk-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{202, 239, 38, 147}}},
@@ -94,24 +97,25 @@ func FastestvpnServers() []models.FastestvpnServer {
{Country: "US-Atlanta", Hostname: "us-at-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{23, 82, 10, 205}}},
{Country: "US-Charlotte", Hostname: "us-cf-ovtcp-01.jumptoserver.com", UDP: false, TCP: true, IPs: []net.IP{{192, 154, 253, 6}}},
{Country: "US-Charlotte", Hostname: "us-cf-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{192, 154, 253, 6}}},
{Country: "US-Chicago", Hostname: "us-ch1.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{174, 34, 154, 209}}},
{Country: "US-Chicago", Hostname: "us-ch2.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{174, 34, 154, 207}}},
{Country: "US-Chicago", Hostname: "us-ch1.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{38, 98, 159, 11}}},
{Country: "US-Chicago", Hostname: "us-ch2.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{38, 98, 159, 10}}},
{Country: "US-Dallas", Hostname: "us-dl-ovtcp-01.jumptoserver.com", UDP: false, TCP: true, IPs: []net.IP{{74, 63, 219, 202}}},
{Country: "US-Dallas", Hostname: "us-dl-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{74, 63, 219, 202}}},
{Country: "US-Denver", Hostname: "us-dv1.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{173, 248, 157, 107}}},
{Country: "US-Los.Angeles", Hostname: "us-la-ovtcp-01.jumptoserver.com", UDP: false, TCP: true, IPs: []net.IP{{64, 31, 35, 222}}},
{Country: "US-Los.Angeles", Hostname: "us-la-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{64, 31, 35, 222}}},
{Country: "US-Miami", Hostname: "us-mi-ovtcp-01.jumptoserver.com", UDP: false, TCP: true, IPs: []net.IP{{162, 255, 138, 231}}},
{Country: "US-Miami", Hostname: "us-mi-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{162, 255, 138, 232}}},
{Country: "US-Miami", Hostname: "usmia.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{162, 255, 138, 226}}},
{Country: "US-Netflix", Hostname: "netflix.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{37, 59, 172, 215}}},
{Country: "US-New.York", Hostname: "us-ny-ovtcp-01.jumptoserver.com", UDP: false, TCP: true, IPs: []net.IP{{38, 132, 102, 107}}},
{Country: "US-New.York", Hostname: "us-ny-ovudp-01.jumptoserver.com", UDP: true, TCP: false, IPs: []net.IP{{38, 132, 102, 107}}},
{Country: "US-Phoenix", Hostname: "us-ph1.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{23, 83, 184, 71}}},
{Country: "US-Phoenix", Hostname: "us-ph2.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{23, 83, 184, 72}}},
{Country: "US-Seattle", Hostname: "us-se1.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{23, 82, 33, 99}}},
{Country: "US-St.Louis", Hostname: "us-st1.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{148, 72, 173, 28}}},
{Country: "US-St.Louis", Hostname: "us-st3.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{148, 72, 173, 30}}},
{Country: "US-St.Louis", Hostname: "us-st4.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{148, 72, 173, 31}}},
{Country: "US-St.Louis", Hostname: "us-st5.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{148, 72, 173, 32}}},
{Country: "US-Washington", Hostname: "us-wt.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{23, 82, 15, 90}}},
{Country: "US-Washington", Hostname: "us-wt2.jumptoserver.com", UDP: true, TCP: true, IPs: []net.IP{{23, 82, 15, 91}}},
}
}

View File

@@ -57,7 +57,7 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Armenia", Region: "", City: "Tsaghkadzor", Hostname: "am.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 12}, {5, 62, 62, 12}}},
{Country: "Aruba", Region: "", City: "Palm Beach", Hostname: "aw.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 20}, {5, 62, 58, 20}}},
{Country: "Australia", Region: "New South Wales", City: "Sydney", Hostname: "au.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 23, 3}, {5, 62, 23, 18}}},
{Country: "Austria", Region: "Carinthia", City: "Klagenfurt", Hostname: "at.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 253, 207, 3}, {91, 132, 139, 115}, {94, 198, 41, 126}, {94, 198, 41, 142}, {185, 9, 19, 126}, {185, 183, 107, 147}}},
{Country: "Austria", Region: "Carinthia", City: "Klagenfurt", Hostname: "at.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 253, 207, 3}, {91, 132, 139, 115}, {94, 198, 41, 94}, {94, 198, 41, 110}, {185, 9, 19, 126}, {185, 183, 107, 163}, {185, 210, 219, 99}, {185, 244, 212, 35}, {185, 244, 212, 190}}},
{Country: "Azerbaijan", Region: "", City: "Qusar", Hostname: "az.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 16}, {5, 62, 62, 16}}},
{Country: "Bahamas", Region: "", City: "Freeport", Hostname: "bs.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 24}, {5, 62, 58, 24}}},
{Country: "Bahrain", Region: "", City: "Manama", Hostname: "bh.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 20}, {5, 62, 62, 20}}},
@@ -72,7 +72,7 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Bolivia", Region: "", City: "Santa Cruz", Hostname: "bo.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 40}, {5, 62, 58, 40}}},
{Country: "Bosnia", Region: "", City: "Sarajevo", Hostname: "ba.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 40}, {5, 62, 62, 40}}},
{Country: "Botswana", Region: "", City: "Gaborone", Hostname: "bw.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 44}, {5, 62, 62, 44}}},
{Country: "Brazil", Region: "", City: "Joao Pessoa", Hostname: "br.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 51, 61}, {5, 62, 51, 101}, {5, 62, 51, 151}, {191, 96, 4, 167}, {191, 96, 5, 163}, {191, 96, 9, 143}}},
{Country: "Brazil", Region: "", City: "Joao Pessoa", Hostname: "br.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 51, 51}, {5, 62, 51, 81}, {5, 62, 51, 111}, {45, 231, 207, 31}, {181, 215, 238, 207}, {191, 96, 13, 175}}},
{Country: "British Virgin Islands", Region: "", City: "Tortola", Hostname: "vg.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 44}, {5, 62, 58, 44}}},
{Country: "Brunei", Region: "", City: "Jerudong", Hostname: "bn.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 48}, {5, 62, 62, 48}}},
{Country: "Bulgaria", Region: "", City: "Sofia", Hostname: "bg.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 52}, {5, 62, 62, 52}}},
@@ -80,7 +80,7 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Burundi", Region: "", City: "Bujumbura", Hostname: "bi.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 60}, {5, 62, 62, 60}}},
{Country: "Cambodia", Region: "", City: "Phnom Penh", Hostname: "kh.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 64}, {5, 62, 62, 64}}},
{Country: "Cameroon", Region: "", City: "Yaounde", Hostname: "cm.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 68}, {5, 62, 62, 68}}},
{Country: "Canada", Region: "British Columbia", City: "Vancouver", Hostname: "ca.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{51, 161, 54, 15}, {51, 161, 66, 111}, {144, 217, 105, 207}, {192, 99, 89, 207}, {192, 99, 110, 143}, {198, 27, 103, 191}}},
{Country: "Canada", Region: "British Columbia", City: "Vancouver", Hostname: "ca.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{51, 161, 54, 15}, {51, 161, 66, 111}, {54, 39, 219, 127}, {144, 217, 105, 207}, {158, 69, 234, 207}, {192, 99, 89, 207}, {192, 99, 110, 159}, {198, 27, 103, 191}}},
{Country: "Cape Verde", Region: "", City: "Cidade Velha", Hostname: "cv.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 72}, {5, 62, 62, 72}}},
{Country: "Cayman Islands", Region: "", City: "Spot Bay", Hostname: "ky.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 48}, {5, 62, 58, 48}}},
{Country: "Central African Republic", Region: "", City: "Bangassou", Hostname: "cf.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 76}, {5, 62, 62, 76}}},
@@ -98,8 +98,8 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Croatia", Region: "", City: "Zagreb", Hostname: "hr.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 228}, {5, 62, 63, 224}}},
{Country: "Cuba", Region: "", City: "Havana", Hostname: "cu.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 72}, {5, 62, 58, 68}}},
{Country: "Cyprus", Region: "", City: "Limassol", Hostname: "cy.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 108}, {5, 62, 62, 104}}},
{Country: "Czech Republic", Region: "", City: "Prague", Hostname: "cz.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 246, 210, 130}, {185, 246, 210, 146}, {185, 246, 210, 162}, {185, 246, 210, 194}, {212, 102, 38, 186}}},
{Country: "Denmark", Region: "", City: "Copenhagen", Hostname: "dk.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{2, 58, 46, 195}, {2, 58, 46, 211}, {95, 174, 65, 158}, {185, 212, 169, 190}, {185, 212, 169, 206}, {185, 212, 169, 222}}},
{Country: "Czech Republic", Region: "", City: "Prague", Hostname: "cz.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 246, 210, 130}, {185, 246, 210, 146}, {185, 246, 210, 162}, {185, 246, 210, 178}, {185, 246, 210, 194}, {212, 102, 38, 173}, {212, 102, 38, 186}}},
{Country: "Denmark", Region: "", City: "Copenhagen", Hostname: "dk.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{2, 58, 46, 195}, {2, 58, 46, 211}, {37, 120, 232, 110}, {37, 120, 232, 126}, {37, 120, 232, 142}, {185, 212, 169, 174}, {185, 212, 169, 206}, {185, 212, 169, 222}}},
{Country: "Dominica", Region: "", City: "Marigot", Hostname: "dm.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 76}, {5, 62, 58, 72}}},
{Country: "Dominican Republic", Region: "", City: "Punta Cana", Hostname: "do.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 80}, {5, 62, 58, 76}}},
{Country: "Ecuador", Region: "", City: "Quito", Hostname: "ec.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 84}, {5, 62, 58, 80}}},
@@ -112,8 +112,8 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Falkland Islands", Region: "", City: "Stanley", Hostname: "fk.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 92}, {5, 62, 58, 88}}},
{Country: "Faroe Islands", Region: "", City: "Torshavn", Hostname: "fo.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 132}, {5, 62, 62, 128}}},
{Country: "Fiji", Region: "", City: "Nadi", Hostname: "fj.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 96}, {5, 62, 58, 92}}},
{Country: "Finland", Region: "", City: "Helsinki", Hostname: "fi.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 77, 217, 16}, {185, 77, 217, 46}, {185, 77, 217, 76}, {185, 77, 217, 91}, {185, 77, 217, 106}}},
{Country: "France", Region: "", City: "Paris", Hostname: "fr.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{62, 210, 15, 189}, {84, 17, 43, 77}, {84, 17, 43, 116}, {163, 172, 122, 138}, {185, 93, 2, 82}, {212, 83, 167, 108}, {212, 129, 37, 89}, {212, 129, 49, 206}}},
{Country: "Finland", Region: "", City: "Helsinki", Hostname: "fi.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 77, 217, 16}, {185, 77, 217, 31}, {185, 77, 217, 46}, {185, 77, 217, 76}, {185, 77, 217, 91}, {185, 77, 217, 106}}},
{Country: "France", Region: "", City: "Paris", Hostname: "fr.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{84, 17, 43, 90}, {84, 17, 43, 116}, {185, 93, 2, 50}, {185, 93, 2, 66}, {185, 93, 2, 82}, {185, 93, 2, 98}, {195, 154, 48, 59}, {212, 83, 153, 211}, {212, 83, 164, 190}, {212, 83, 188, 191}, {212, 129, 37, 90}, {212, 129, 55, 206}}},
{Country: "Gabon", Region: "", City: "Libreville", Hostname: "ga.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 136}, {5, 62, 62, 132}}},
{Country: "Gambia", Region: "", City: "Serekunda", Hostname: "gm.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 140}, {5, 62, 62, 136}}},
{Country: "Georgia", Region: "", City: "Tbilisi", Hostname: "ge.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 144}, {5, 62, 62, 140}}},
@@ -131,15 +131,15 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Guyana", Region: "", City: "Barima-Waini", Hostname: "gy.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 116}, {5, 62, 58, 108}}},
{Country: "Haiti", Region: "", City: "Cap-Haitien", Hostname: "ht.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 120}, {5, 62, 58, 112}}},
{Country: "Honduras", Region: "", City: "Tegucigalpa", Hostname: "hn.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 124}, {5, 62, 58, 116}}},
{Country: "Hungary", Region: "", City: "Budapest", Hostname: "hu.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{37, 120, 144, 78}, {37, 120, 144, 94}, {185, 128, 26, 113}, {185, 128, 26, 126}}},
{Country: "Hungary", Region: "", City: "Budapest", Hostname: "hu.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{37, 120, 144, 78}, {37, 120, 144, 94}, {185, 94, 190, 174}, {185, 128, 26, 113}, {185, 128, 26, 126}, {185, 252, 223, 62}, {185, 252, 223, 78}}},
{Country: "Iceland", Region: "", City: "Reykjavik", Hostname: "is.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{82, 221, 112, 243}, {82, 221, 112, 244}}},
{Country: "India", Region: "Maharashtra", City: "Mumbai", Hostname: "in.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 34, 8}, {5, 62, 34, 12}}},
{Country: "Indonesia", Region: "", City: "Jakarta", Hostname: "id.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 34, 16}, {5, 62, 34, 20}}},
{Country: "Iran", Region: "", City: "Isfahan", Hostname: "ir.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 176}, {5, 62, 62, 168}}},
{Country: "Iraq", Region: "", City: "Baghdad", Hostname: "iq.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 180}, {5, 62, 62, 172}}},
{Country: "Ireland", Region: "", City: "Dublin", Hostname: "ie.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{78, 153, 199, 5}, {78, 153, 199, 29}, {78, 153, 199, 243}, {78, 153, 199, 254}}},
{Country: "Israel", Region: "", City: "Petah Tikva", Hostname: "il.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 185, 132, 62}, {185, 185, 132, 110}, {185, 185, 133, 78}, {185, 185, 133, 190}}},
{Country: "Italy", Region: "Pordenone", City: "Porcia", Hostname: "it.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{45, 87, 184, 15}, {45, 87, 184, 47}, {45, 87, 184, 63}, {45, 87, 184, 79}, {84, 17, 58, 168}, {84, 17, 58, 213}, {84, 17, 59, 45}, {84, 17, 59, 59}}},
{Country: "Israel", Region: "", City: "Petah Tikva", Hostname: "il.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 185, 132, 62}, {185, 185, 132, 110}, {185, 185, 133, 190}}},
{Country: "Italy", Region: "Pordenone", City: "Porcia", Hostname: "it.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{45, 87, 184, 15}, {45, 87, 184, 47}, {84, 17, 58, 168}, {84, 17, 58, 213}, {84, 17, 59, 45}, {84, 17, 59, 59}}},
{Country: "Jamaica", Region: "", City: "Montego Bay", Hostname: "jm.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 128}, {5, 62, 58, 120}}},
{Country: "Japan", Region: "", City: "Tokyo", Hostname: "jp.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{156, 146, 35, 162}, {156, 146, 35, 184}, {156, 146, 35, 185}, {212, 102, 51, 235}}},
{Country: "Jordan", Region: "", City: "Amman", Hostname: "jo.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 188}, {5, 62, 62, 180}}},
@@ -156,17 +156,17 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Libya", Region: "", City: "Ghadames", Hostname: "ly.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 228}, {5, 62, 62, 220}}},
{Country: "Liechtenstein", Region: "", City: "Vaduz", Hostname: "li.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 232}, {5, 62, 62, 224}}},
{Country: "Lithuania", Region: "", City: "Siauliai", Hostname: "lt.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 236}, {5, 62, 62, 228}}},
{Country: "Luxembourg", Region: "", City: "", Hostname: "lu.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{92, 38, 162, 148}, {92, 38, 162, 151}, {92, 38, 172, 25}}},
{Country: "Luxembourg", Region: "", City: "", Hostname: "lu.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{92, 38, 162, 123}, {92, 38, 162, 148}, {92, 38, 162, 151}, {92, 38, 172, 25}, {92, 223, 88, 149}}},
{Country: "Macau", Region: "", City: "Macau", Hostname: "mo.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 240}, {5, 62, 62, 232}}},
{Country: "Macedonia", Region: "", City: "Skopje", Hostname: "mk.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 244}, {5, 62, 62, 236}}},
{Country: "Madagascar", Region: "", City: "Antsiranana", Hostname: "mg.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 248}, {5, 62, 62, 240}}},
{Country: "Malawi", Region: "", City: "Lilongwe", Hostname: "mw.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 60, 252}, {5, 62, 62, 244}}},
{Country: "Malaysia", Region: "", City: "Kuala Lumpur", Hostname: "my.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 54, 231, 26}, {185, 54, 231, 43}, {185, 54, 231, 60}, {185, 54, 231, 77}}},
{Country: "Malaysia", Region: "", City: "Kuala Lumpur", Hostname: "my.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 54, 231, 26}, {185, 54, 231, 43}, {185, 54, 231, 60}}},
{Country: "Maldives", Region: "", City: "Male", Hostname: "mv.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 0}, {5, 62, 62, 248}}},
{Country: "Mali", Region: "", City: "Bamako", Hostname: "ml.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 4}, {5, 62, 62, 252}}},
{Country: "Malta", Region: "", City: "Cospicua", Hostname: "mt.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 8}, {5, 62, 63, 0}}},
{Country: "Mauritius", Region: "", City: "Port Louis", Hostname: "mu.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 16}, {5, 62, 63, 8}}},
{Country: "Mexico", Region: "Sinaloa", City: "Mazatlan", Hostname: "mx.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{31, 14, 72, 23}, {31, 14, 72, 30}, {31, 14, 72, 44}, {31, 14, 72, 51}}},
{Country: "Mexico", Region: "Sinaloa", City: "Mazatlan", Hostname: "mx.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{31, 14, 72, 16}, {31, 14, 72, 23}, {31, 14, 72, 30}, {31, 14, 72, 44}, {31, 14, 72, 51}}},
{Country: "Moldova", Region: "", City: "Chisinau", Hostname: "md.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 20}, {5, 62, 63, 12}}},
{Country: "Monaco", Region: "", City: "Monaco", Hostname: "mc.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 24}, {5, 62, 63, 16}}},
{Country: "Mongolia", Region: "", City: "Suhbaatar", Hostname: "mn.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 28}, {5, 62, 63, 20}}},
@@ -178,7 +178,7 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Namibia", Region: "", City: "Windhoek", Hostname: "na.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 48}, {5, 62, 63, 40}}},
{Country: "Nauru", Region: "", City: "Anabar", Hostname: "nr.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 140}, {5, 62, 58, 132}}},
{Country: "Nepal", Region: "", City: "Janakpur", Hostname: "np.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 52}, {5, 62, 63, 44}}},
{Country: "Netherlands", Region: "", City: "Amsterdam", Hostname: "nl.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{84, 17, 46, 134}, {84, 17, 46, 158}, {84, 17, 46, 182}, {84, 17, 46, 251}}},
{Country: "Netherlands", Region: "", City: "Amsterdam", Hostname: "nl.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{84, 17, 46, 134}, {84, 17, 46, 158}, {84, 17, 46, 182}, {84, 17, 46, 206}, {84, 17, 46, 251}}},
{Country: "New Caledonia", Region: "", City: "Noumea", Hostname: "nc.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 144}, {5, 62, 58, 136}}},
{Country: "New Zealand", Region: "", City: "Auckland", Hostname: "nz.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{103, 76, 164, 3}, {103, 76, 164, 19}, {103, 108, 94, 243}, {103, 231, 91, 131}}},
{Country: "Nicaragua", Region: "", City: "Managua", Hostname: "ni.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 148}, {5, 62, 58, 140}}},
@@ -187,7 +187,7 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Niue", Region: "", City: "Alofi", Hostname: "nu.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 152}, {5, 62, 58, 144}}},
{Country: "Norfolk Island", Region: "", City: "Kingston", Hostname: "nf.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 156}, {5, 62, 58, 148}}},
{Country: "North Korea", Region: "", City: "Manpo", Hostname: "kp.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 160}, {5, 62, 61, 64}}},
{Country: "Norway", Region: "", City: "Oslo", Hostname: "no.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 101, 32, 16}, {185, 101, 32, 64}, {217, 170, 202, 112}, {217, 170, 204, 160}}},
{Country: "Norway", Region: "", City: "Oslo", Hostname: "no.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 101, 32, 16}, {185, 101, 32, 48}, {185, 101, 32, 174}, {217, 170, 202, 112}, {217, 170, 204, 160}, {217, 170, 204, 223}, {217, 170, 206, 127}}},
{Country: "Oman", Region: "", City: "Salalah", Hostname: "om.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 68}, {5, 62, 63, 56}}},
{Country: "Pakistan", Region: "", City: "Karachi", Hostname: "pk.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 72}, {5, 62, 63, 60}}},
{Country: "Palau", Region: "", City: "Melekeok", Hostname: "pw.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 164}, {5, 62, 61, 76}}},
@@ -195,18 +195,18 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Panama", Region: "", City: "Panama City", Hostname: "pa.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 168}, {5, 62, 58, 152}}},
{Country: "Papua New Guinea", Region: "", City: "Alotau", Hostname: "pg.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 172}, {5, 62, 61, 84}}},
{Country: "Paraguay", Region: "", City: "Boqueron", Hostname: "py.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 176}, {5, 62, 58, 156}}},
{Country: "Peru", Region: "", City: "Cusco", Hostname: "pe.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 180}}},
{Country: "Peru", Region: "", City: "Cusco", Hostname: "pe.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 180}, {5, 62, 58, 160}}},
{Country: "Philippines", Region: "", City: "Baguio", Hostname: "ph.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 184}, {5, 62, 61, 88}}},
{Country: "Pitcairn Islands", Region: "", City: "Adamstown", Hostname: "pn.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 188}, {5, 62, 58, 164}}},
{Country: "Poland", Region: "", City: "Warsaw", Hostname: "pl.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 246, 208, 61}, {185, 246, 208, 130}, {185, 246, 208, 157}}},
{Country: "Portugal", Region: "", City: "Leiria", Hostname: "pt.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{91, 205, 230, 239}, {91, 205, 230, 255}, {91, 250, 240, 193}, {91, 250, 240, 209}, {91, 250, 240, 225}, {195, 158, 248, 94}}},
{Country: "Poland", Region: "", City: "Warsaw", Hostname: "pl.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{84, 17, 55, 13}, {84, 17, 55, 26}, {185, 246, 208, 34}, {185, 246, 208, 61}, {185, 246, 208, 130}, {185, 246, 208, 157}}},
{Country: "Portugal", Region: "", City: "Leiria", Hostname: "pt.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{91, 205, 230, 239}, {91, 205, 230, 255}, {91, 250, 240, 113}, {91, 250, 240, 193}, {91, 250, 240, 209}, {91, 250, 240, 225}, {195, 158, 248, 46}, {195, 158, 248, 94}}},
{Country: "Puerto Rico", Region: "", City: "San Juan", Hostname: "pr.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 192}, {5, 62, 58, 168}}},
{Country: "Qatar", Region: "", City: "Doha", Hostname: "qa.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 92}, {5, 62, 63, 68}}},
{Country: "Republicof Djibouti", Region: "", City: "Djibouti", Hostname: "dj.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 96}, {5, 62, 63, 72}}},
{Country: "Republicof Singapore", Region: "", City: "Singapore", Hostname: "sg.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 35, 159}, {5, 62, 35, 175}, {89, 187, 163, 226}, {89, 187, 163, 250}, {92, 223, 85, 21}, {92, 223, 85, 22}}},
{Country: "Republicof Singapore", Region: "", City: "Singapore", Hostname: "sg.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 35, 135}, {5, 62, 35, 143}, {5, 62, 35, 159}, {5, 62, 35, 167}, {5, 62, 35, 175}, {92, 223, 85, 21}, {92, 223, 85, 22}}},
{Country: "Republicofthe Congo", Region: "", City: "Brazzaville", Hostname: "cg.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 100}, {5, 62, 63, 76}}},
{Country: "Romania", Region: "", City: "Bucharest", Hostname: "ro.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 104}, {5, 62, 63, 80}}},
{Country: "Russia", Region: "", City: "Moscow", Hostname: "ru.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 19, 39}, {5, 62, 19, 47}, {5, 62, 19, 55}, {5, 62, 19, 63}, {5, 62, 19, 71}}},
{Country: "Russia", Region: "", City: "Moscow", Hostname: "ru.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 19, 39}, {5, 62, 19, 47}, {5, 62, 19, 55}, {5, 62, 19, 63}}},
{Country: "Rwanda", Region: "", City: "Kigali", Hostname: "rw.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 108}, {5, 62, 63, 84}}},
{Country: "Saint Helena", Region: "", City: "Tristan Da Cunha", Hostname: "sh.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 112}, {5, 62, 63, 88}}},
{Country: "Saint Kittsand Nevis", Region: "", City: "Basseterre", Hostname: "kn.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 196}, {5, 62, 58, 172}}},
@@ -223,18 +223,18 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Slovenia", Region: "", City: "Vrhnika", Hostname: "si.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 144}, {5, 62, 63, 124}}},
{Country: "Solomon Islands", Region: "", City: "Honiara", Hostname: "sb.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 212}, {5, 62, 58, 192}}},
{Country: "Somalia", Region: "", City: "Afgooye", Hostname: "so.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 148}, {5, 62, 63, 128}}},
{Country: "South Africa", Region: "", City: "Johannesburg", Hostname: "za.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{154, 127, 57, 21}, {154, 127, 57, 93}, {196, 251, 250, 39}, {196, 251, 250, 74}, {196, 251, 250, 92}, {196, 251, 250, 137}, {196, 251, 250, 206}}},
{Country: "South Korea", Region: "", City: "Seoul", Hostname: "kr.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{92, 223, 73, 22}, {92, 223, 73, 71}, {92, 223, 73, 89}, {92, 223, 73, 93}, {92, 223, 73, 147}}},
{Country: "Spain", Region: "", City: "Alicante", Hostname: "es.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{82, 102, 17, 126}, {82, 102, 17, 222}, {82, 102, 17, 254}, {185, 183, 106, 110}, {185, 183, 106, 126}}},
{Country: "South Africa", Region: "", City: "Johannesburg", Hostname: "za.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{102, 165, 47, 160}, {102, 165, 47, 176}, {154, 70, 155, 144}}},
{Country: "South Korea", Region: "", City: "Seoul", Hostname: "kr.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{185, 54, 229, 25}, {185, 54, 229, 41}, {185, 54, 229, 57}, {185, 54, 229, 73}}},
{Country: "Spain", Region: "", City: "Alicante", Hostname: "es.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{82, 102, 17, 254}, {89, 38, 226, 238}, {217, 138, 218, 238}}},
{Country: "Sri Lanka", Region: "", City: "Moratuwa", Hostname: "lk.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 152}, {5, 62, 63, 132}}},
{Country: "Sudan", Region: "", City: "Khartoum", Hostname: "sd.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 156}, {5, 62, 63, 136}}},
{Country: "Suriname", Region: "", City: "Paramaribo", Hostname: "sr.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 216}, {5, 62, 58, 196}}},
{Country: "Svalbardand Jan Mayen", Region: "", City: "Longyearbyen", Hostname: "sj.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 160}, {5, 62, 63, 140}}},
{Country: "Swaziland", Region: "", City: "Manzini", Hostname: "sz.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 220}, {5, 62, 58, 200}}},
{Country: "Sweden", Region: "Stockholm", City: "Nacka", Hostname: "se.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{31, 3, 152, 138}, {31, 3, 152, 170}, {31, 3, 152, 192}, {31, 3, 153, 140}, {37, 46, 121, 240}, {128, 127, 105, 164}}},
{Country: "Switzerland", Region: "", City: "Zurich", Hostname: "ch.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{84, 17, 52, 141}, {84, 17, 52, 154}, {84, 17, 52, 167}, {84, 17, 52, 180}, {84, 17, 52, 253}, {89, 187, 165, 179}}},
{Country: "Sweden", Region: "Stockholm", City: "Nacka", Hostname: "se.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{31, 3, 152, 98}, {31, 3, 152, 106}, {37, 46, 121, 240}, {128, 127, 105, 164}, {128, 127, 105, 192}}},
{Country: "Switzerland", Region: "", City: "Zurich", Hostname: "ch.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{84, 17, 52, 141}, {84, 17, 52, 167}, {84, 17, 52, 180}, {84, 17, 52, 240}, {89, 187, 165, 179}}},
{Country: "Syria", Region: "", City: "Ad Darah", Hostname: "sy.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 164}, {5, 62, 63, 144}}},
{Country: "Taiwan", Region: "", City: "Taipei", Hostname: "tw.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{172, 107, 246, 62}, {172, 107, 246, 110}, {172, 107, 246, 126}, {172, 107, 246, 142}, {172, 107, 246, 174}, {172, 107, 246, 190}, {172, 107, 246, 206}, {172, 107, 246, 222}}},
{Country: "Taiwan", Region: "", City: "Taipei", Hostname: "tw.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{172, 107, 246, 62}, {172, 107, 246, 110}, {172, 107, 246, 142}, {172, 107, 246, 174}, {172, 107, 246, 190}, {172, 107, 246, 206}, {172, 107, 246, 222}}},
{Country: "Tajikistan", Region: "", City: "Dushanbe", Hostname: "tj.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 168}, {5, 62, 63, 148}}},
{Country: "Tanzania", Region: "", City: "Arusha", Hostname: "tz.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 172}, {5, 62, 63, 152}}},
{Country: "Thailand", Region: "", City: "Bangkok", Hostname: "th.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 176}, {5, 62, 63, 156}}},
@@ -243,25 +243,25 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "Tonga", Region: "", City: "Nukualofa", Hostname: "to.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 228}, {5, 62, 58, 208}}},
{Country: "Trinidadand Tobago", Region: "", City: "San Fernando", Hostname: "tt.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 232}, {5, 62, 58, 212}}},
{Country: "Tunisia", Region: "", City: "Mahdia", Hostname: "tn.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 184}, {5, 62, 63, 164}}},
{Country: "Turkey", Region: "", City: "Istanbul", Hostname: "tr.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{92, 38, 180, 63}, {92, 38, 180, 76}, {92, 38, 180, 86}}},
{Country: "Turkey", Region: "", City: "Istanbul", Hostname: "tr.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{92, 38, 180, 76}, {92, 38, 180, 86}}},
{Country: "Turkmenistan", Region: "", City: "Ashgabat", Hostname: "tm.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 61, 188}, {5, 62, 63, 168}}},
{Country: "Turksand Caicos Islands", Region: "", City: "Balfour Town", Hostname: "tc.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 236}, {5, 62, 58, 216}}},
{Country: "Tuvalu", Region: "", City: "Vaitupu", Hostname: "tv.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 240}, {5, 62, 58, 220}}},
{Country: "UK", Region: "", City: "London", Hostname: "london.gb.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 43, 193}, {5, 62, 43, 202}, {5, 62, 43, 218}, {5, 62, 43, 229}, {77, 234, 43, 130}, {77, 234, 43, 166}, {77, 234, 43, 175}}},
{Country: "UK", Region: "Scotland", City: "Glasgow", Hostname: "scotland.gb.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{62, 128, 207, 110}, {62, 128, 217, 112}, {80, 75, 64, 66}, {109, 169, 34, 23}, {109, 169, 34, 42}, {109, 169, 34, 62}}},
{Country: "UK", Region: "", City: "London", Hostname: "london.gb.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 43, 193}, {5, 62, 43, 202}, {5, 62, 43, 218}, {77, 234, 43, 130}, {77, 234, 43, 166}, {77, 234, 43, 175}, {77, 234, 43, 185}}},
{Country: "UK", Region: "Scotland", City: "Glasgow", Hostname: "scotland.gb.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{62, 128, 217, 69}, {62, 128, 217, 85}, {62, 128, 217, 112}, {80, 75, 64, 66}, {109, 169, 34, 23}, {109, 169, 34, 42}, {109, 169, 34, 62}}},
{Country: "UK", Region: "", City: "", Hostname: "gb.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{62, 128, 207, 110}, {62, 128, 217, 69}, {62, 128, 217, 85}, {62, 128, 217, 112}, {80, 75, 64, 66}, {109, 169, 34, 23}, {109, 169, 34, 42}, {109, 169, 34, 62}}},
{Country: "USA", Region: "Alabama", City: "Montgomery", Hostname: "al.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{95, 142, 127, 16}, {95, 142, 127, 25}}},
{Country: "USA", Region: "Alaska", City: "Anchorage", Hostname: "ak.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 56, 252}, {5, 62, 58, 232}}},
{Country: "USA", Region: "Arizona", City: "Phoenix", Hostname: "az.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{23, 83, 130, 37}, {23, 83, 130, 187}, {23, 83, 131, 113}, {23, 83, 131, 215}, {23, 83, 185, 35}, {23, 83, 185, 50}}},
{Country: "USA", Region: "Arizona", City: "Phoenix", Hostname: "az.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{23, 83, 130, 34}, {23, 83, 130, 37}, {23, 83, 130, 187}, {23, 83, 131, 98}, {23, 83, 131, 215}, {23, 83, 132, 155}, {23, 83, 132, 176}, {23, 83, 185, 50}}},
{Country: "USA", Region: "Arkansas", City: "Magnolia", Hostname: "ar.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 0}, {5, 62, 58, 236}}},
{Country: "USA", Region: "California", City: "Los Angeles", Hostname: "ca.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{67, 201, 33, 54}, {107, 181, 178, 97}, {162, 253, 68, 161}, {162, 253, 68, 177}, {162, 253, 68, 193}, {162, 253, 68, 209}, {162, 253, 68, 225}, {162, 253, 68, 241}, {192, 252, 220, 17}}},
{Country: "USA", Region: "California", City: "Los Angeles", Hostname: "ca.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{67, 201, 33, 54}, {162, 253, 68, 145}, {162, 253, 68, 161}, {162, 253, 68, 177}, {162, 253, 68, 225}, {192, 252, 220, 60}}},
{Country: "USA", Region: "Connecticut", City: "Trumbull", Hostname: "ct.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 16, 16}, {5, 62, 16, 25}}},
{Country: "USA", Region: "Delaware", City: "Wilmington", Hostname: "de.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 4}, {5, 62, 58, 240}}},
{Country: "USA", Region: "Florida", City: "Miami", Hostname: "fl.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{171, 22, 76, 15}, {171, 22, 76, 31}, {171, 22, 76, 47}, {171, 22, 76, 63}, {171, 22, 76, 79}, {171, 22, 76, 95}}},
{Country: "USA", Region: "Georgia", City: "Atlanta", Hostname: "ga.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 24, 15}, {5, 62, 24, 31}, {5, 62, 24, 46}, {5, 62, 24, 61}, {66, 115, 181, 145}}},
{Country: "USA", Region: "Hawaii", City: "Honolulu", Hostname: "hi.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{131, 100, 2, 51}, {131, 100, 2, 99}, {131, 100, 2, 121}, {131, 100, 2, 222}}},
{Country: "USA", Region: "Florida", City: "Miami", Hostname: "fl.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{171, 22, 76, 15}, {171, 22, 76, 31}, {171, 22, 76, 47}, {171, 22, 76, 79}, {171, 22, 76, 95}}},
{Country: "USA", Region: "Georgia", City: "Atlanta", Hostname: "ga.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 24, 15}, {5, 62, 24, 31}, {5, 62, 24, 61}, {66, 115, 181, 97}}},
{Country: "USA", Region: "Hawaii", City: "Honolulu", Hostname: "hi.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{131, 100, 2, 51}, {131, 100, 2, 99}}},
{Country: "USA", Region: "Idaho", City: "Idaho Falls", Hostname: "id.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 12}, {5, 62, 58, 248}}},
{Country: "USA", Region: "Illinois", City: "Chicago", Hostname: "il.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{154, 16, 241, 127}, {181, 214, 61, 64}, {181, 214, 102, 159}, {181, 214, 107, 31}, {181, 214, 107, 63}}},
{Country: "USA", Region: "Illinois", City: "Chicago", Hostname: "il.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{154, 16, 241, 127}, {154, 16, 241, 255}, {181, 214, 61, 64}, {181, 214, 98, 31}, {181, 214, 99, 159}, {181, 214, 102, 159}, {181, 214, 107, 47}, {191, 101, 170, 30}}},
{Country: "USA", Region: "Indiana", City: "South Bend", Hostname: "in.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{198, 134, 108, 67}, {198, 134, 109, 131}}},
{Country: "USA", Region: "Iowa", City: "Des Moines", Hostname: "ia.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 104}, {5, 62, 59, 84}}},
{Country: "USA", Region: "Kansas", City: "Wichita", Hostname: "ks.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 16}, {5, 62, 58, 252}}},
@@ -269,30 +269,30 @@ func HideMyAssServers() []models.HideMyAssServer {
{Country: "USA", Region: "Louisiana", City: "New Orleans", Hostname: "la.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 24}, {5, 62, 59, 4}}},
{Country: "USA", Region: "Maine", City: "Bath", Hostname: "me.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 28}, {5, 62, 59, 8}}},
{Country: "USA", Region: "Maryland", City: "Baltimore", Hostname: "md.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 32}, {5, 62, 59, 12}}},
{Country: "USA", Region: "Massachusetts", City: "Boston", Hostname: "ma.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{38, 146, 52, 205}, {38, 146, 57, 205}, {38, 146, 57, 253}, {38, 242, 7, 243}, {154, 3, 129, 29}, {154, 3, 222, 163}}},
{Country: "USA", Region: "Massachusetts", City: "Boston", Hostname: "ma.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{38, 146, 55, 115}, {38, 146, 57, 253}, {38, 242, 7, 243}, {154, 3, 129, 29}, {154, 3, 129, 77}, {154, 3, 129, 93}}},
{Country: "USA", Region: "Michigan", City: "Lansing", Hostname: "mi.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 36}, {5, 62, 59, 16}}},
{Country: "USA", Region: "Minnesota", City: "Saint Paul", Hostname: "mn.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 108}, {5, 62, 59, 88}}},
{Country: "USA", Region: "Mississippi", City: "Louisville", Hostname: "ms.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 40}, {5, 62, 59, 20}}},
{Country: "USA", Region: "Missouri", City: "Kansas City", Hostname: "mo.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{209, 239, 115, 164}, {209, 239, 115, 186}}},
{Country: "USA", Region: "Montana", City: "Billings", Hostname: "mt.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 116}, {5, 62, 59, 92}}},
{Country: "USA", Region: "Nebraska", City: "Omaha", Hostname: "ne.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 44}, {5, 62, 59, 24}}},
{Country: "USA", Region: "Nevada", City: "Las Vegas", Hostname: "nv.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{76, 164, 192, 254}, {76, 164, 193, 82}, {76, 164, 200, 114}, {76, 164, 205, 194}, {76, 164, 224, 211}, {76, 164, 225, 75}}},
{Country: "USA", Region: "Nevada", City: "Las Vegas", Hostname: "nv.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{76, 164, 192, 254}, {76, 164, 193, 82}, {76, 164, 200, 114}, {76, 164, 202, 190}, {76, 164, 205, 194}}},
{Country: "USA", Region: "New Hampshire", City: "Bedford", Hostname: "nh.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 48}, {5, 62, 59, 28}}},
{Country: "USA", Region: "New York", City: "Manhattan", Hostname: "ny.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{156, 146, 36, 77}, {156, 146, 36, 103}, {195, 181, 168, 187}, {212, 102, 33, 50}, {212, 102, 33, 77}, {212, 102, 33, 90}, {212, 102, 33, 176}, {212, 102, 33, 224}, {212, 102, 33, 251}}},
{Country: "USA", Region: "North Carolina", City: "Asheville", Hostname: "nc.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{104, 247, 208, 78}, {104, 247, 208, 94}, {104, 247, 208, 126}, {104, 247, 208, 142}, {104, 247, 208, 158}, {104, 247, 208, 174}}},
{Country: "USA", Region: "New York", City: "Manhattan", Hostname: "ny.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{156, 146, 36, 77}, {156, 146, 36, 90}, {156, 146, 36, 103}, {195, 181, 168, 187}, {212, 102, 33, 77}, {212, 102, 33, 90}, {212, 102, 33, 144}, {212, 102, 33, 192}, {212, 102, 33, 224}, {212, 102, 33, 240}}},
{Country: "USA", Region: "North Carolina", City: "Asheville", Hostname: "nc.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{104, 247, 208, 78}, {104, 247, 208, 94}, {104, 247, 208, 110}, {104, 247, 208, 126}, {104, 247, 208, 142}, {104, 247, 208, 158}, {104, 247, 208, 174}}},
{Country: "USA", Region: "North Dakota", City: "Grand Forks", Hostname: "nd.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 60}, {5, 62, 59, 40}}},
{Country: "USA", Region: "Ohio", City: "Columbus", Hostname: "oh.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{199, 114, 218, 99}, {199, 114, 218, 115}}},
{Country: "USA", Region: "Oklahoma", City: "Oklahoma City", Hostname: "ok.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{209, 54, 43, 201}, {209, 54, 47, 200}}},
{Country: "USA", Region: "Oklahoma", City: "Oklahoma City", Hostname: "ok.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{216, 107, 129, 115}, {216, 107, 129, 131}}},
{Country: "USA", Region: "Pennsylvania", City: "Wilkes-Barre", Hostname: "pa.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 64}, {5, 62, 59, 44}}},
{Country: "USA", Region: "Rhode Island", City: "Providence", Hostname: "ri.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 68}, {5, 62, 59, 48}}},
{Country: "USA", Region: "South Carolina", City: "Columbia", Hostname: "sc.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 72}, {5, 62, 59, 52}}},
{Country: "USA", Region: "South Dakota", City: "Sioux Falls", Hostname: "sd.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 76}, {5, 62, 59, 56}}},
{Country: "USA", Region: "Tennessee", City: "Nashville", Hostname: "tn.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 80}, {5, 62, 59, 60}}},
{Country: "USA", Region: "Texas", City: "Dallas", Hostname: "tx.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{89, 187, 164, 144}, {89, 187, 164, 160}, {89, 187, 164, 176}, {156, 146, 38, 141}, {156, 146, 38, 154}, {212, 102, 40, 13}, {212, 102, 40, 26}, {212, 102, 40, 141}, {212, 102, 40, 154}}},
{Country: "USA", Region: "Utah", City: "Salt Lake City", Hostname: "ut.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{69, 36, 169, 129}, {199, 189, 106, 235}, {199, 189, 106, 239}, {199, 189, 106, 251}, {209, 95, 34, 73}, {209, 95, 56, 199}}},
{Country: "USA", Region: "Texas", City: "Dallas", Hostname: "tx.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{89, 187, 164, 86}, {89, 187, 164, 144}, {89, 187, 164, 160}, {89, 187, 164, 176}, {156, 146, 38, 141}, {212, 102, 40, 13}, {212, 102, 40, 141}, {212, 102, 40, 154}}},
{Country: "USA", Region: "Utah", City: "Salt Lake City", Hostname: "ut.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{69, 36, 169, 129}, {199, 189, 106, 235}, {199, 189, 106, 239}, {199, 189, 106, 245}, {199, 189, 106, 251}, {209, 95, 34, 73}}},
{Country: "USA", Region: "Vermont", City: "Rutland", Hostname: "vt.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 84}, {5, 62, 59, 64}}},
{Country: "USA", Region: "Virginia", City: "Ashburn", Hostname: "va.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{198, 98, 183, 37}, {198, 98, 183, 133}, {198, 98, 183, 152}}},
{Country: "USA", Region: "Washington", City: "Seattle", Hostname: "wa.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{66, 115, 149, 17}, {66, 115, 149, 97}, {66, 115, 149, 123}, {199, 187, 211, 172}, {199, 187, 211, 217}, {199, 187, 211, 232}, {199, 187, 211, 247}, {199, 229, 250, 241}}},
{Country: "USA", Region: "Washington", City: "Seattle", Hostname: "wa.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{66, 115, 149, 49}, {172, 98, 86, 150}, {172, 98, 86, 166}, {172, 98, 86, 182}, {199, 187, 211, 46}, {199, 187, 211, 92}, {199, 187, 211, 172}, {199, 187, 211, 187}, {199, 187, 211, 202}, {199, 187, 211, 232}, {199, 187, 211, 247}}},
{Country: "USA", Region: "West Virginia", City: "Philippi", Hostname: "wv.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 88}, {5, 62, 59, 68}}},
{Country: "USA", Region: "Wisconsin", City: "Madison", Hostname: "wi.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{204, 15, 110, 131}, {204, 15, 110, 163}}},
{Country: "USA", Region: "Wyoming", City: "Cheyenne", Hostname: "wy.us.hma.rocks", TCP: true, UDP: true, IPs: []net.IP{{5, 62, 57, 92}, {5, 62, 59, 72}}},

File diff suppressed because it is too large Load Diff

View File

@@ -22,51 +22,35 @@ func PrivadoHostnameChoices() (choices []string) {
func PrivadoServers() []models.PrivadoServer {
return []models.PrivadoServer{
{Hostname: "akl-001.vpn.privado.io", IP: net.IP{23, 254, 104, 114}},
{Hostname: "akl-002.vpn.privado.io", IP: net.IP{23, 254, 104, 120}},
{Hostname: "akl-003.vpn.privado.io", IP: net.IP{23, 254, 104, 51}},
{Hostname: "ams-001.vpn.privado.io", IP: net.IP{91, 148, 224, 10}},
{Hostname: "ams-002.vpn.privado.io", IP: net.IP{91, 148, 224, 20}},
{Hostname: "ams-003.vpn.privado.io", IP: net.IP{91, 148, 224, 30}},
{Hostname: "ams-004.vpn.privado.io", IP: net.IP{91, 148, 224, 40}},
{Hostname: "ams-005.vpn.privado.io", IP: net.IP{91, 148, 224, 50}},
{Hostname: "ams-006.vpn.privado.io", IP: net.IP{91, 148, 224, 60}},
{Hostname: "ams-007.vpn.privado.io", IP: net.IP{91, 148, 224, 70}},
{Hostname: "ams-008.vpn.privado.io", IP: net.IP{91, 148, 224, 80}},
{Hostname: "ams-009.vpn.privado.io", IP: net.IP{91, 148, 228, 10}},
{Hostname: "ams-010.vpn.privado.io", IP: net.IP{91, 148, 228, 20}},
{Hostname: "akl-004.vpn.privado.io", IP: net.IP{103, 76, 164, 99}},
{Hostname: "akl-005.vpn.privado.io", IP: net.IP{103, 76, 164, 105}},
{Hostname: "ams-011.vpn.privado.io", IP: net.IP{91, 148, 228, 30}},
{Hostname: "ams-012.vpn.privado.io", IP: net.IP{91, 148, 228, 40}},
{Hostname: "ams-014.vpn.privado.io", IP: net.IP{91, 148, 228, 60}},
{Hostname: "arn-001.vpn.privado.io", IP: net.IP{86, 106, 103, 67}},
{Hostname: "arn-002.vpn.privado.io", IP: net.IP{86, 106, 103, 74}},
{Hostname: "arn-003.vpn.privado.io", IP: net.IP{86, 106, 103, 81}},
{Hostname: "arn-004.vpn.privado.io", IP: net.IP{86, 106, 103, 88}},
{Hostname: "ath-001.vpn.privado.io", IP: net.IP{188, 123, 126, 61}},
{Hostname: "ath-002.vpn.privado.io", IP: net.IP{188, 123, 126, 64}},
{Hostname: "ath-003.vpn.privado.io", IP: net.IP{188, 123, 126, 68}},
{Hostname: "ath-004.vpn.privado.io", IP: net.IP{188, 123, 126, 72}},
{Hostname: "beg-001.vpn.privado.io", IP: net.IP{89, 38, 224, 19}},
{Hostname: "beg-002.vpn.privado.io", IP: net.IP{89, 38, 224, 25}},
{Hostname: "ber-001.vpn.privado.io", IP: net.IP{89, 36, 76, 35}},
{Hostname: "ber-002.vpn.privado.io", IP: net.IP{89, 36, 76, 41}},
{Hostname: "bkk-001.vpn.privado.io", IP: net.IP{119, 59, 111, 3}},
{Hostname: "bkk-002.vpn.privado.io", IP: net.IP{119, 59, 111, 11}},
{Hostname: "bom-001.vpn.privado.io", IP: net.IP{103, 26, 204, 61}},
{Hostname: "bom-002.vpn.privado.io", IP: net.IP{103, 26, 204, 70}},
{Hostname: "bru-001.vpn.privado.io", IP: net.IP{217, 138, 211, 163}},
{Hostname: "bru-002.vpn.privado.io", IP: net.IP{217, 138, 211, 170}},
{Hostname: "bru-003.vpn.privado.io", IP: net.IP{217, 138, 211, 177}},
{Hostname: "bru-004.vpn.privado.io", IP: net.IP{217, 138, 211, 184}},
{Hostname: "bts-001.vpn.privado.io", IP: net.IP{37, 120, 221, 227}},
{Hostname: "bts-002.vpn.privado.io", IP: net.IP{37, 120, 221, 233}},
{Hostname: "bud-001.vpn.privado.io", IP: net.IP{185, 128, 26, 194}},
{Hostname: "bud-002.vpn.privado.io", IP: net.IP{185, 128, 26, 200}},
{Hostname: "cdg-001.vpn.privado.io", IP: net.IP{89, 40, 183, 99}},
{Hostname: "cdg-002.vpn.privado.io", IP: net.IP{89, 40, 183, 104}},
{Hostname: "cdg-003.vpn.privado.io", IP: net.IP{89, 40, 183, 109}},
{Hostname: "cdg-004.vpn.privado.io", IP: net.IP{89, 40, 183, 114}},
{Hostname: "cph-001.vpn.privado.io", IP: net.IP{2, 58, 46, 35}},
{Hostname: "cph-002.vpn.privado.io", IP: net.IP{2, 58, 46, 42}},
{Hostname: "cph-003.vpn.privado.io", IP: net.IP{2, 58, 46, 49}},
{Hostname: "cph-004.vpn.privado.io", IP: net.IP{2, 58, 46, 56}},
{Hostname: "dca-002.vpn.privado.io", IP: net.IP{85, 12, 61, 20}},
{Hostname: "dca-003.vpn.privado.io", IP: net.IP{85, 12, 61, 30}},
{Hostname: "dca-005.vpn.privado.io", IP: net.IP{85, 12, 61, 50}},
{Hostname: "dca-006.vpn.privado.io", IP: net.IP{85, 12, 61, 60}},
{Hostname: "dca-007.vpn.privado.io", IP: net.IP{85, 12, 61, 70}},
@@ -76,136 +60,199 @@ func PrivadoServers() []models.PrivadoServer {
{Hostname: "dca-011.vpn.privado.io", IP: net.IP{85, 12, 61, 110}},
{Hostname: "dca-012.vpn.privado.io", IP: net.IP{85, 12, 61, 120}},
{Hostname: "dca-013.vpn.privado.io", IP: net.IP{185, 247, 68, 3}},
{Hostname: "dca-014.vpn.privado.io", IP: net.IP{185, 247, 68, 14}},
{Hostname: "dfw-001.vpn.privado.io", IP: net.IP{23, 105, 32, 243}},
{Hostname: "dfw-002.vpn.privado.io", IP: net.IP{23, 105, 32, 244}},
{Hostname: "dub-001.vpn.privado.io", IP: net.IP{84, 247, 48, 227}},
{Hostname: "dfw-003.vpn.privado.io", IP: net.IP{172, 241, 25, 157}},
{Hostname: "dfw-005.vpn.privado.io", IP: net.IP{172, 241, 25, 161}},
{Hostname: "dfw-008.vpn.privado.io", IP: net.IP{172, 241, 25, 167}},
{Hostname: "dfw-009.vpn.privado.io", IP: net.IP{172, 241, 25, 169}},
{Hostname: "dfw-010.vpn.privado.io", IP: net.IP{172, 241, 25, 171}},
{Hostname: "dfw-012.vpn.privado.io", IP: net.IP{172, 241, 25, 175}},
{Hostname: "dfw-013.vpn.privado.io", IP: net.IP{172, 241, 25, 177}},
{Hostname: "dfw-015.vpn.privado.io", IP: net.IP{172, 241, 25, 181}},
{Hostname: "dfw-016.vpn.privado.io", IP: net.IP{172, 241, 25, 183}},
{Hostname: "dfw-017.vpn.privado.io", IP: net.IP{172, 241, 25, 185}},
{Hostname: "dfw-018.vpn.privado.io", IP: net.IP{172, 241, 30, 65}},
{Hostname: "dfw-020.vpn.privado.io", IP: net.IP{172, 241, 30, 69}},
{Hostname: "dfw-021.vpn.privado.io", IP: net.IP{172, 241, 30, 71}},
{Hostname: "dfw-022.vpn.privado.io", IP: net.IP{172, 241, 30, 73}},
{Hostname: "dfw-023.vpn.privado.io", IP: net.IP{172, 241, 30, 75}},
{Hostname: "dfw-025.vpn.privado.io", IP: net.IP{172, 241, 30, 79}},
{Hostname: "dfw-026.vpn.privado.io", IP: net.IP{172, 241, 30, 81}},
{Hostname: "dfw-027.vpn.privado.io", IP: net.IP{172, 241, 30, 83}},
{Hostname: "dfw-028.vpn.privado.io", IP: net.IP{172, 241, 30, 85}},
{Hostname: "dfw-030.vpn.privado.io", IP: net.IP{172, 241, 30, 89}},
{Hostname: "dfw-032.vpn.privado.io", IP: net.IP{172, 241, 30, 93}},
{Hostname: "dub-002.vpn.privado.io", IP: net.IP{84, 247, 48, 234}},
{Hostname: "dub-003.vpn.privado.io", IP: net.IP{84, 247, 48, 241}},
{Hostname: "dub-004.vpn.privado.io", IP: net.IP{84, 247, 48, 248}},
{Hostname: "eze-001.vpn.privado.io", IP: net.IP{168, 205, 93, 211}},
{Hostname: "eze-002.vpn.privado.io", IP: net.IP{168, 205, 93, 215}},
{Hostname: "fra-001.vpn.privado.io", IP: net.IP{91, 148, 232, 10}},
{Hostname: "fra-002.vpn.privado.io", IP: net.IP{91, 148, 232, 20}},
{Hostname: "fra-003.vpn.privado.io", IP: net.IP{91, 148, 232, 30}},
{Hostname: "fra-004.vpn.privado.io", IP: net.IP{91, 148, 232, 40}},
{Hostname: "fra-005.vpn.privado.io", IP: net.IP{91, 148, 233, 7}},
{Hostname: "fra-006.vpn.privado.io", IP: net.IP{91, 148, 233, 8}},
{Hostname: "fra-007.vpn.privado.io", IP: net.IP{91, 148, 233, 9}},
{Hostname: "fra-008.vpn.privado.io", IP: net.IP{91, 148, 233, 10}},
{Hostname: "gru-001.vpn.privado.io", IP: net.IP{177, 54, 145, 193}},
{Hostname: "gru-002.vpn.privado.io", IP: net.IP{177, 54, 145, 197}},
{Hostname: "hel-001.vpn.privado.io", IP: net.IP{194, 34, 134, 219}},
{Hostname: "hel-002.vpn.privado.io", IP: net.IP{194, 34, 134, 227}},
{Hostname: "hkg-001.vpn.privado.io", IP: net.IP{209, 58, 185, 88}},
{Hostname: "hkg-002.vpn.privado.io", IP: net.IP{209, 58, 185, 97}},
{Hostname: "hkg-003.vpn.privado.io", IP: net.IP{209, 58, 185, 108}},
{Hostname: "hkg-004.vpn.privado.io", IP: net.IP{209, 58, 185, 120}},
{Hostname: "icn-001.vpn.privado.io", IP: net.IP{169, 56, 73, 146}},
{Hostname: "icn-002.vpn.privado.io", IP: net.IP{169, 56, 73, 153}},
{Hostname: "iev-001.vpn.privado.io", IP: net.IP{176, 103, 52, 40}},
{Hostname: "iev-002.vpn.privado.io", IP: net.IP{176, 103, 53, 40}},
{Hostname: "ist-001.vpn.privado.io", IP: net.IP{185, 84, 183, 3}},
{Hostname: "ist-002.vpn.privado.io", IP: net.IP{185, 84, 183, 4}},
{Hostname: "jfk-001.vpn.privado.io", IP: net.IP{217, 138, 208, 99}},
{Hostname: "jfk-002.vpn.privado.io", IP: net.IP{217, 138, 208, 106}},
{Hostname: "jfk-003.vpn.privado.io", IP: net.IP{217, 138, 208, 113}},
{Hostname: "jfk-004.vpn.privado.io", IP: net.IP{217, 138, 208, 120}},
{Hostname: "jfk-005.vpn.privado.io", IP: net.IP{37, 120, 244, 3}},
{Hostname: "jfk-006.vpn.privado.io", IP: net.IP{37, 120, 244, 10}},
{Hostname: "jfk-007.vpn.privado.io", IP: net.IP{37, 120, 244, 17}},
{Hostname: "jfk-009.vpn.privado.io", IP: net.IP{23, 19, 225, 65}},
{Hostname: "jfk-010.vpn.privado.io", IP: net.IP{23, 19, 225, 67}},
{Hostname: "jfk-015.vpn.privado.io", IP: net.IP{23, 19, 225, 77}},
{Hostname: "jfk-016.vpn.privado.io", IP: net.IP{23, 19, 225, 79}},
{Hostname: "jfk-019.vpn.privado.io", IP: net.IP{23, 19, 225, 85}},
{Hostname: "jfk-020.vpn.privado.io", IP: net.IP{23, 19, 225, 87}},
{Hostname: "jfk-021.vpn.privado.io", IP: net.IP{23, 19, 225, 89}},
{Hostname: "jfk-026.vpn.privado.io", IP: net.IP{23, 19, 225, 99}},
{Hostname: "jfk-027.vpn.privado.io", IP: net.IP{23, 19, 225, 101}},
{Hostname: "jfk-028.vpn.privado.io", IP: net.IP{23, 19, 225, 103}},
{Hostname: "jfk-029.vpn.privado.io", IP: net.IP{23, 19, 225, 105}},
{Hostname: "jfk-030.vpn.privado.io", IP: net.IP{23, 19, 225, 107}},
{Hostname: "jfk-031.vpn.privado.io", IP: net.IP{23, 19, 225, 109}},
{Hostname: "jfk-035.vpn.privado.io", IP: net.IP{23, 19, 225, 117}},
{Hostname: "jnb-001.vpn.privado.io", IP: net.IP{172, 107, 93, 131}},
{Hostname: "jnb-002.vpn.privado.io", IP: net.IP{172, 107, 93, 137}},
{Hostname: "lax-001.vpn.privado.io", IP: net.IP{81, 171, 62, 3}},
{Hostname: "jrs-001.vpn.privado.io", IP: net.IP{31, 168, 251, 131}},
{Hostname: "kul-001.vpn.privado.io", IP: net.IP{103, 246, 112, 229}},
{Hostname: "kul-004.vpn.privado.io", IP: net.IP{103, 246, 112, 235}},
{Hostname: "kul-005.vpn.privado.io", IP: net.IP{103, 246, 112, 237}},
{Hostname: "kul-006.vpn.privado.io", IP: net.IP{103, 246, 112, 239}},
{Hostname: "kul-007.vpn.privado.io", IP: net.IP{103, 246, 112, 241}},
{Hostname: "kul-008.vpn.privado.io", IP: net.IP{103, 246, 112, 243}},
{Hostname: "kul-010.vpn.privado.io", IP: net.IP{103, 246, 112, 247}},
{Hostname: "kul-011.vpn.privado.io", IP: net.IP{103, 246, 112, 249}},
{Hostname: "lax-002.vpn.privado.io", IP: net.IP{81, 171, 62, 13}},
{Hostname: "lax-003.vpn.privado.io", IP: net.IP{81, 171, 62, 24}},
{Hostname: "lax-004.vpn.privado.io", IP: net.IP{81, 171, 62, 34}},
{Hostname: "lax-005.vpn.privado.io", IP: net.IP{81, 171, 62, 70}},
{Hostname: "lax-006.vpn.privado.io", IP: net.IP{81, 171, 62, 80}},
{Hostname: "lax-007.vpn.privado.io", IP: net.IP{81, 171, 62, 90}},
{Hostname: "lax-008.vpn.privado.io", IP: net.IP{81, 171, 62, 100}},
{Hostname: "lax-009.vpn.privado.io", IP: net.IP{45, 152, 182, 227}},
{Hostname: "lax-010.vpn.privado.io", IP: net.IP{45, 152, 182, 234}},
{Hostname: "lax-011.vpn.privado.io", IP: net.IP{45, 152, 182, 241}},
{Hostname: "lax-012.vpn.privado.io", IP: net.IP{45, 152, 182, 248}},
{Hostname: "lhr-003.vpn.privado.io", IP: net.IP{217, 138, 195, 173}},
{Hostname: "lhr-004.vpn.privado.io", IP: net.IP{217, 138, 195, 178}},
{Hostname: "lis-001.vpn.privado.io", IP: net.IP{89, 26, 243, 153}},
{Hostname: "lis-002.vpn.privado.io", IP: net.IP{89, 26, 243, 154}},
{Hostname: "lon-001.vpn.privado.io", IP: net.IP{217, 138, 195, 163}},
{Hostname: "lon-002.vpn.privado.io", IP: net.IP{217, 138, 195, 168}},
{Hostname: "lon-003.vpn.privado.io", IP: net.IP{217, 138, 195, 173}},
{Hostname: "lon-004.vpn.privado.io", IP: net.IP{217, 138, 195, 178}},
{Hostname: "mad-001.vpn.privado.io", IP: net.IP{217, 138, 218, 131}},
{Hostname: "mad-002.vpn.privado.io", IP: net.IP{217, 138, 218, 138}},
{Hostname: "mad-003.vpn.privado.io", IP: net.IP{217, 138, 218, 145}},
{Hostname: "mad-004.vpn.privado.io", IP: net.IP{217, 138, 218, 152}},
{Hostname: "man-001.vpn.privado.io", IP: net.IP{217, 138, 196, 131}},
{Hostname: "man-002.vpn.privado.io", IP: net.IP{217, 138, 196, 138}},
{Hostname: "man-003.vpn.privado.io", IP: net.IP{217, 138, 196, 145}},
{Hostname: "man-004.vpn.privado.io", IP: net.IP{217, 138, 196, 152}},
{Hostname: "mex-001.vpn.privado.io", IP: net.IP{169, 57, 96, 52}},
{Hostname: "mex-002.vpn.privado.io", IP: net.IP{169, 57, 96, 57}},
{Hostname: "mia-001.vpn.privado.io", IP: net.IP{86, 106, 87, 131}},
{Hostname: "mia-002.vpn.privado.io", IP: net.IP{86, 106, 87, 136}},
{Hostname: "mex-003.vpn.privado.io", IP: net.IP{81, 171, 63, 3}},
{Hostname: "mex-005.vpn.privado.io", IP: net.IP{81, 171, 63, 23}},
{Hostname: "mex-006.vpn.privado.io", IP: net.IP{81, 171, 63, 33}},
{Hostname: "mex-008.vpn.privado.io", IP: net.IP{81, 171, 63, 54}},
{Hostname: "mex-009.vpn.privado.io", IP: net.IP{81, 171, 63, 64}},
{Hostname: "mex-010.vpn.privado.io", IP: net.IP{81, 171, 63, 74}},
{Hostname: "mia-003.vpn.privado.io", IP: net.IP{86, 106, 87, 141}},
{Hostname: "mia-004.vpn.privado.io", IP: net.IP{86, 106, 87, 146}},
{Hostname: "mxp-001.vpn.privado.io", IP: net.IP{89, 40, 182, 195}},
{Hostname: "mxp-002.vpn.privado.io", IP: net.IP{89, 40, 182, 201}},
{Hostname: "nrt-001.vpn.privado.io", IP: net.IP{217, 138, 252, 3}},
{Hostname: "nrt-002.vpn.privado.io", IP: net.IP{217, 138, 252, 10}},
{Hostname: "nrt-003.vpn.privado.io", IP: net.IP{217, 138, 252, 17}},
{Hostname: "nrt-004.vpn.privado.io", IP: net.IP{217, 138, 252, 24}},
{Hostname: "ord-001.vpn.privado.io", IP: net.IP{23, 108, 95, 129}},
{Hostname: "ord-002.vpn.privado.io", IP: net.IP{23, 108, 95, 167}},
{Hostname: "osl-001.vpn.privado.io", IP: net.IP{84, 247, 50, 115}},
{Hostname: "osl-002.vpn.privado.io", IP: net.IP{84, 247, 50, 119}},
{Hostname: "ord-004.vpn.privado.io", IP: net.IP{23, 254, 112, 138}},
{Hostname: "ord-007.vpn.privado.io", IP: net.IP{23, 108, 95, 203}},
{Hostname: "ord-012.vpn.privado.io", IP: net.IP{23, 108, 95, 230}},
{Hostname: "ord-014.vpn.privado.io", IP: net.IP{23, 108, 95, 234}},
{Hostname: "ord-015.vpn.privado.io", IP: net.IP{23, 108, 95, 236}},
{Hostname: "ord-016.vpn.privado.io", IP: net.IP{23, 108, 95, 238}},
{Hostname: "ord-017.vpn.privado.io", IP: net.IP{23, 108, 95, 240}},
{Hostname: "ord-024.vpn.privado.io", IP: net.IP{108, 62, 107, 160}},
{Hostname: "ord-027.vpn.privado.io", IP: net.IP{108, 62, 107, 166}},
{Hostname: "ord-029.vpn.privado.io", IP: net.IP{108, 62, 107, 170}},
{Hostname: "ord-030.vpn.privado.io", IP: net.IP{108, 62, 107, 172}},
{Hostname: "ord-031.vpn.privado.io", IP: net.IP{108, 62, 107, 174}},
{Hostname: "ord-032.vpn.privado.io", IP: net.IP{108, 62, 107, 176}},
{Hostname: "ord-033.vpn.privado.io", IP: net.IP{108, 62, 107, 178}},
{Hostname: "ord-035.vpn.privado.io", IP: net.IP{23, 82, 107, 65}},
{Hostname: "ord-038.vpn.privado.io", IP: net.IP{23, 82, 107, 71}},
{Hostname: "ord-042.vpn.privado.io", IP: net.IP{23, 82, 107, 79}},
{Hostname: "ord-044.vpn.privado.io", IP: net.IP{23, 82, 107, 83}},
{Hostname: "ord-045.vpn.privado.io", IP: net.IP{23, 82, 107, 85}},
{Hostname: "ord-046.vpn.privado.io", IP: net.IP{23, 82, 107, 87}},
{Hostname: "ord-047.vpn.privado.io", IP: net.IP{23, 82, 107, 89}},
{Hostname: "ord-048.vpn.privado.io", IP: net.IP{23, 82, 107, 91}},
{Hostname: "ord-050.vpn.privado.io", IP: net.IP{23, 82, 107, 95}},
{Hostname: "ord-051.vpn.privado.io", IP: net.IP{23, 82, 107, 97}},
{Hostname: "ord-053.vpn.privado.io", IP: net.IP{23, 82, 107, 101}},
{Hostname: "ord-055.vpn.privado.io", IP: net.IP{23, 82, 107, 105}},
{Hostname: "ord-056.vpn.privado.io", IP: net.IP{23, 82, 107, 107}},
{Hostname: "ord-057.vpn.privado.io", IP: net.IP{23, 82, 107, 109}},
{Hostname: "ord-058.vpn.privado.io", IP: net.IP{23, 82, 107, 111}},
{Hostname: "ord-060.vpn.privado.io", IP: net.IP{23, 82, 107, 115}},
{Hostname: "ord-061.vpn.privado.io", IP: net.IP{23, 82, 107, 117}},
{Hostname: "osl-003.vpn.privado.io", IP: net.IP{84, 247, 50, 123}},
{Hostname: "otp-001.vpn.privado.io", IP: net.IP{89, 46, 102, 179}},
{Hostname: "otp-002.vpn.privado.io", IP: net.IP{89, 46, 102, 185}},
{Hostname: "phx-001.vpn.privado.io", IP: net.IP{91, 148, 236, 10}},
{Hostname: "phx-002.vpn.privado.io", IP: net.IP{91, 148, 236, 20}},
{Hostname: "phx-003.vpn.privado.io", IP: net.IP{91, 148, 236, 30}},
{Hostname: "phx-004.vpn.privado.io", IP: net.IP{91, 148, 236, 40}},
{Hostname: "phx-005.vpn.privado.io", IP: net.IP{91, 148, 236, 50}},
{Hostname: "phx-006.vpn.privado.io", IP: net.IP{91, 148, 236, 60}},
{Hostname: "phx-007.vpn.privado.io", IP: net.IP{91, 148, 236, 70}},
{Hostname: "phx-008.vpn.privado.io", IP: net.IP{91, 148, 236, 80}},
{Hostname: "prg-001.vpn.privado.io", IP: net.IP{185, 216, 35, 99}},
{Hostname: "pdx-005.vpn.privado.io", IP: net.IP{104, 255, 228, 147}},
{Hostname: "pdx-006.vpn.privado.io", IP: net.IP{104, 255, 228, 151}},
{Hostname: "pdx-008.vpn.privado.io", IP: net.IP{104, 255, 228, 159}},
{Hostname: "pdx-010.vpn.privado.io", IP: net.IP{104, 255, 228, 167}},
{Hostname: "pdx-011.vpn.privado.io", IP: net.IP{104, 255, 228, 171}},
{Hostname: "pdx-012.vpn.privado.io", IP: net.IP{104, 255, 228, 175}},
{Hostname: "pdx-014.vpn.privado.io", IP: net.IP{104, 255, 228, 183}},
{Hostname: "pdx-016.vpn.privado.io", IP: net.IP{104, 255, 228, 195}},
{Hostname: "pdx-017.vpn.privado.io", IP: net.IP{104, 255, 228, 199}},
{Hostname: "pdx-019.vpn.privado.io", IP: net.IP{104, 255, 228, 207}},
{Hostname: "pdx-020.vpn.privado.io", IP: net.IP{104, 255, 228, 211}},
{Hostname: "pdx-022.vpn.privado.io", IP: net.IP{104, 255, 228, 219}},
{Hostname: "pdx-023.vpn.privado.io", IP: net.IP{104, 255, 228, 223}},
{Hostname: "pdx-024.vpn.privado.io", IP: net.IP{104, 255, 228, 227}},
{Hostname: "pdx-025.vpn.privado.io", IP: net.IP{104, 255, 228, 231}},
{Hostname: "pdx-026.vpn.privado.io", IP: net.IP{104, 255, 228, 235}},
{Hostname: "pdx-028.vpn.privado.io", IP: net.IP{104, 255, 228, 243}},
{Hostname: "pdx-030.vpn.privado.io", IP: net.IP{104, 255, 228, 251}},
{Hostname: "prg-002.vpn.privado.io", IP: net.IP{185, 216, 35, 105}},
{Hostname: "rix-001.vpn.privado.io", IP: net.IP{109, 248, 149, 35}},
{Hostname: "rix-002.vpn.privado.io", IP: net.IP{109, 248, 149, 40}},
{Hostname: "rkv-001.vpn.privado.io", IP: net.IP{82, 221, 131, 78}},
{Hostname: "rkv-002.vpn.privado.io", IP: net.IP{82, 221, 131, 127}},
{Hostname: "sea-001.vpn.privado.io", IP: net.IP{23, 81, 208, 96}},
{Hostname: "sea-002.vpn.privado.io", IP: net.IP{23, 81, 208, 104}},
{Hostname: "sea-004.vpn.privado.io", IP: net.IP{23, 19, 87, 116}},
{Hostname: "sin-001.vpn.privado.io", IP: net.IP{92, 119, 178, 131}},
{Hostname: "sin-002.vpn.privado.io", IP: net.IP{92, 119, 178, 138}},
{Hostname: "sin-003.vpn.privado.io", IP: net.IP{92, 119, 178, 145}},
{Hostname: "sin-004.vpn.privado.io", IP: net.IP{92, 119, 178, 152}},
{Hostname: "sof-001.vpn.privado.io", IP: net.IP{217, 138, 221, 163}},
{Hostname: "sof-002.vpn.privado.io", IP: net.IP{217, 138, 221, 169}},
{Hostname: "stl-001.vpn.privado.io", IP: net.IP{148, 72, 170, 145}},
{Hostname: "stl-002.vpn.privado.io", IP: net.IP{148, 72, 172, 82}},
{Hostname: "syd-001.vpn.privado.io", IP: net.IP{93, 115, 35, 35}},
{Hostname: "syd-002.vpn.privado.io", IP: net.IP{93, 115, 35, 42}},
{Hostname: "syd-003.vpn.privado.io", IP: net.IP{93, 115, 35, 49}},
{Hostname: "syd-004.vpn.privado.io", IP: net.IP{93, 115, 35, 56}},
{Hostname: "vie-001.vpn.privado.io", IP: net.IP{5, 253, 207, 227}},
{Hostname: "vie-002.vpn.privado.io", IP: net.IP{5, 253, 207, 234}},
{Hostname: "vie-003.vpn.privado.io", IP: net.IP{5, 253, 207, 241}},
{Hostname: "vie-004.vpn.privado.io", IP: net.IP{5, 253, 207, 248}},
{Hostname: "vno-001.vpn.privado.io", IP: net.IP{185, 64, 104, 176}},
{Hostname: "vno-002.vpn.privado.io", IP: net.IP{185, 64, 104, 180}},
{Hostname: "waw-001.vpn.privado.io", IP: net.IP{217, 138, 209, 163}},
{Hostname: "waw-002.vpn.privado.io", IP: net.IP{217, 138, 209, 164}},
{Hostname: "waw-003.vpn.privado.io", IP: net.IP{217, 138, 209, 165}},
{Hostname: "waw-004.vpn.privado.io", IP: net.IP{217, 138, 209, 166}},
{Hostname: "yul-001.vpn.privado.io", IP: net.IP{217, 138, 213, 67}},
{Hostname: "waw-007.vpn.privado.io", IP: net.IP{146, 59, 31, 6}},
{Hostname: "waw-009.vpn.privado.io", IP: net.IP{146, 59, 31, 10}},
{Hostname: "waw-013.vpn.privado.io", IP: net.IP{146, 59, 31, 18}},
{Hostname: "waw-015.vpn.privado.io", IP: net.IP{146, 59, 31, 22}},
{Hostname: "waw-017.vpn.privado.io", IP: net.IP{146, 59, 31, 26}},
{Hostname: "waw-020.vpn.privado.io", IP: net.IP{146, 59, 31, 32}},
{Hostname: "waw-021.vpn.privado.io", IP: net.IP{146, 59, 31, 34}},
{Hostname: "waw-022.vpn.privado.io", IP: net.IP{146, 59, 31, 36}},
{Hostname: "waw-023.vpn.privado.io", IP: net.IP{146, 59, 31, 38}},
{Hostname: "waw-024.vpn.privado.io", IP: net.IP{146, 59, 31, 40}},
{Hostname: "waw-026.vpn.privado.io", IP: net.IP{146, 59, 31, 44}},
{Hostname: "waw-030.vpn.privado.io", IP: net.IP{146, 59, 31, 52}},
{Hostname: "waw-031.vpn.privado.io", IP: net.IP{146, 59, 31, 54}},
{Hostname: "waw-032.vpn.privado.io", IP: net.IP{146, 59, 31, 56}},
{Hostname: "waw-034.vpn.privado.io", IP: net.IP{146, 59, 31, 60}},
{Hostname: "waw-035.vpn.privado.io", IP: net.IP{146, 59, 31, 62}},
{Hostname: "waw-036.vpn.privado.io", IP: net.IP{146, 59, 31, 64}},
{Hostname: "waw-037.vpn.privado.io", IP: net.IP{146, 59, 31, 66}},
{Hostname: "waw-042.vpn.privado.io", IP: net.IP{146, 59, 31, 76}},
{Hostname: "waw-043.vpn.privado.io", IP: net.IP{146, 59, 31, 78}},
{Hostname: "waw-045.vpn.privado.io", IP: net.IP{146, 59, 31, 82}},
{Hostname: "waw-047.vpn.privado.io", IP: net.IP{146, 59, 31, 86}},
{Hostname: "waw-048.vpn.privado.io", IP: net.IP{146, 59, 31, 88}},
{Hostname: "waw-049.vpn.privado.io", IP: net.IP{146, 59, 31, 90}},
{Hostname: "waw-053.vpn.privado.io", IP: net.IP{146, 59, 31, 98}},
{Hostname: "waw-055.vpn.privado.io", IP: net.IP{146, 59, 31, 102}},
{Hostname: "waw-058.vpn.privado.io", IP: net.IP{146, 59, 31, 109}},
{Hostname: "yul-002.vpn.privado.io", IP: net.IP{217, 138, 213, 72}},
{Hostname: "yul-003.vpn.privado.io", IP: net.IP{217, 138, 213, 77}},
{Hostname: "yul-004.vpn.privado.io", IP: net.IP{217, 138, 213, 82}},
{Hostname: "yvr-001.vpn.privado.io", IP: net.IP{71, 19, 248, 57}},
{Hostname: "yvr-002.vpn.privado.io", IP: net.IP{71, 19, 248, 113}},
{Hostname: "yyz-003.vpn.privado.io", IP: net.IP{199, 189, 27, 19}},
{Hostname: "zrh-001.vpn.privado.io", IP: net.IP{185, 156, 175, 195}},
{Hostname: "zrh-002.vpn.privado.io", IP: net.IP{185, 156, 175, 202}},
{Hostname: "zrh-003.vpn.privado.io", IP: net.IP{185, 156, 175, 209}},
{Hostname: "zrh-004.vpn.privado.io", IP: net.IP{185, 156, 175, 216}},
}
}

View File

@@ -46,35 +46,25 @@ func PrivatevpnServers() []models.PrivatevpnServer {
{Country: "Argentina", City: "Buenos Aires", Hostname: "ar-bue.pvdata.host", IPs: []net.IP{{181, 119, 160, 59}}},
{Country: "Australia", City: "Melbourne", Hostname: "au-mel.pvdata.host", IPs: []net.IP{{103, 231, 88, 203}}},
{Country: "Australia", City: "Sydney", Hostname: "au-syd.pvdata.host", IPs: []net.IP{{143, 244, 63, 96}}},
{Country: "Austria", City: "Wien", Hostname: "at-wie.pvdata.host", IPs: []net.IP{{185, 9, 19, 91}}},
{Country: "Belgium", City: "Brussels", Hostname: "be-bru.pvdata.host", IPs: []net.IP{{185, 104, 186, 211}}},
{Country: "Brazil", City: "Sao Paulo", Hostname: "br-sao.pvdata.host", IPs: []net.IP{{45, 162, 230, 59}}},
{Country: "Bulgaria", City: "Sofia", Hostname: "bg-sof.pvdata.host", IPs: []net.IP{{185, 94, 192, 163}}},
{Country: "Canada", City: "Montreal", Hostname: "ca-mon.pvdata.host", IPs: []net.IP{{37, 120, 237, 163}, {87, 101, 92, 131}}},
{Country: "Canada", City: "Toronto", Hostname: "ca-tor.pvdata.host", IPs: []net.IP{{45, 148, 7, 3}, {45, 148, 7, 6}, {45, 148, 7, 8}}},
{Country: "Canada", City: "Vancouver", Hostname: "ca-van.pvdata.host", IPs: []net.IP{{74, 3, 160, 19}}},
{Country: "Chile", City: "Santiago", Hostname: "cl-san.pvdata.host", IPs: []net.IP{{216, 241, 14, 227}}},
{Country: "Colombia", City: "Bogot\xa0", Hostname: "ca-tor.pvdata.host", IPs: []net.IP{{45, 148, 7, 3}, {45, 148, 7, 6}, {45, 148, 7, 8}}},
{Country: "Costa Rica", City: "San Jose", Hostname: "cr-san.pvdata.host", IPs: []net.IP{{190, 10, 8, 218}}},
{Country: "Croatia", City: "Zagreb", Hostname: "hr-zag.pvdata.host", IPs: []net.IP{{85, 10, 56, 127}}},
{Country: "Cyprus", City: "Nicosia", Hostname: "cy-nic.pvdata.host", IPs: []net.IP{{185, 173, 226, 47}}},
{Country: "Czech Republic", City: "Prague", Hostname: "cz-pra.pvdata.host", IPs: []net.IP{{185, 156, 174, 179}}},
{Country: "Denmark", City: "Copenhagen", Hostname: "dk-cop.pvdata.host", IPs: []net.IP{{62, 115, 255, 188}, {62, 115, 255, 189}}},
{Country: "France", City: "Paris", Hostname: "fr-par.pvdata.host", IPs: []net.IP{{80, 239, 199, 102}, {80, 239, 199, 103}, {80, 239, 199, 104}, {80, 239, 199, 105}}},
{Country: "Germany", City: "Frankfurt", Hostname: "de-fra.pvdata.host", IPs: []net.IP{{193, 180, 119, 130}, {193, 180, 119, 131}}},
{Country: "Germany", City: "Nuremberg", Hostname: "de-nur.pvdata.host", IPs: []net.IP{{185, 89, 36, 3}}},
{Country: "Greece", City: "Athens", Hostname: "gr-ath.pvdata.host", IPs: []net.IP{{154, 57, 3, 33}}},
{Country: "Hong Kong", City: "Hong Kong", Hostname: "hk-hon.pvdata.host", IPs: []net.IP{{84, 17, 37, 58}}},
{Country: "Hungary", City: "Budapest", Hostname: "hu-bud.pvdata.host", IPs: []net.IP{{185, 104, 187, 67}}},
{Country: "Iceland", City: "Reykjavik", Hostname: "is-rey.pvdata.host", IPs: []net.IP{{82, 221, 113, 210}}},
{Country: "Indonesia", City: "Jakarta", Hostname: "id-jak.pvdata.host", IPs: []net.IP{{23, 248, 170, 136}}},
{Country: "Ireland", City: "Dublin", Hostname: "ie-dub.pvdata.host", IPs: []net.IP{{217, 138, 222, 67}}},
{Country: "Isle of Man", City: "Ballasalla", Hostname: "im-bal.pvdata.host", IPs: []net.IP{{81, 27, 96, 89}}},
{Country: "Italy", City: "Milan", Hostname: "it-mil.pvdata.host", IPs: []net.IP{{217, 212, 240, 90}, {217, 212, 240, 91}, {217, 212, 240, 92}, {217, 212, 240, 93}}},
{Country: "Japan", City: "Tokyo", Hostname: "jp-tok.pvdata.host", IPs: []net.IP{{89, 187, 160, 154}}},
{Country: "Korea", City: "Seoul", Hostname: "kr-seo.pvdata.host", IPs: []net.IP{{92, 223, 73, 37}}},
{Country: "Latvia", City: "Riga", Hostname: "lv-rig.pvdata.host", IPs: []net.IP{{80, 233, 134, 165}}},
{Country: "Lithuania", City: "Siauliai", Hostname: "lt-sia.pvdata.host", IPs: []net.IP{{5, 199, 171, 93}}},
{Country: "Luxembourg", City: "Steinsel", Hostname: "lu-ste.pvdata.host", IPs: []net.IP{{94, 242, 250, 71}}},
{Country: "Malaysia", City: "Kuala Lumpur", Hostname: "my-kua.pvdata.host", IPs: []net.IP{{128, 1, 160, 184}}},
{Country: "Malta", City: "Qormi", Hostname: "mt-qor.pvdata.host", IPs: []net.IP{{130, 185, 255, 25}}},
{Country: "Mexico", City: "Mexico City", Hostname: "mx-mex.pvdata.host", IPs: []net.IP{{190, 60, 16, 28}}},
@@ -83,37 +73,27 @@ func PrivatevpnServers() []models.PrivatevpnServer {
{Country: "New Zealand", City: "Auckland", Hostname: "nz-auc.pvdata.host", IPs: []net.IP{{45, 252, 191, 34}}},
{Country: "Norway", City: "Oslo", Hostname: "no-osl.pvdata.host", IPs: []net.IP{{91, 205, 186, 26}}},
{Country: "Panama", City: "Panama City", Hostname: "pa-pan.pvdata.host", IPs: []net.IP{{200, 110, 155, 235}}},
{Country: "Peru", City: "Lima", Hostname: "pe-lim.pvdata.host", IPs: []net.IP{{170, 0, 81, 107}}},
{Country: "Philippines", City: "Manila", Hostname: "ph-man.pvdata.host", IPs: []net.IP{{128, 1, 209, 12}}},
{Country: "Portugal", City: "Lisbon", Hostname: "pt-lis.pvdata.host", IPs: []net.IP{{130, 185, 85, 107}}},
{Country: "Romania", City: "Bukarest", Hostname: "ro-buk.pvdata.host", IPs: []net.IP{{89, 40, 181, 203}}},
{Country: "Russian Federation", City: "Krasnoyarsk", Hostname: "ru-kra.pvdata.host", IPs: []net.IP{{92, 223, 87, 11}}},
{Country: "Russian Federation", City: "Moscow", Hostname: "ru-mos.pvdata.host", IPs: []net.IP{{92, 223, 103, 138}}},
{Country: "Russian Federation", City: "St Petersburg", Hostname: "ru-pet.pvdata.host", IPs: []net.IP{{95, 213, 148, 99}}},
{Country: "Serbia", City: "Belgrade", Hostname: "rs-bel.pvdata.host", IPs: []net.IP{{141, 98, 103, 166}}},
{Country: "Slovakia", City: "Bratislava", Hostname: "sg-sin.pvdata.host", IPs: []net.IP{{143, 244, 33, 81}}},
{Country: "Singapore", City: "Singapore", Hostname: "sg-sin.pvdata.host", IPs: []net.IP{{143, 244, 33, 81}}},
{Country: "South Africa", City: "Johannesburg", Hostname: "us-nyc.pvdata.host", IPs: []net.IP{{45, 130, 86, 3}, {45, 130, 86, 5}, {45, 130, 86, 8}, {45, 130, 86, 10}, {45, 130, 86, 12}}},
{Country: "Spain", City: "Madrid", Hostname: "es-mad.pvdata.host", IPs: []net.IP{{217, 212, 244, 92}, {217, 212, 244, 93}}},
{Country: "Sweden", City: "Gothenburg", Hostname: "se-got.pvdata.host", IPs: []net.IP{{193, 187, 91, 19}}},
{Country: "Sweden", City: "Kista", Hostname: "se-kis.pvdata.host", IPs: []net.IP{{193, 187, 88, 216}, {193, 187, 88, 217}, {193, 187, 88, 218}, {193, 187, 88, 219}, {193, 187, 88, 220}, {193, 187, 88, 221}, {193, 187, 88, 222}}},
{Country: "Sweden", City: "Stockholm", Hostname: "se-sto.pvdata.host", IPs: []net.IP{{193, 180, 119, 2}, {193, 180, 119, 6}, {193, 180, 119, 7}}},
{Country: "Switzerland", City: "Zurich", Hostname: "ch-zur.pvdata.host", IPs: []net.IP{{217, 212, 245, 92}, {217, 212, 245, 93}}},
{Country: "Sweden", City: "Stockholm", Hostname: "se-sto.pvdata.host", IPs: []net.IP{{45, 130, 87, 3}, {45, 130, 87, 5}, {193, 180, 119, 2}, {193, 180, 119, 3}, {193, 180, 119, 4}, {193, 180, 119, 5}, {193, 180, 119, 6}, {193, 180, 119, 7}}},
{Country: "Taiwan", City: "Taipei", Hostname: "tw-tai.pvdata.host", IPs: []net.IP{{2, 58, 241, 51}}},
{Country: "Thailand", City: "Bangkok", Hostname: "th-ban.pvdata.host", IPs: []net.IP{{103, 27, 203, 234}}},
{Country: "Turkey", City: "Istanbul", Hostname: "tr-ist.pvdata.host", IPs: []net.IP{{92, 38, 180, 28}}},
{Country: "Ukraine", City: "Kiev", Hostname: "ua-kie.pvdata.host", IPs: []net.IP{{192, 121, 68, 131}}},
{Country: "Ukraine", City: "Nikolaev", Hostname: "ua-nik.pvdata.host", IPs: []net.IP{{194, 54, 83, 21}}},
{Country: "United Arab Emirates", City: "Dubai", Hostname: "ae-dub.pvdata.host", IPs: []net.IP{{45, 9, 249, 59}}},
{Country: "United Kingdom", City: "London", Hostname: "uk-lon.pvdata.host", IPs: []net.IP{{193, 180, 119, 66}, {193, 180, 119, 67}, {193, 180, 119, 68}, {193, 180, 119, 69}, {193, 180, 119, 70}}},
{Country: "United Kingdom", City: "London", Hostname: "uk-lon2.pvdata.host", IPs: []net.IP{{185, 41, 242, 67}}},
{Country: "United Kingdom", City: "London", Hostname: "uk-lon7.pvdata.host", IPs: []net.IP{{185, 125, 204, 179}}},
{Country: "United Kingdom", City: "Manchester", Hostname: "uk-man.pvdata.host", IPs: []net.IP{{185, 206, 227, 181}}},
{Country: "United States", City: "Buffalo", Hostname: "us-buf.pvdata.host", IPs: []net.IP{{172, 245, 13, 115}, {192, 210, 199, 35}}},
{Country: "United States", City: "Chicago", Hostname: "us-chi.pvdata.host", IPs: []net.IP{{185, 93, 1, 114}}},
{Country: "United States", City: "Dallas", Hostname: "us-dal.pvdata.host", IPs: []net.IP{{89, 187, 164, 97}}},
{Country: "United States", City: "Las Vegas", Hostname: "us-las.pvdata.host", IPs: []net.IP{{82, 102, 30, 19}}},
{Country: "United States", City: "Los Angeles", Hostname: "us-los.pvdata.host", IPs: []net.IP{{89, 187, 185, 78}, {185, 152, 67, 132}}},
{Country: "United States", City: "Miami", Hostname: "us-mia.pvdata.host", IPs: []net.IP{{195, 181, 163, 139}}},
{Country: "United States", City: "New York", Hostname: "us-nyc.pvdata.host", IPs: []net.IP{{45, 130, 86, 3}, {45, 130, 86, 5}, {45, 130, 86, 8}, {45, 130, 86, 10}, {45, 130, 86, 12}}},
{Country: "United States", City: "Phoenix", Hostname: "us-pho.pvdata.host", IPs: []net.IP{{82, 102, 30, 131}}},
{Country: "Vietnam", City: "Ho Chi Minh City", Hostname: "vn-hoc.pvdata.host", IPs: []net.IP{{210, 2, 64, 5}}},
}

File diff suppressed because it is too large Load Diff

View File

@@ -45,43 +45,40 @@ func PurevpnCityChoices() (choices []string) {
// PurevpnServers returns a slice of all the server information for Purevpn.
func PurevpnServers() []models.PurevpnServer {
return []models.PurevpnServer{
{Country: "Australia", Region: "New South Wales", City: "Sydney", IPs: []net.IP{{192, 253, 241, 4}, {43, 245, 161, 84}}},
{Country: "Australia", Region: "Western Australia", City: "Perth", IPs: []net.IP{{172, 94, 123, 4}}},
{Country: "Austria", Region: "Lower Austria", City: "Langenzersdorf", IPs: []net.IP{{172, 94, 109, 4}}},
{Country: "Austria", Region: "Vienna", City: "Vienna", IPs: []net.IP{{217, 64, 127, 251}}},
{Country: "Belgium", Region: "Flanders", City: "Zaventem", IPs: []net.IP{{172, 111, 223, 4}}},
{Country: "Bulgaria", Region: "Sofia-Capital", City: "Sofia", IPs: []net.IP{{217, 138, 221, 121}}},
{Country: "Canada", Region: "Alberta", City: "Calgary", IPs: []net.IP{{172, 94, 34, 4}}},
{Country: "Canada", Region: "Ontario", City: "Toronto", IPs: []net.IP{{104, 200, 138, 196}}},
{Country: "France", Region: "Île-de-France", City: "Paris", IPs: []net.IP{{89, 40, 183, 178}}},
{Country: "Germany", Region: "Hesse", City: "Frankfurt am Main", IPs: []net.IP{{82, 102, 16, 110}}},
{Country: "Greece", Region: "Central Macedonia", City: "Thessaloníki", IPs: []net.IP{{178, 21, 169, 244}}},
{Country: "Hong Kong", Region: "Central and Western", City: "Hong Kong", IPs: []net.IP{{103, 109, 103, 60}, {43, 226, 231, 4}}},
{Country: "Hong Kong", Region: "Kowloon City", City: "Kowloon", IPs: []net.IP{{36, 255, 97, 3}}},
{Country: "Italy", Region: "Trentino-Alto Adige", City: "Trento", IPs: []net.IP{{172, 111, 173, 3}}},
{Country: "Japan", Region: "Ōsaka", City: "Osaka", IPs: []net.IP{{172, 94, 56, 4}}},
{Country: "Malaysia", Region: "Kuala Lumpur", City: "Kuala Lumpur", IPs: []net.IP{{103, 55, 10, 133}}},
{Country: "Netherlands", Region: "North Holland", City: "Amsterdam", IPs: []net.IP{{79, 142, 64, 51}}},
{Country: "Australia", Region: "New South Wales", City: "Sydney", IPs: []net.IP{{43, 245, 161, 80}, {43, 245, 161, 82}}},
{Country: "Australia", Region: "Western Australia", City: "Perth", IPs: []net.IP{{43, 250, 205, 53}, {43, 250, 205, 54}, {43, 250, 205, 54}}},
{Country: "Austria", Region: "Vienna", City: "Vienna", IPs: []net.IP{{37, 120, 212, 218}, {37, 120, 212, 220}, {37, 120, 212, 221}, {172, 94, 109, 4}}},
{Country: "Belgium", Region: "Flanders", City: "Zaventem", IPs: []net.IP{{217, 138, 211, 86}, {217, 138, 211, 87}, {217, 138, 221, 117}, {217, 138, 221, 120}}},
{Country: "Brazil", Region: "São Paulo", City: "São Paulo", IPs: []net.IP{{181, 41, 201, 77}, {181, 41, 201, 82}, {181, 41, 201, 85}}},
{Country: "Canada", Region: "British Columbia", City: "Vancouver", IPs: []net.IP{{66, 115, 147, 37}, {66, 115, 147, 43}}},
{Country: "Canada", Region: "Ontario", City: "Toronto", IPs: []net.IP{{104, 200, 138, 178}, {104, 200, 138, 215}, {104, 200, 138, 217}, {104, 200, 138, 220}}},
{Country: "Czech Republic", Region: "Hlavní město Praha", City: "Prague", IPs: []net.IP{{217, 138, 199, 250}, {217, 138, 199, 252}}},
{Country: "France", Region: "Île-de-France", City: "Paris", IPs: []net.IP{{45, 152, 181, 68}, {172, 111, 219, 4}}},
{Country: "Germany", Region: "Hesse", City: "Frankfurt am Main", IPs: []net.IP{{2, 57, 18, 18}, {5, 254, 82, 51}, {5, 254, 88, 170}, {5, 254, 88, 174}, {199, 116, 116, 50}}},
{Country: "Hong Kong", Region: "Central and Western", City: "Hong Kong", IPs: []net.IP{{46, 243, 250, 4}, {128, 1, 209, 19}, {128, 1, 209, 54}}},
{Country: "Indonesia", Region: "Aceh", City: "Bireun", IPs: []net.IP{{169, 38, 97, 241}, {169, 38, 97, 242}, {169, 38, 129, 20}}},
{Country: "Italy", Region: "Lombardy", City: "Milan", IPs: []net.IP{{172, 111, 173, 3}}},
{Country: "Japan", Region: "Okinawa", City: "Hirara", IPs: []net.IP{{128, 1, 155, 178}}},
{Country: "Japan", Region: "Tokyo", City: "Tokyo", IPs: []net.IP{{185, 242, 4, 59}}},
{Country: "Korea", Region: "Seoul", City: "Seoul", IPs: []net.IP{{43, 226, 231, 4}, {43, 226, 231, 6}}},
{Country: "Malaysia", Region: "Kuala Lumpur", City: "Kuala Lumpur", IPs: []net.IP{{103, 28, 90, 32}, {103, 55, 10, 4}, {103, 55, 10, 133}}},
{Country: "Netherlands", Region: "North Holland", City: "Amsterdam", IPs: []net.IP{{104, 37, 6, 4}, {5, 254, 73, 172}, {92, 119, 179, 196}}},
{Country: "Norway", Region: "Oslo", City: "Oslo", IPs: []net.IP{{82, 102, 22, 212}}},
{Country: "Poland", Region: "Mazovia", City: "Warsaw", IPs: []net.IP{{5, 253, 206, 251}}},
{Country: "Portugal", Region: "Lisbon", City: "Lisbon", IPs: []net.IP{{5, 154, 174, 3}}},
{Country: "Russian Federation", Region: "Moscow", City: "Moscow", IPs: []net.IP{{206, 123, 139, 4}}},
{Country: "Singapore", Region: "Singapore", City: "Singapore", IPs: []net.IP{{37, 120, 208, 147}, {129, 227, 107, 242}}},
{Country: "Russian Federation", Region: "St.-Petersburg", City: "Saint Petersburg", IPs: []net.IP{{94, 242, 54, 23}, {206, 123, 139, 4}}},
{Country: "Singapore", Region: "Singapore", City: "Singapore", IPs: []net.IP{{192, 253, 249, 132}, {37, 120, 208, 147}}},
{Country: "South Africa", Region: "Gauteng", City: "Johannesburg", IPs: []net.IP{{102, 165, 3, 34}}},
{Country: "Spain", Region: "Madrid", City: "Madrid", IPs: []net.IP{{217, 138, 218, 210}}},
{Country: "Sweden", Region: "Stockholm", City: "Kista", IPs: []net.IP{{172, 111, 246, 4}}},
{Country: "Switzerland", Region: "Zurich", City: "Zürich", IPs: []net.IP{{45, 12, 222, 106}}},
{Country: "Taiwan", Region: "Taiwan", City: "Taipei", IPs: []net.IP{{128, 1, 155, 178}}},
{Country: "United Kingdom", Region: "England", City: "Birmingham", IPs: []net.IP{{188, 72, 89, 4}}},
{Country: "United Kingdom", Region: "England", City: "London", IPs: []net.IP{{193, 9, 113, 70}, {104, 37, 6, 4}, {45, 141, 154, 189}}},
{Country: "United States", Region: "Arkansas", City: "Hot Springs", IPs: []net.IP{{172, 111, 147, 4}}},
{Country: "United States", Region: "Florida", City: "Miami", IPs: []net.IP{{86, 106, 87, 178}}},
{Country: "United States", Region: "Illinois", City: "Lincolnshire", IPs: []net.IP{{141, 101, 149, 4}, {141, 101, 149, 4}, {141, 101, 149, 4}, {141, 101, 149, 4}}},
{Country: "United States", Region: "Massachusetts", City: "Newton", IPs: []net.IP{{104, 243, 244, 2}}},
{Country: "United States", Region: "New Mexico", City: "Rio Rancho", IPs: []net.IP{{104, 243, 243, 131}}},
{Country: "United States", Region: "New York", City: "New York City", IPs: []net.IP{{172, 111, 149, 4}}},
{Country: "United States", Region: "Texas", City: "Dallas", IPs: []net.IP{{172, 94, 1, 4}, {172, 94, 1, 4}, {172, 94, 1, 4}, {172, 94, 1, 4}, {172, 94, 1, 4}, {172, 94, 1, 4}, {208, 84, 155, 104}}},
{Country: "United States", Region: "Virginia", City: "Reston", IPs: []net.IP{{5, 254, 77, 27}}},
{Country: "Vietnam", Region: "Ho Chi Minh", City: "Ho Chi Minh City", IPs: []net.IP{{192, 253, 249, 132}}},
{Country: "Sweden", Region: "Stockholm", City: "Stockholm", IPs: []net.IP{{45, 12, 220, 122}, {45, 12, 220, 126}, {86, 106, 103, 183}, {86, 106, 103, 185}, {86, 106, 103, 186}}},
{Country: "Switzerland", Region: "Zurich", City: "Zürich", IPs: []net.IP{{45, 12, 222, 100}, {45, 12, 222, 104}, {45, 12, 222, 106}, {45, 12, 222, 107}}},
{Country: "United Kingdom", Region: "England", City: "London", IPs: []net.IP{{193, 9, 113, 66}, {193, 9, 113, 66}}},
{Country: "United States", Region: "California", City: "Los Angeles", IPs: []net.IP{{104, 243, 243, 131}, {172, 94, 26, 4}, {172, 94, 26, 4}, {172, 94, 72, 4}}},
{Country: "United States", Region: "Florida", City: "Miami", IPs: []net.IP{{5, 254, 79, 114}, {5, 254, 79, 115}}},
{Country: "United States", Region: "Georgia", City: "Atlanta", IPs: []net.IP{{141, 101, 168, 4}}},
{Country: "United States", Region: "New Jersey", City: "Harrison", IPs: []net.IP{{172, 111, 149, 4}}},
{Country: "United States", Region: "New York", City: "New York City", IPs: []net.IP{{172, 94, 72, 4}, {172, 94, 72, 4}}},
{Country: "United States", Region: "Texas", City: "Dallas", IPs: []net.IP{{104, 217, 255, 178}, {104, 217, 255, 180}, {208, 84, 155, 106}}},
{Country: "United States", Region: "Utah", City: "Salt Lake City", IPs: []net.IP{{45, 74, 52, 4}, {172, 94, 1, 4}, {172, 94, 26, 4}, {45, 74, 52, 4}, {172, 94, 1, 4}, {45, 74, 52, 4}, {141, 101, 168, 4}, {172, 94, 1, 4}, {45, 74, 52, 4}, {141, 101, 168, 4}, {172, 94, 26, 4}, {45, 74, 52, 4}, {141, 101, 168, 4}, {172, 94, 1, 4}, {172, 94, 72, 4}, {45, 74, 52, 4}, {45, 74, 52, 4}}},
{Country: "United States", Region: "Virginia", City: "Reston", IPs: []net.IP{{5, 254, 77, 27}, {5, 254, 77, 29}, {5, 254, 77, 140}, {5, 254, 77, 141}}},
}
}

View File

@@ -8,17 +8,17 @@ func GetAllServers() (allServers models.AllServers) {
Version: 1, // used for migration of the top level scheme
Cyberghost: models.CyberghostServers{
Version: 1, // model version
Timestamp: 1612031135, // latest takes precedence
Timestamp: 1620326951, // latest takes precedence
Servers: CyberghostServers(),
},
Fastestvpn: models.FastestvpnServers{
Version: 1,
Timestamp: 1613323814,
Timestamp: 1620326951,
Servers: FastestvpnServers(),
},
HideMyAss: models.HideMyAssServers{
Version: 1,
Timestamp: 1614562368,
Timestamp: 1620326951,
Servers: HideMyAssServers(),
},
Mullvad: models.MullvadServers{
@@ -33,27 +33,32 @@ func GetAllServers() (allServers models.AllServers) {
},
Privado: models.PrivadoServers{
Version: 2,
Timestamp: 1612031135,
Timestamp: 1620326951,
Servers: PrivadoServers(),
},
Privatevpn: models.PrivatevpnServers{
Version: 1,
Timestamp: 1613861528,
Timestamp: 1620326951,
Servers: PrivatevpnServers(),
},
Protonvpn: models.ProtonvpnServers{
Version: 1,
Timestamp: 1618605078,
Servers: ProtonvpnServers(),
},
Pia: models.PiaServers{
Version: 4,
Timestamp: 1613480675,
Timestamp: 1619272345,
Servers: PIAServers(),
},
Purevpn: models.PurevpnServers{
Version: 1,
Timestamp: 1612031135,
Timestamp: 1620326951,
Servers: PurevpnServers(),
},
Surfshark: models.SurfsharkServers{
Version: 1,
Timestamp: 1618612180,
Timestamp: 1620326951,
Servers: SurfsharkServers(),
},
Torguard: models.TorguardServers{
@@ -63,7 +68,7 @@ func GetAllServers() (allServers models.AllServers) {
},
Vyprvpn: models.VyprvpnServers{
Version: 1,
Timestamp: 1612031135,
Timestamp: 1620326951,
Servers: VyprvpnServers(),
},
Windscribe: models.WindscribeServers{

View File

@@ -74,6 +74,11 @@ func Test_versions(t *testing.T) {
version: allServers.Privatevpn.Version,
digest: "cba13d78",
},
"Protonvpn": {
model: models.ProtonvpnServer{},
version: allServers.Protonvpn.Version,
digest: "b964085b",
},
"Purevpn": {
model: models.PurevpnServer{},
version: allServers.Purevpn.Version,
@@ -138,17 +143,17 @@ func Test_timestamps(t *testing.T) {
"Cyberghost": {
servers: allServers.Cyberghost.Servers,
timestamp: allServers.Cyberghost.Timestamp,
digest: "5d3a8cbf",
digest: "81d0cc77",
},
"Fastestvpn": {
servers: allServers.Fastestvpn.Version,
timestamp: allServers.Fastestvpn.Timestamp,
digest: "da65734a",
digest: "feccb41a",
},
"HideMyAss": {
servers: allServers.HideMyAss.Servers,
timestamp: allServers.HideMyAss.Timestamp,
digest: "38c71676",
digest: "546a98cb",
},
"Mullvad": {
servers: allServers.Mullvad.Servers,
@@ -163,27 +168,32 @@ func Test_timestamps(t *testing.T) {
"Privado": {
servers: allServers.Privado.Servers,
timestamp: allServers.Privado.Timestamp,
digest: "2ac55360",
digest: "e7968fd3",
},
"Private Internet Access": {
servers: allServers.Pia.Servers,
timestamp: allServers.Pia.Timestamp,
digest: "e0f95a01",
digest: "403bdc67",
},
"Privatevpn": {
servers: allServers.Privatevpn.Servers,
timestamp: allServers.Privatevpn.Timestamp,
digest: "8ce3fba1",
digest: "6d32d785",
},
"Protonvpn": {
servers: allServers.Protonvpn.Servers,
timestamp: allServers.Protonvpn.Timestamp,
digest: "c342020e",
},
"Purevpn": {
servers: allServers.Purevpn.Servers,
timestamp: allServers.Purevpn.Timestamp,
digest: "cd19edf5",
digest: "617505bd",
},
"Surfshark": {
servers: allServers.Surfshark.Servers,
timestamp: allServers.Surfshark.Timestamp,
digest: "c090bcd9",
digest: "38e7ea80",
},
"Torguard": {
servers: allServers.Torguard.Servers,
@@ -193,7 +203,7 @@ func Test_timestamps(t *testing.T) {
"Vyprvpn": {
servers: allServers.Vyprvpn.Servers,
timestamp: allServers.Vyprvpn.Timestamp,
digest: "1753d4f8",
digest: "eccb7f5c",
},
"Windscribe": {
servers: allServers.Windscribe.Servers,

View File

@@ -21,68 +21,68 @@ func SurfsharkRegionChoices() (choices []string) {
return makeUnique(choices)
}
//nolint:lll,dupl
//nolint:lll
// SurfsharkServers returns a slice of all the server information for Surfshark.
func SurfsharkServers() []models.SurfsharkServer {
return []models.SurfsharkServer{
{Region: "Albania", IPs: []net.IP{{31, 171, 152, 197}, {31, 171, 153, 19}, {31, 171, 153, 21}, {31, 171, 153, 83}, {31, 171, 153, 115}, {31, 171, 153, 117}, {31, 171, 153, 163}, {31, 171, 153, 165}, {31, 171, 154, 101}, {31, 171, 154, 163}, {31, 171, 154, 165}, {31, 171, 154, 219}, {31, 171, 154, 221}, {31, 171, 155, 37}, {31, 171, 155, 69}, {31, 171, 155, 101}}},
{Region: "Argentina Buenos Aires", IPs: []net.IP{{91, 206, 168, 3}, {91, 206, 168, 5}, {91, 206, 168, 9}, {91, 206, 168, 11}, {91, 206, 168, 13}, {91, 206, 168, 15}, {91, 206, 168, 19}, {91, 206, 168, 29}, {91, 206, 168, 31}, {91, 206, 168, 34}, {91, 206, 168, 50}, {91, 206, 168, 54}, {91, 206, 168, 58}, {91, 206, 168, 60}, {91, 206, 168, 64}, {91, 206, 168, 66}, {91, 206, 168, 68}, {91, 206, 168, 70}}},
{Region: "Australia Adelaide", IPs: []net.IP{{45, 248, 79, 19}, {45, 248, 79, 21}, {45, 248, 79, 27}, {45, 248, 79, 29}, {45, 248, 79, 35}, {45, 248, 79, 37}, {45, 248, 79, 51}, {45, 248, 79, 53}, {45, 248, 79, 67}, {45, 248, 79, 69}, {45, 248, 79, 83}, {45, 248, 79, 85}}},
{Region: "Australia Brisbane", IPs: []net.IP{{45, 248, 77, 235}, {45, 248, 77, 237}, {144, 48, 39, 11}, {144, 48, 39, 13}, {144, 48, 39, 67}, {144, 48, 39, 69}, {144, 48, 39, 83}, {144, 48, 39, 85}, {144, 48, 39, 107}, {144, 48, 39, 109}, {144, 48, 39, 123}, {144, 48, 39, 125}, {144, 48, 39, 131}, {144, 48, 39, 133}}},
{Region: "Australia Melbourne", IPs: []net.IP{{103, 192, 80, 11}, {103, 192, 80, 13}, {103, 192, 80, 131}, {103, 192, 80, 133}, {103, 192, 80, 141}, {103, 192, 80, 147}, {103, 192, 80, 149}, {103, 192, 80, 229}, {103, 192, 80, 243}, {103, 192, 80, 245}, {103, 192, 80, 253}, {144, 48, 38, 19}, {144, 48, 38, 21}, {144, 48, 38, 139}, {144, 48, 38, 141}, {144, 48, 38, 149}, {144, 48, 38, 179}}},
{Region: "Australia Perth", IPs: []net.IP{{45, 248, 78, 43}, {45, 248, 78, 45}, {124, 150, 139, 27}, {124, 150, 139, 29}, {124, 150, 139, 35}, {124, 150, 139, 37}, {124, 150, 139, 45}, {124, 150, 139, 123}, {124, 150, 139, 125}, {124, 150, 139, 179}}},
{Region: "Australia Sydney", IPs: []net.IP{{45, 125, 247, 43}, {45, 125, 247, 91}, {45, 125, 247, 93}, {45, 125, 247, 107}, {45, 125, 247, 155}, {45, 125, 247, 157}, {45, 125, 247, 197}, {45, 248, 76, 171}, {103, 25, 59, 51}, {103, 25, 59, 53}, {180, 149, 228, 27}, {180, 149, 228, 117}, {180, 149, 228, 163}, {180, 149, 228, 165}, {180, 149, 228, 171}, {180, 149, 228, 173}, {180, 149, 228, 179}, {180, 149, 228, 181}}},
{Region: "Albania", IPs: []net.IP{{31, 171, 154, 99}, {31, 171, 152, 195}, {31, 171, 154, 101}, {31, 171, 153, 133}}},
{Region: "Argentina Buenos Aires", IPs: []net.IP{{91, 206, 168, 52}, {91, 206, 168, 29}, {91, 206, 168, 21}, {91, 206, 168, 50}}},
{Region: "Australia Adelaide", IPs: []net.IP{{45, 248, 79, 29}, {45, 248, 79, 35}, {45, 248, 79, 19}, {45, 248, 79, 37}, {45, 248, 79, 85}, {45, 248, 79, 51}}},
{Region: "Australia Brisbane", IPs: []net.IP{{45, 248, 77, 235}, {144, 48, 39, 109}}},
{Region: "Australia Melbourne", IPs: []net.IP{{144, 48, 38, 19}, {103, 192, 80, 11}, {103, 192, 80, 149}, {103, 192, 80, 229}}},
{Region: "Australia Perth", IPs: []net.IP{{124, 150, 139, 37}, {124, 150, 139, 179}, {124, 150, 139, 123}, {124, 150, 139, 27}, {124, 150, 139, 35}, {45, 248, 78, 45}}},
{Region: "Australia Sydney", IPs: []net.IP{{45, 248, 76, 171}, {103, 25, 59, 53}, {45, 125, 247, 107}, {45, 125, 247, 109}, {103, 25, 59, 51}, {45, 125, 247, 195}}},
{Region: "Australia US", IPs: []net.IP{{45, 76, 117, 108}}},
{Region: "Austria", IPs: []net.IP{{5, 253, 207, 53}, {5, 253, 207, 83}, {5, 253, 207, 85}, {37, 120, 212, 75}, {37, 120, 212, 77}, {37, 120, 212, 131}, {37, 120, 212, 133}, {37, 120, 212, 139}, {37, 120, 212, 141}, {37, 120, 212, 149}, {89, 187, 168, 41}, {89, 187, 168, 49}, {89, 187, 168, 54}, {89, 187, 168, 56}}},
{Region: "Azerbaijan", IPs: []net.IP{{62, 212, 239, 43}, {62, 212, 239, 45}, {62, 212, 239, 53}, {62, 212, 239, 69}}},
{Region: "Belgium", IPs: []net.IP{{5, 253, 205, 99}, {5, 253, 205, 181}, {5, 253, 205, 211}, {37, 120, 143, 117}, {37, 120, 218, 253}, {91, 90, 123, 123}, {91, 90, 123, 147}, {91, 90, 123, 155}, {91, 90, 123, 165}, {91, 90, 123, 171}, {91, 90, 123, 173}, {91, 90, 123, 197}, {185, 104, 186, 77}, {185, 104, 186, 173}, {185, 210, 217, 107}, {185, 210, 217, 109}, {185, 210, 217, 189}, {194, 110, 115, 67}, {194, 110, 115, 69}, {194, 110, 115, 91}, {194, 110, 115, 243}, {194, 110, 115, 245}, {217, 138, 211, 219}, {217, 138, 211, 221}}},
{Region: "Bosnia and Herzegovina", IPs: []net.IP{{185, 99, 3, 7}, {185, 99, 3, 94}, {185, 99, 3, 98}, {185, 99, 3, 108}, {185, 99, 3, 118}, {185, 99, 3, 141}, {185, 99, 3, 146}, {185, 99, 3, 207}, {185, 99, 3, 212}, {185, 164, 34, 250}, {185, 164, 34, 252}}},
{Region: "Brazil", IPs: []net.IP{{45, 231, 207, 68}, {45, 231, 207, 72}, {191, 96, 13, 38}, {191, 96, 13, 39}, {191, 96, 13, 41}, {191, 96, 13, 194}, {191, 96, 13, 196}, {191, 96, 13, 202}, {191, 96, 13, 210}, {191, 96, 13, 212}, {191, 96, 15, 84}, {191, 96, 15, 86}, {191, 96, 15, 90}, {191, 96, 73, 212}, {191, 96, 73, 216}, {191, 96, 73, 226}, {191, 96, 73, 228}, {191, 96, 73, 230}}},
{Region: "Bulgaria", IPs: []net.IP{{37, 120, 152, 35}, {37, 120, 152, 37}, {37, 120, 152, 39}, {37, 120, 152, 195}, {37, 120, 152, 197}, {217, 138, 202, 19}, {217, 138, 202, 21}}},
{Region: "Canada Montreal", IPs: []net.IP{{91, 245, 254, 19}, {91, 245, 254, 21}, {91, 245, 254, 35}, {91, 245, 254, 37}, {91, 245, 254, 45}, {91, 245, 254, 61}, {91, 245, 254, 77}, {91, 245, 254, 93}, {91, 245, 254, 109}, {91, 245, 254, 115}, {91, 245, 254, 123}, {91, 245, 254, 125}, {91, 245, 254, 133}, {172, 98, 82, 243}, {172, 98, 82, 245}}},
{Region: "Canada Toronto", IPs: []net.IP{{68, 71, 244, 131}, {68, 71, 244, 134}, {68, 71, 244, 195}, {68, 71, 244, 200}, {68, 71, 244, 202}, {68, 71, 244, 205}, {68, 71, 244, 212}, {68, 71, 244, 217}, {104, 200, 138, 5}, {104, 200, 138, 7}, {104, 200, 138, 99}, {104, 200, 138, 147}, {104, 200, 138, 149}, {104, 200, 138, 154}, {104, 200, 138, 165}, {162, 253, 71, 211}, {192, 111, 128, 136}, {192, 111, 128, 141}}},
{Region: "Austria", IPs: []net.IP{{37, 120, 212, 149}, {37, 120, 212, 133}, {37, 120, 212, 141}, {89, 187, 168, 51}, {89, 187, 168, 46}, {37, 120, 212, 139}}},
{Region: "Azerbaijan", IPs: []net.IP{{62, 212, 239, 67}}},
{Region: "Belgium", IPs: []net.IP{{217, 138, 211, 221}, {5, 253, 205, 211}}},
{Region: "Bosnia and Herzegovina", IPs: []net.IP{{185, 212, 111, 59}, {185, 99, 3, 12}, {185, 99, 3, 98}, {185, 99, 3, 108}}},
{Region: "Brazil", IPs: []net.IP{{191, 96, 73, 228}, {45, 231, 207, 70}, {191, 96, 13, 38}, {191, 96, 13, 202}}},
{Region: "Bulgaria", IPs: []net.IP{{37, 120, 152, 37}, {37, 120, 152, 195}, {37, 120, 152, 197}}},
{Region: "Canada Montreal", IPs: []net.IP{{172, 98, 82, 245}, {91, 245, 254, 69}, {91, 245, 254, 93}, {91, 245, 254, 43}, {91, 245, 254, 53}, {91, 245, 254, 21}, {91, 245, 254, 35}, {172, 98, 82, 243}}},
{Region: "Canada Toronto", IPs: []net.IP{{68, 71, 244, 195}, {68, 71, 244, 212}, {192, 111, 128, 143}, {192, 111, 128, 148}, {68, 71, 244, 131}, {104, 200, 138, 99}}},
{Region: "Canada Toronto mp001", IPs: []net.IP{{138, 197, 151, 26}}},
{Region: "Canada US", IPs: []net.IP{{159, 203, 57, 80}}},
{Region: "Canada Vancouver", IPs: []net.IP{{66, 115, 147, 67}, {66, 115, 147, 69}, {66, 115, 147, 72}, {66, 115, 147, 74}, {66, 115, 147, 77}, {66, 115, 147, 84}, {66, 115, 147, 89}, {66, 115, 147, 92}, {107, 181, 177, 181}, {172, 83, 40, 147}, {172, 83, 40, 149}, {198, 8, 92, 69}, {198, 8, 92, 72}, {198, 8, 92, 77}, {198, 8, 92, 82}, {198, 8, 92, 87}, {208, 78, 41, 195}, {208, 78, 41, 197}, {208, 78, 41, 200}, {208, 78, 41, 202}}},
{Region: "Chile", IPs: []net.IP{{31, 169, 121, 3}, {31, 169, 121, 5}}},
{Region: "Colombia", IPs: []net.IP{{45, 129, 32, 3}, {45, 129, 32, 5}, {45, 129, 32, 8}, {45, 129, 32, 10}, {45, 129, 32, 13}, {45, 129, 32, 15}, {45, 129, 32, 20}, {45, 129, 32, 22}, {45, 129, 32, 27}, {45, 129, 32, 29}, {45, 129, 32, 32}, {45, 129, 32, 34}, {45, 129, 32, 36}, {45, 129, 32, 38}}},
{Region: "Costa Rica", IPs: []net.IP{{176, 227, 241, 19}, {176, 227, 241, 21}, {176, 227, 241, 24}, {176, 227, 241, 26}, {176, 227, 241, 29}, {176, 227, 241, 31}, {176, 227, 241, 33}, {176, 227, 241, 35}}},
{Region: "Croatia", IPs: []net.IP{{85, 10, 50, 164}, {85, 10, 51, 91}, {85, 10, 56, 190}, {85, 10, 56, 192}, {85, 10, 56, 225}, {85, 10, 56, 227}, {89, 164, 99, 111}, {89, 164, 99, 134}, {176, 222, 34, 113}, {176, 222, 34, 115}, {176, 222, 34, 119}, {176, 222, 34, 121}}},
{Region: "Cyprus", IPs: []net.IP{{195, 47, 194, 34}, {195, 47, 194, 42}, {195, 47, 194, 52}, {195, 47, 194, 54}, {195, 47, 194, 58}, {195, 47, 194, 59}, {195, 47, 194, 61}, {195, 47, 194, 64}, {195, 47, 194, 66}, {195, 47, 194, 68}, {195, 47, 194, 70}, {195, 47, 194, 85}, {195, 47, 194, 87}, {195, 47, 194, 89}, {195, 47, 194, 91}, {195, 47, 194, 97}}},
{Region: "Czech Republic", IPs: []net.IP{{185, 180, 14, 147}, {185, 180, 14, 149}, {185, 180, 14, 151}, {185, 180, 14, 153}, {193, 9, 112, 179}, {193, 9, 112, 181}, {193, 9, 112, 195}, {193, 9, 112, 197}, {217, 138, 199, 179}, {217, 138, 199, 181}, {217, 138, 220, 123}, {217, 138, 220, 125}, {217, 138, 220, 131}, {217, 138, 220, 133}, {217, 138, 220, 139}, {217, 138, 220, 141}, {217, 138, 220, 149}, {217, 138, 220, 157}, {217, 138, 220, 163}, {217, 138, 220, 165}, {217, 138, 220, 179}, {217, 138, 220, 189}}},
{Region: "Denmark", IPs: []net.IP{{2, 58, 46, 3}, {2, 58, 46, 5}, {37, 120, 194, 125}, {37, 120, 194, 163}, {37, 120, 194, 165}, {45, 12, 221, 183}, {89, 45, 7, 53}, {193, 29, 107, 91}, {193, 29, 107, 93}, {193, 29, 107, 101}, {193, 29, 107, 115}, {193, 29, 107, 171}, {193, 29, 107, 179}, {193, 29, 107, 181}, {193, 29, 107, 195}, {193, 29, 107, 197}, {193, 29, 107, 205}, {193, 29, 107, 213}, {193, 29, 107, 221}, {193, 29, 107, 227}}},
{Region: "Estonia", IPs: []net.IP{{165, 231, 163, 3}, {165, 231, 163, 5}, {165, 231, 163, 19}, {165, 231, 163, 21}, {165, 231, 163, 23}, {185, 174, 159, 51}, {185, 174, 159, 59}, {185, 174, 159, 61}, {185, 174, 159, 67}, {185, 174, 159, 69}, {185, 174, 159, 131}, {185, 174, 159, 133}, {185, 174, 159, 136}, {185, 174, 159, 138}}},
{Region: "Finland", IPs: []net.IP{{196, 244, 191, 35}, {196, 244, 191, 37}, {196, 244, 191, 45}, {196, 244, 191, 91}, {196, 244, 191, 93}, {196, 244, 191, 99}, {196, 244, 191, 101}, {196, 244, 191, 107}, {196, 244, 191, 109}, {196, 244, 191, 163}, {196, 244, 191, 165}, {196, 244, 191, 179}, {196, 244, 191, 181}, {196, 244, 191, 197}}},
{Region: "France Bordeaux", IPs: []net.IP{{185, 108, 106, 19}, {185, 108, 106, 24}, {185, 108, 106, 51}, {185, 108, 106, 53}, {185, 108, 106, 72}, {185, 108, 106, 89}, {185, 108, 106, 91}, {185, 108, 106, 102}, {185, 108, 106, 106}, {185, 108, 106, 148}, {185, 108, 106, 150}, {185, 108, 106, 152}, {185, 108, 106, 158}, {185, 108, 106, 160}, {185, 108, 106, 164}, {185, 108, 106, 176}, {185, 108, 106, 184}, {185, 108, 106, 188}}},
{Region: "France Marseilles", IPs: []net.IP{{138, 199, 16, 130}, {138, 199, 16, 135}, {138, 199, 16, 137}, {138, 199, 16, 147}, {138, 199, 16, 152}, {185, 166, 84, 5}, {185, 166, 84, 19}, {185, 166, 84, 21}, {185, 166, 84, 29}, {185, 166, 84, 57}, {185, 166, 84, 59}, {185, 166, 84, 77}, {185, 166, 84, 81}, {185, 166, 84, 85}, {185, 166, 84, 91}, {185, 166, 84, 93}}},
{Region: "France Paris", IPs: []net.IP{{84, 17, 43, 180}, {84, 17, 43, 185}, {84, 17, 60, 235}, {84, 17, 60, 250}, {84, 247, 51, 243}, {84, 247, 51, 245}, {84, 247, 51, 251}, {143, 244, 56, 226}, {143, 244, 56, 228}, {143, 244, 56, 230}, {143, 244, 56, 232}, {143, 244, 57, 73}, {143, 244, 57, 83}, {143, 244, 57, 85}, {143, 244, 57, 91}, {143, 244, 57, 93}, {143, 244, 57, 99}, {143, 244, 57, 103}, {143, 244, 57, 106}, {143, 244, 57, 110}, {143, 244, 57, 112}, {143, 244, 57, 117}, {143, 244, 57, 122}, {185, 246, 211, 69}}},
{Region: "Canada Vancouver", IPs: []net.IP{{107, 181, 177, 183}, {107, 181, 177, 179}, {208, 78, 41, 195}, {66, 115, 147, 92}}},
{Region: "Chile", IPs: []net.IP{{31, 169, 121, 5}, {31, 169, 121, 3}}},
{Region: "Colombia", IPs: []net.IP{{45, 129, 32, 5}, {45, 129, 32, 32}, {45, 129, 32, 13}, {45, 129, 32, 27}, {45, 129, 32, 38}, {45, 129, 32, 29}}},
{Region: "Costa Rica", IPs: []net.IP{{176, 227, 241, 35}, {176, 227, 241, 19}, {176, 227, 241, 21}, {176, 227, 241, 26}}},
{Region: "Croatia", IPs: []net.IP{{176, 222, 34, 130}, {89, 164, 99, 134}, {89, 164, 99, 136}, {85, 10, 51, 89}}},
{Region: "Cyprus", IPs: []net.IP{{195, 47, 194, 42}, {195, 47, 194, 56}, {195, 47, 194, 61}, {195, 47, 194, 87}, {195, 47, 194, 40}, {195, 47, 194, 52}}},
{Region: "Czech Republic", IPs: []net.IP{{217, 138, 220, 141}, {193, 9, 112, 183}, {193, 9, 112, 195}, {217, 138, 220, 155}, {217, 138, 220, 131}, {217, 138, 220, 171}}},
{Region: "Denmark", IPs: []net.IP{{37, 120, 194, 91}, {193, 29, 107, 173}, {193, 29, 107, 197}, {193, 29, 107, 211}, {193, 29, 107, 101}, {37, 120, 194, 101}, {37, 120, 194, 93}, {193, 29, 107, 99}, {37, 120, 145, 21}, {89, 45, 7, 53}}},
{Region: "Estonia", IPs: []net.IP{{185, 174, 159, 138}, {185, 174, 159, 67}, {165, 231, 163, 21}, {185, 174, 159, 136}, {185, 174, 159, 61}, {185, 174, 159, 59}, {165, 231, 163, 19}, {165, 231, 163, 5}}},
{Region: "Finland", IPs: []net.IP{{196, 244, 191, 163}, {196, 244, 191, 91}, {196, 244, 191, 181}, {196, 244, 191, 43}, {196, 244, 191, 37}, {196, 244, 191, 101}}},
{Region: "France Bordeaux", IPs: []net.IP{{185, 108, 106, 24}, {185, 108, 106, 144}, {185, 108, 106, 51}, {185, 108, 106, 142}, {185, 108, 106, 102}, {185, 108, 106, 100}, {185, 108, 106, 74}, {185, 108, 106, 21}, {185, 108, 106, 106}, {185, 108, 106, 188}, {185, 108, 106, 158}, {185, 108, 106, 182}, {185, 108, 106, 162}, {185, 108, 106, 186}}},
{Region: "France Marseilles", IPs: []net.IP{{185, 166, 84, 33}, {138, 199, 16, 135}, {185, 166, 84, 93}, {185, 166, 84, 83}, {185, 166, 84, 17}, {185, 166, 84, 23}}},
{Region: "France Paris", IPs: []net.IP{{143, 244, 57, 71}, {143, 244, 57, 103}, {217, 138, 207, 251}, {84, 17, 43, 185}, {143, 244, 57, 85}, {45, 89, 174, 59}, {45, 83, 90, 183}, {143, 244, 57, 93}}},
{Region: "France Sweden", IPs: []net.IP{{199, 247, 8, 20}}},
{Region: "Germany Berlin", IPs: []net.IP{{37, 120, 217, 181}, {152, 89, 163, 21}, {152, 89, 163, 23}, {152, 89, 163, 229}, {152, 89, 163, 231}, {152, 89, 163, 243}, {152, 89, 163, 245}, {193, 29, 106, 3}, {193, 29, 106, 35}, {193, 29, 106, 43}, {193, 29, 106, 51}, {193, 29, 106, 59}, {193, 29, 106, 69}, {193, 29, 106, 99}, {193, 29, 106, 115}, {193, 29, 106, 133}, {193, 29, 106, 219}, {193, 29, 106, 221}, {193, 176, 86, 195}, {193, 176, 86, 199}}},
{Region: "Germany Frankfurt am Main", IPs: []net.IP{{37, 120, 196, 53}, {37, 120, 196, 171}, {45, 87, 212, 213}, {82, 102, 16, 99}, {89, 187, 169, 104}, {89, 187, 169, 119}, {138, 199, 19, 137}, {138, 199, 19, 149}, {138, 199, 19, 167}, {138, 199, 19, 169}, {138, 199, 19, 177}, {156, 146, 33, 65}, {156, 146, 33, 67}, {156, 146, 33, 79}, {156, 146, 33, 83}, {156, 146, 33, 87}}},
{Region: "Germany Berlin", IPs: []net.IP{{152, 89, 163, 243}, {152, 89, 163, 21}, {193, 176, 86, 195}, {37, 120, 217, 131}, {193, 29, 106, 179}, {193, 29, 106, 211}, {193, 29, 106, 123}, {193, 29, 106, 197}, {89, 36, 76, 53}, {193, 176, 86, 171}, {193, 29, 106, 27}}},
{Region: "Germany Frankfurt am Main", IPs: []net.IP{{37, 120, 197, 13}, {138, 199, 19, 154}, {82, 102, 16, 99}, {185, 59, 220, 150}}},
{Region: "Germany Frankfurt am Main st001", IPs: []net.IP{{45, 87, 212, 179}}},
{Region: "Germany Frankfurt am Main st002", IPs: []net.IP{{45, 87, 212, 181}}},
{Region: "Germany Frankfurt am Main st003", IPs: []net.IP{{45, 87, 212, 183}}},
{Region: "Germany Frankfurt am Main st004", IPs: []net.IP{{195, 181, 174, 226}}},
{Region: "Germany Frankfurt am Main st005", IPs: []net.IP{{195, 181, 174, 228}}},
{Region: "Germany Frankfurt mp001", IPs: []net.IP{{46, 101, 189, 14}}},
{Region: "Germany Munich", IPs: []net.IP{{79, 143, 191, 139}}},
{Region: "Germany Nuremberg", IPs: []net.IP{{62, 171, 151, 158}, {62, 171, 151, 160}, {144, 91, 123, 50}, {144, 91, 123, 52}}},
{Region: "Germany Munich", IPs: []net.IP{{79, 143, 191, 231}}},
{Region: "Germany Nuremberg", IPs: []net.IP{{62, 171, 151, 160}}},
{Region: "Germany Singapour", IPs: []net.IP{{159, 89, 14, 157}}},
{Region: "Germany UK", IPs: []net.IP{{46, 101, 250, 73}}},
{Region: "Greece", IPs: []net.IP{{194, 150, 167, 28}, {194, 150, 167, 30}, {194, 150, 167, 32}, {194, 150, 167, 34}, {194, 150, 167, 36}, {194, 150, 167, 38}, {194, 150, 167, 40}, {194, 150, 167, 42}, {194, 150, 167, 44}, {194, 150, 167, 46}, {194, 150, 167, 48}, {194, 150, 167, 50}, {194, 150, 167, 52}, {194, 150, 167, 54}}},
{Region: "Hong Kong", IPs: []net.IP{{84, 17, 37, 156}, {84, 17, 37, 158}, {84, 17, 37, 160}, {84, 17, 57, 66}, {84, 17, 57, 68}, {84, 17, 57, 73}, {84, 17, 57, 185}, {212, 102, 42, 196}, {212, 102, 42, 199}, {212, 102, 42, 201}, {212, 102, 42, 204}, {212, 102, 42, 206}, {212, 102, 42, 209}, {212, 102, 42, 211}}},
{Region: "Hungary", IPs: []net.IP{{37, 120, 144, 149}, {37, 120, 144, 151}, {37, 120, 144, 197}, {37, 120, 144, 199}, {37, 120, 144, 211}, {37, 120, 144, 213}, {37, 120, 144, 215}}},
{Region: "Iceland", IPs: []net.IP{{45, 133, 193, 107}, {45, 133, 193, 109}, {45, 133, 193, 115}, {45, 133, 193, 117}, {45, 133, 193, 211}, {45, 133, 193, 213}, {45, 133, 193, 219}, {45, 133, 193, 221}}},
{Region: "India Chennai", IPs: []net.IP{{103, 94, 27, 99}, {103, 94, 27, 101}, {103, 94, 27, 115}, {103, 94, 27, 117}, {103, 94, 27, 181}, {103, 94, 27, 227}, {103, 108, 117, 116}, {103, 108, 117, 118}, {103, 108, 117, 147}, {103, 108, 117, 149}, {103, 108, 117, 151}}},
{Region: "India Indore", IPs: []net.IP{{103, 39, 132, 187}, {103, 39, 132, 189}, {103, 39, 134, 59}, {103, 39, 134, 61}}},
{Region: "India Mumbai", IPs: []net.IP{{103, 156, 50, 87}, {103, 156, 50, 89}, {103, 156, 50, 93}, {103, 156, 50, 95}, {103, 156, 50, 101}, {103, 156, 50, 103}, {103, 156, 50, 105}, {103, 156, 50, 107}, {103, 156, 50, 113}, {103, 156, 50, 117}, {103, 156, 51, 2}, {103, 156, 51, 4}, {103, 156, 51, 6}, {103, 156, 51, 10}, {103, 156, 51, 28}, {103, 156, 51, 30}, {103, 156, 51, 32}, {103, 156, 51, 39}, {103, 156, 51, 45}, {103, 156, 51, 51}, {103, 156, 51, 55}, {103, 156, 51, 57}, {103, 156, 51, 68}, {165, 231, 253, 147}, {165, 231, 253, 163}, {165, 231, 253, 165}}},
{Region: "Greece", IPs: []net.IP{{194, 150, 167, 44}, {194, 150, 167, 50}, {194, 150, 167, 28}, {194, 150, 167, 36}}},
{Region: "Hong Kong", IPs: []net.IP{{212, 102, 42, 196}, {84, 17, 37, 160}, {212, 102, 42, 206}, {212, 102, 42, 209}}},
{Region: "Hungary", IPs: []net.IP{{37, 120, 144, 199}, {37, 120, 144, 147}, {37, 120, 144, 245}, {37, 120, 144, 243}, {37, 120, 144, 149}, {37, 120, 144, 197}}},
{Region: "Iceland", IPs: []net.IP{{45, 133, 193, 211}, {45, 133, 193, 109}, {45, 133, 193, 221}, {45, 133, 193, 213}}},
{Region: "India Chennai", IPs: []net.IP{{103, 94, 27, 117}, {103, 94, 27, 181}, {103, 108, 117, 147}, {103, 94, 27, 227}}},
{Region: "India Indore", IPs: []net.IP{{103, 39, 132, 187}, {103, 39, 132, 189}}},
{Region: "India Mumbai", IPs: []net.IP{{103, 156, 51, 61}, {103, 156, 50, 97}, {103, 156, 51, 10}, {103, 156, 50, 85}}},
{Region: "India UK", IPs: []net.IP{{134, 209, 148, 122}}},
{Region: "Indonesia", IPs: []net.IP{{103, 120, 66, 214}, {103, 120, 66, 216}, {103, 120, 66, 219}, {103, 120, 66, 221}, {103, 120, 66, 227}, {103, 120, 66, 229}, {103, 120, 66, 234}, {103, 120, 66, 236}, {103, 148, 242, 163}, {103, 148, 242, 165}, {103, 148, 242, 168}, {103, 148, 242, 170}}},
{Region: "Ireland", IPs: []net.IP{{5, 157, 13, 51}, {5, 157, 13, 53}, {5, 157, 13, 67}, {5, 157, 13, 69}, {5, 157, 13, 85}, {5, 157, 13, 115}, {5, 157, 13, 117}, {5, 157, 13, 123}, {5, 157, 13, 131}, {23, 92, 127, 93}, {37, 120, 235, 67}, {37, 120, 235, 75}, {37, 120, 235, 77}, {37, 120, 235, 83}, {37, 120, 235, 93}, {37, 120, 235, 203}, {37, 120, 235, 211}, {37, 120, 235, 235}, {185, 108, 128, 118}, {185, 108, 128, 120}, {185, 108, 128, 183}, {217, 138, 222, 43}, {217, 138, 222, 45}, {217, 138, 222, 51}}},
{Region: "Israel", IPs: []net.IP{{5, 188, 95, 17}, {5, 188, 95, 21}, {87, 239, 255, 107}, {87, 239, 255, 109}, {87, 239, 255, 114}, {87, 239, 255, 116}, {87, 239, 255, 119}, {87, 239, 255, 121}}},
{Region: "Italy Milan", IPs: []net.IP{{37, 120, 201, 21}, {37, 120, 201, 69}, {45, 9, 251, 165}, {84, 17, 58, 134}, {84, 17, 58, 136}, {84, 17, 58, 161}, {84, 17, 58, 166}, {84, 17, 58, 190}, {84, 17, 58, 195}, {84, 17, 58, 202}, {84, 17, 58, 207}, {95, 174, 64, 67}, {95, 174, 64, 69}, {212, 102, 54, 132}, {212, 102, 54, 135}, {212, 102, 54, 137}, {212, 102, 54, 141}, {212, 102, 54, 143}, {212, 102, 54, 147}, {212, 102, 54, 150}, {212, 102, 54, 155}, {212, 102, 54, 175}, {212, 102, 54, 177}, {212, 102, 55, 66}}},
{Region: "Italy Rome", IPs: []net.IP{{37, 120, 207, 3}, {37, 120, 207, 115}, {37, 120, 207, 117}, {82, 102, 26, 51}, {82, 102, 26, 53}, {82, 102, 26, 61}, {82, 102, 26, 91}, {82, 102, 26, 99}, {87, 101, 94, 211}, {87, 101, 94, 213}, {87, 101, 94, 229}, {87, 101, 94, 231}, {185, 217, 71, 5}, {185, 217, 71, 51}, {185, 217, 71, 53}, {185, 217, 71, 211}, {185, 217, 71, 213}, {185, 217, 71, 229}, {185, 217, 71, 243}, {185, 217, 71, 245}, {185, 217, 71, 253}, {217, 138, 219, 229}, {217, 138, 219, 235}, {217, 138, 219, 237}}},
{Region: "Japan Tokyo", IPs: []net.IP{{84, 17, 34, 24}, {84, 17, 34, 46}, {89, 187, 161, 2}, {89, 187, 161, 4}, {89, 187, 161, 22}, {89, 187, 161, 24}, {89, 187, 161, 241}, {138, 199, 22, 130}, {138, 199, 22, 132}, {138, 199, 22, 135}, {138, 199, 22, 139}, {138, 199, 22, 141}, {138, 199, 22, 143}, {138, 199, 22, 145}}},
{Region: "Indonesia", IPs: []net.IP{{103, 120, 66, 234}, {103, 120, 66, 214}, {103, 120, 66, 236}, {103, 148, 242, 163}}},
{Region: "Ireland", IPs: []net.IP{{5, 157, 13, 85}, {185, 252, 222, 107}, {185, 252, 222, 109}, {37, 120, 235, 229}, {37, 120, 235, 205}, {185, 252, 222, 101}}},
{Region: "Israel", IPs: []net.IP{{87, 239, 255, 109}, {87, 239, 255, 119}, {87, 239, 255, 114}, {87, 239, 255, 121}, {87, 239, 255, 116}}},
{Region: "Italy Milan", IPs: []net.IP{{212, 102, 54, 147}, {84, 17, 58, 192}, {212, 102, 54, 130}, {84, 17, 58, 154}, {212, 102, 54, 160}, {37, 120, 201, 23}}},
{Region: "Italy Rome", IPs: []net.IP{{185, 217, 71, 227}, {37, 120, 207, 117}, {185, 217, 71, 229}, {82, 102, 26, 53}}},
{Region: "Japan Tokyo", IPs: []net.IP{{89, 187, 161, 22}, {138, 199, 22, 139}, {84, 17, 34, 24}, {138, 199, 22, 132}, {138, 199, 22, 143}, {89, 187, 161, 239}}},
{Region: "Japan Tokyo st001", IPs: []net.IP{{45, 87, 213, 19}}},
{Region: "Japan Tokyo st002", IPs: []net.IP{{45, 87, 213, 21}}},
{Region: "Japan Tokyo st003", IPs: []net.IP{{45, 87, 213, 23}}},
@@ -96,32 +96,31 @@ func SurfsharkServers() []models.SurfsharkServer {
{Region: "Japan Tokyo st011", IPs: []net.IP{{89, 187, 161, 19}}},
{Region: "Japan Tokyo st012", IPs: []net.IP{{89, 187, 161, 7}}},
{Region: "Japan Tokyo st013", IPs: []net.IP{{89, 187, 161, 9}}},
{Region: "Kazakhstan", IPs: []net.IP{{5, 189, 202, 9}, {5, 189, 202, 11}, {5, 189, 202, 14}, {5, 189, 202, 16}}},
{Region: "Korea", IPs: []net.IP{{45, 130, 137, 3}, {45, 130, 137, 5}, {45, 130, 137, 10}, {45, 130, 137, 12}, {45, 130, 137, 16}, {45, 130, 137, 18}, {45, 130, 137, 20}, {45, 130, 137, 26}, {45, 130, 137, 28}, {45, 130, 137, 32}, {45, 130, 137, 34}, {45, 130, 137, 36}, {45, 130, 137, 38}, {45, 130, 137, 46}, {45, 130, 137, 48}}},
{Region: "Latvia", IPs: []net.IP{{91, 203, 69, 146}, {91, 203, 69, 148}, {91, 203, 69, 178}, {188, 92, 78, 135}, {188, 92, 78, 137}, {188, 92, 78, 142}, {188, 92, 78, 150}, {188, 92, 78, 203}, {188, 92, 78, 205}, {188, 92, 78, 208}, {188, 92, 78, 210}}},
{Region: "Luxembourg", IPs: []net.IP{{185, 153, 151, 98}, {185, 153, 151, 140}, {185, 153, 151, 148}, {185, 153, 151, 165}, {185, 153, 151, 167}, {185, 153, 151, 169}, {185, 153, 151, 171}, {185, 153, 151, 175}, {185, 153, 151, 183}, {185, 153, 151, 185}, {185, 153, 151, 187}, {185, 153, 151, 193}, {185, 153, 151, 199}}},
{Region: "Malaysia", IPs: []net.IP{{42, 0, 30, 158}, {42, 0, 30, 162}, {42, 0, 30, 164}, {42, 0, 30, 181}, {42, 0, 30, 183}, {42, 0, 30, 209}, {42, 0, 30, 211}, {42, 0, 30, 213}}},
{Region: "Mexico City Mexico", IPs: []net.IP{{194, 41, 112, 5}, {194, 41, 112, 9}, {194, 41, 112, 11}, {194, 41, 112, 19}, {194, 41, 112, 21}, {194, 41, 112, 24}, {194, 41, 112, 26}, {194, 41, 112, 28}, {194, 41, 112, 30}, {194, 41, 112, 33}, {194, 41, 112, 35}, {194, 41, 112, 39}}},
{Region: "Kazakhstan", IPs: []net.IP{{5, 189, 202, 14}, {5, 189, 202, 16}}},
{Region: "Korea", IPs: []net.IP{{45, 130, 137, 40}, {27, 255, 77, 226}, {27, 255, 77, 197}, {45, 130, 137, 5}, {45, 130, 137, 50}, {27, 255, 77, 195}, {45, 130, 137, 32}, {45, 130, 137, 12}}},
{Region: "Latvia", IPs: []net.IP{{188, 92, 78, 205}, {188, 92, 78, 203}, {188, 92, 78, 208}, {91, 203, 69, 146}, {188, 92, 78, 140}, {91, 203, 69, 148}}},
{Region: "Luxembourg", IPs: []net.IP{{185, 153, 151, 60}, {185, 153, 151, 89}, {185, 153, 151, 148}, {185, 153, 151, 98}, {185, 153, 151, 94}, {185, 153, 151, 118}, {185, 153, 151, 108}, {185, 153, 151, 120}, {185, 153, 151, 62}, {185, 153, 151, 100}, {185, 153, 151, 106}, {185, 153, 151, 78}}},
{Region: "Malaysia", IPs: []net.IP{{42, 0, 30, 164}, {42, 0, 30, 179}, {42, 0, 30, 177}, {42, 0, 30, 162}}},
{Region: "Mexico City Mexico", IPs: []net.IP{{194, 41, 112, 21}, {194, 41, 112, 24}, {194, 41, 112, 26}, {194, 41, 112, 3}, {194, 41, 112, 30}, {194, 41, 112, 5}}},
{Region: "Moldova", IPs: []net.IP{{178, 175, 128, 235}, {178, 175, 128, 237}}},
{Region: "Netherlands Amsterdam", IPs: []net.IP{{81, 19, 208, 54}, {81, 19, 208, 78}, {81, 19, 208, 91}, {81, 19, 208, 111}, {81, 19, 209, 20}, {81, 19, 209, 59}, {81, 19, 209, 124}, {89, 46, 223, 62}, {89, 46, 223, 64}, {89, 46, 223, 72}, {89, 46, 223, 82}, {89, 46, 223, 84}, {89, 46, 223, 88}, {89, 46, 223, 94}, {89, 46, 223, 100}, {89, 46, 223, 104}, {89, 46, 223, 169}, {89, 46, 223, 181}, {89, 46, 223, 187}, {89, 46, 223, 190}, {89, 46, 223, 217}, {89, 46, 223, 219}, {143, 244, 42, 91}, {143, 244, 42, 96}, {178, 239, 173, 43}, {212, 102, 35, 201}, {212, 102, 35, 204}, {212, 102, 35, 206}}},
{Region: "Netherlands Amsterdam", IPs: []net.IP{{81, 19, 209, 20}, {89, 46, 223, 82}, {178, 239, 173, 47}, {89, 187, 174, 231}, {89, 46, 223, 229}, {143, 244, 42, 79}}},
{Region: "Netherlands Amsterdam mp001", IPs: []net.IP{{188, 166, 43, 117}}},
{Region: "Netherlands Amsterdam st001", IPs: []net.IP{{81, 19, 209, 51}}},
{Region: "Netherlands US", IPs: []net.IP{{188, 166, 98, 91}}},
{Region: "New Zealand", IPs: []net.IP{{180, 149, 231, 3}, {180, 149, 231, 11}, {180, 149, 231, 13}, {180, 149, 231, 43}, {180, 149, 231, 45}, {180, 149, 231, 67}, {180, 149, 231, 69}, {180, 149, 231, 117}, {180, 149, 231, 119}}},
{Region: "Nigeria", IPs: []net.IP{{102, 165, 23, 4}, {102, 165, 23, 6}, {102, 165, 23, 38}, {102, 165, 23, 40}, {102, 165, 23, 42}, {102, 165, 23, 44}}},
{Region: "North Macedonia", IPs: []net.IP{{185, 225, 28, 67}, {185, 225, 28, 83}, {185, 225, 28, 85}, {185, 225, 28, 91}, {185, 225, 28, 99}, {185, 225, 28, 101}, {185, 225, 28, 107}, {185, 225, 28, 109}, {185, 225, 28, 243}, {185, 225, 28, 245}}},
{Region: "Norway", IPs: []net.IP{{45, 12, 223, 67}, {45, 12, 223, 69}, {45, 12, 223, 71}, {45, 12, 223, 195}, {45, 12, 223, 211}, {84, 247, 50, 29}, {84, 247, 50, 69}, {91, 219, 215, 21}, {91, 219, 215, 35}, {91, 219, 215, 53}, {91, 219, 215, 67}, {91, 219, 215, 69}, {91, 219, 215, 83}, {91, 219, 215, 85}, {95, 174, 66, 35}, {95, 174, 66, 37}, {95, 174, 66, 41}}},
{Region: "Paraguay", IPs: []net.IP{{181, 40, 18, 47}, {181, 40, 18, 59}, {186, 16, 32, 168}, {186, 16, 32, 173}}},
{Region: "Philippines", IPs: []net.IP{{45, 134, 224, 3}, {45, 134, 224, 13}, {45, 134, 224, 15}, {45, 134, 224, 18}, {45, 134, 224, 20}}},
{Region: "Poland Gdansk", IPs: []net.IP{{5, 133, 8, 117}, {5, 187, 49, 147}, {5, 187, 49, 149}, {5, 187, 49, 189}, {5, 187, 53, 51}, {5, 187, 53, 55}, {37, 28, 156, 115}, {37, 28, 156, 117}, {178, 255, 44, 68}, {178, 255, 45, 187}, {178, 255, 45, 189}}},
{Region: "Poland Warsaw", IPs: []net.IP{{5, 253, 206, 67}, {5, 253, 206, 227}, {5, 253, 206, 229}, {84, 17, 55, 132}, {84, 17, 55, 134}, {138, 199, 17, 130}, {138, 199, 17, 132}, {185, 246, 208, 72}, {185, 246, 208, 77}, {185, 246, 208, 105}, {185, 246, 208, 107}, {185, 246, 208, 176}, {185, 246, 208, 182}}},
{Region: "Portugal Lisbon", IPs: []net.IP{{5, 154, 174, 65}, {5, 154, 174, 187}, {5, 154, 174, 189}, {5, 154, 174, 219}, {91, 205, 230, 140}, {91, 205, 230, 146}, {91, 205, 230, 148}, {91, 205, 230, 152}, {91, 205, 230, 158}, {91, 205, 230, 166}, {91, 205, 230, 174}, {91, 205, 230, 176}, {91, 250, 240, 138}, {91, 250, 240, 146}, {91, 250, 240, 148}, {91, 250, 240, 150}, {91, 250, 240, 152}}},
{Region: "Portugal Porto", IPs: []net.IP{{194, 39, 127, 36}, {194, 39, 127, 151}, {194, 39, 127, 163}, {194, 39, 127, 173}, {194, 39, 127, 183}, {194, 39, 127, 193}, {194, 39, 127, 233}}},
{Region: "Romania", IPs: []net.IP{{45, 89, 175, 51}, {45, 89, 175, 55}, {86, 106, 137, 147}, {185, 102, 217, 155}, {185, 102, 217, 159}, {185, 102, 217, 161}, {185, 102, 217, 163}, {185, 102, 217, 165}, {185, 102, 217, 167}, {185, 102, 217, 169}, {185, 102, 217, 194}, {185, 102, 217, 196}, {217, 148, 143, 211}, {217, 148, 143, 213}, {217, 148, 143, 221}}},
{Region: "Russia Moscow", IPs: []net.IP{{92, 38, 138, 53}, {92, 38, 138, 111}, {92, 38, 138, 112}, {92, 38, 138, 118}}},
{Region: "Russia St. Petersburg", IPs: []net.IP{{185, 246, 88, 101}, {185, 246, 88, 103}, {185, 246, 88, 107}, {185, 246, 88, 116}, {185, 246, 88, 118}}},
{Region: "Serbia", IPs: []net.IP{{37, 120, 193, 51}, {37, 120, 193, 53}, {152, 89, 160, 115}, {152, 89, 160, 117}, {152, 89, 160, 211}, {152, 89, 160, 213}, {152, 89, 160, 215}}},
{Region: "Singapore", IPs: []net.IP{{89, 187, 162, 184}, {89, 187, 162, 186}, {89, 187, 163, 132}, {89, 187, 163, 134}, {89, 187, 163, 136}, {89, 187, 163, 195}, {89, 187, 163, 197}, {89, 187, 163, 202}, {89, 187, 163, 207}, {89, 187, 163, 210}, {89, 187, 163, 217}, {156, 146, 56, 130}, {156, 146, 56, 135}, {156, 146, 56, 137}}},
{Region: "New Zealand", IPs: []net.IP{{180, 149, 231, 69}, {180, 149, 231, 67}, {180, 149, 231, 117}, {180, 149, 231, 119}, {180, 149, 231, 115}, {180, 149, 231, 45}}},
{Region: "Nigeria", IPs: []net.IP{{102, 165, 23, 38}, {102, 165, 23, 4}}},
{Region: "North Macedonia", IPs: []net.IP{{185, 225, 28, 67}, {185, 225, 28, 99}, {185, 225, 28, 245}, {185, 225, 28, 243}}},
{Region: "Norway", IPs: []net.IP{{91, 219, 215, 85}, {91, 219, 215, 21}, {45, 12, 223, 67}, {91, 219, 215, 35}, {84, 247, 50, 69}, {95, 174, 66, 35}, {95, 174, 66, 37}, {95, 174, 66, 41}, {91, 219, 215, 19}, {45, 12, 223, 197}}},
{Region: "Paraguay", IPs: []net.IP{{186, 16, 32, 168}, {186, 16, 32, 173}, {186, 16, 32, 163}, {181, 40, 18, 59}}},
{Region: "Philippines", IPs: []net.IP{{45, 134, 224, 10}, {45, 134, 224, 18}, {45, 134, 224, 15}, {45, 134, 224, 8}}},
{Region: "Poland Gdansk", IPs: []net.IP{{37, 28, 156, 115}, {37, 28, 156, 117}, {5, 133, 8, 117}, {5, 187, 49, 189}}},
{Region: "Poland Warsaw", IPs: []net.IP{{185, 246, 208, 77}, {5, 253, 206, 227}, {5, 253, 206, 67}, {5, 253, 206, 69}, {5, 253, 206, 71}, {185, 246, 208, 182}, {138, 199, 17, 132}, {185, 246, 208, 72}}},
{Region: "Portugal Lisbon", IPs: []net.IP{{5, 154, 174, 65}, {91, 205, 230, 152}, {91, 250, 240, 142}, {91, 250, 240, 150}, {5, 154, 174, 173}, {5, 154, 174, 179}, {5, 154, 174, 221}, {91, 205, 230, 154}, {5, 154, 174, 213}, {91, 250, 240, 144}, {5, 154, 174, 211}}},
{Region: "Portugal Porto", IPs: []net.IP{{194, 39, 127, 183}, {194, 39, 127, 171}}},
{Region: "Romania", IPs: []net.IP{{185, 102, 217, 194}, {37, 120, 206, 235}, {86, 106, 137, 149}, {185, 102, 217, 155}, {185, 102, 217, 157}, {217, 148, 143, 211}, {217, 148, 143, 221}, {217, 148, 143, 219}, {185, 102, 217, 196}, {185, 102, 217, 161}, {217, 148, 143, 213}, {185, 102, 217, 167}}},
{Region: "Russia Moscow", IPs: []net.IP{{92, 38, 138, 112}, {92, 38, 138, 118}}},
{Region: "Serbia", IPs: []net.IP{{152, 89, 160, 117}, {152, 89, 160, 115}}},
{Region: "Singapore", IPs: []net.IP{{89, 187, 163, 202}, {89, 187, 163, 195}, {156, 146, 56, 130}, {89, 187, 163, 132}, {89, 187, 163, 136}, {89, 187, 163, 212}, {156, 146, 56, 137}}},
{Region: "Singapore Hong Kong", IPs: []net.IP{{206, 189, 83, 129}}},
{Region: "Singapore Netherlands", IPs: []net.IP{{104, 248, 148, 18}}},
{Region: "Singapore in", IPs: []net.IP{{128, 199, 193, 35}}},
@@ -130,63 +129,62 @@ func SurfsharkServers() []models.SurfsharkServer {
{Region: "Singapore st002", IPs: []net.IP{{217, 138, 201, 93}}},
{Region: "Singapore st003", IPs: []net.IP{{84, 247, 49, 19}}},
{Region: "Singapore st004", IPs: []net.IP{{84, 247, 49, 21}}},
{Region: "Slovekia", IPs: []net.IP{{37, 120, 221, 3}, {37, 120, 221, 5}, {185, 76, 8, 210}, {185, 76, 8, 212}, {193, 37, 255, 35}, {193, 37, 255, 37}, {193, 37, 255, 39}, {193, 37, 255, 41}}},
{Region: "Slovenia", IPs: []net.IP{{195, 158, 249, 36}, {195, 158, 249, 38}, {195, 158, 249, 42}, {195, 158, 249, 48}, {195, 158, 249, 50}, {195, 158, 249, 52}}},
{Region: "South Africa", IPs: []net.IP{{102, 165, 47, 130}, {102, 165, 47, 132}, {102, 165, 47, 134}, {102, 165, 47, 136}, {102, 165, 47, 138}, {102, 165, 47, 140}, {154, 16, 93, 53}, {154, 127, 49, 226}, {154, 127, 49, 230}, {154, 127, 50, 130}, {154, 127, 50, 138}, {154, 127, 50, 140}}},
{Region: "Spain Barcelona", IPs: []net.IP{{37, 120, 142, 131}, {37, 120, 142, 179}, {37, 120, 142, 181}, {82, 102, 26, 147}, {82, 102, 26, 149}, {82, 102, 26, 155}, {82, 102, 26, 157}, {82, 102, 26, 171}, {185, 188, 61, 7}, {185, 188, 61, 17}, {185, 188, 61, 19}, {185, 188, 61, 35}, {185, 188, 61, 41}, {185, 188, 61, 43}, {185, 188, 61, 45}, {185, 188, 61, 53}, {185, 188, 61, 55}, {185, 188, 61, 61}, {185, 188, 61, 65}, {185, 216, 32, 61}}},
{Region: "Spain Madrid", IPs: []net.IP{{82, 102, 17, 179}, {84, 17, 62, 163}, {84, 17, 62, 165}, {84, 17, 62, 179}, {84, 17, 62, 181}, {87, 239, 254, 18}, {87, 239, 254, 20}, {89, 37, 95, 13}, {89, 37, 95, 15}, {89, 37, 95, 17}, {188, 208, 141, 18}, {188, 208, 141, 36}, {188, 208, 141, 100}, {188, 208, 141, 114}, {212, 102, 48, 4}, {212, 102, 48, 8}, {212, 102, 48, 10}, {212, 102, 48, 13}, {212, 102, 48, 18}, {212, 102, 48, 20}}},
{Region: "Spain Valencia", IPs: []net.IP{{185, 153, 150, 44}, {185, 153, 150, 48}, {185, 153, 150, 50}, {185, 153, 150, 58}, {185, 153, 150, 61}, {185, 153, 150, 63}, {185, 153, 150, 68}, {185, 153, 150, 70}, {185, 153, 150, 74}, {185, 153, 150, 78}, {196, 196, 150, 67}, {196, 196, 150, 69}, {196, 196, 150, 71}, {196, 196, 150, 83}, {196, 196, 150, 85}, {196, 196, 150, 99}}},
{Region: "Sweden", IPs: []net.IP{{45, 83, 91, 133}, {45, 83, 91, 147}, {45, 83, 91, 149}, {45, 83, 91, 151}, {185, 76, 9, 39}, {185, 76, 9, 41}, {185, 76, 9, 44}, {185, 76, 9, 46}, {185, 76, 9, 49}, {185, 76, 9, 51}, {185, 76, 9, 55}, {185, 76, 9, 57}}},
{Region: "Switzerland", IPs: []net.IP{{37, 120, 213, 3}, {37, 120, 213, 5}, {45, 12, 222, 245}, {84, 17, 53, 166}, {84, 17, 53, 208}, {84, 17, 53, 210}, {84, 17, 53, 214}, {84, 17, 53, 216}, {84, 17, 53, 221}, {84, 17, 53, 223}, {84, 17, 53, 225}, {84, 17, 53, 227}, {84, 39, 112, 35}, {156, 146, 62, 34}, {156, 146, 62, 36}, {156, 146, 62, 41}, {156, 146, 62, 44}, {156, 146, 62, 49}, {156, 146, 62, 51}, {156, 146, 62, 54}}},
{Region: "Taiwan", IPs: []net.IP{{2, 58, 241, 3}, {2, 58, 241, 5}, {2, 58, 241, 27}, {2, 58, 241, 29}, {2, 58, 241, 147}, {2, 58, 241, 149}, {2, 58, 242, 43}, {2, 58, 242, 53}, {2, 58, 242, 133}, {2, 58, 242, 157}, {103, 152, 151, 3}, {103, 152, 151, 5}, {103, 152, 151, 19}, {103, 152, 151, 67}, {103, 152, 151, 69}, {103, 152, 151, 83}, {103, 152, 151, 85}}},
{Region: "Thailand", IPs: []net.IP{{27, 131, 138, 174}, {27, 131, 138, 176}}},
{Region: "Turkey Istanbul", IPs: []net.IP{{107, 150, 95, 147}, {107, 150, 95, 155}, {107, 150, 95, 157}, {107, 150, 95, 163}, {107, 150, 95, 165}}},
{Region: "Slovekia", IPs: []net.IP{{37, 120, 221, 5}, {193, 37, 255, 35}}},
{Region: "Slovenia", IPs: []net.IP{{195, 158, 249, 38}, {195, 158, 249, 48}, {195, 158, 249, 50}}},
{Region: "South Africa", IPs: []net.IP{{102, 165, 47, 136}, {102, 165, 47, 130}, {154, 127, 49, 226}, {154, 127, 50, 130}, {102, 165, 47, 138}, {154, 127, 49, 228}, {154, 16, 93, 51}}},
{Region: "Spain Barcelona", IPs: []net.IP{{185, 188, 61, 25}, {37, 120, 142, 181}, {185, 188, 61, 41}, {185, 188, 61, 43}, {37, 120, 142, 135}, {185, 188, 61, 57}}},
{Region: "Spain Madrid", IPs: []net.IP{{89, 37, 95, 27}, {84, 17, 62, 163}, {188, 208, 141, 18}, {188, 208, 141, 36}, {212, 102, 48, 10}, {188, 208, 141, 20}, {188, 208, 141, 34}, {212, 102, 48, 13}, {212, 102, 48, 20}, {84, 17, 62, 165}}},
{Region: "Spain Valencia", IPs: []net.IP{{185, 153, 150, 63}, {196, 196, 150, 101}, {196, 196, 150, 85}, {196, 196, 150, 83}}},
{Region: "Sweden", IPs: []net.IP{{185, 76, 9, 34}, {185, 76, 9, 41}}},
{Region: "Switzerland", IPs: []net.IP{{156, 146, 62, 34}, {156, 146, 62, 51}, {156, 146, 62, 49}, {84, 17, 53, 225}, {156, 146, 62, 39}, {45, 12, 222, 243}, {37, 120, 213, 3}, {84, 17, 53, 208}}},
{Region: "Taiwan", IPs: []net.IP{{2, 58, 241, 29}, {103, 152, 151, 83}, {2, 58, 242, 45}, {2, 58, 241, 45}, {103, 152, 151, 5}, {2, 58, 241, 27}, {2, 58, 241, 43}}},
{Region: "Thailand", IPs: []net.IP{{27, 131, 138, 176}}},
{Region: "UK France", IPs: []net.IP{{188, 166, 168, 247}}},
{Region: "UK Germany", IPs: []net.IP{{45, 77, 58, 16}}},
{Region: "UK Glasgow", IPs: []net.IP{{185, 108, 105, 3}, {185, 108, 105, 13}, {185, 108, 105, 18}, {185, 108, 105, 22}, {185, 108, 105, 35}, {185, 108, 105, 55}, {185, 108, 105, 145}, {185, 108, 105, 151}, {185, 108, 105, 153}, {185, 108, 105, 174}, {185, 108, 105, 184}, {185, 108, 105, 209}, {185, 108, 105, 229}, {185, 108, 105, 239}, {185, 108, 105, 241}, {185, 108, 105, 243}}},
{Region: "UK London", IPs: []net.IP{{5, 226, 139, 216}, {81, 19, 214, 32}, {81, 19, 214, 36}, {81, 19, 214, 37}, {81, 19, 214, 65}, {86, 106, 157, 160}, {86, 106, 157, 206}, {89, 34, 96, 86}, {89, 34, 99, 87}, {178, 239, 166, 231}, {178, 239, 172, 57}, {185, 38, 148, 232}, {185, 44, 76, 164}, {185, 44, 77, 48}, {185, 44, 77, 60}, {185, 44, 77, 72}, {185, 44, 77, 123}, {185, 44, 78, 155}, {185, 44, 78, 174}, {185, 134, 22, 251}, {185, 134, 22, 253}, {185, 141, 206, 186}, {185, 141, 206, 218}, {185, 141, 206, 250}, {188, 240, 71, 163}, {188, 240, 71, 231}, {195, 140, 215, 100}, {195, 206, 169, 203}}},
{Region: "UK Glasgow", IPs: []net.IP{{185, 108, 105, 145}, {185, 108, 105, 182}, {185, 108, 105, 209}, {185, 108, 105, 5}, {185, 108, 105, 207}, {185, 108, 105, 174}, {185, 108, 105, 153}, {185, 108, 105, 11}}},
{Region: "UK London", IPs: []net.IP{{185, 134, 22, 232}, {185, 141, 206, 194}, {185, 134, 22, 115}, {89, 34, 96, 86}, {81, 19, 210, 220}, {195, 206, 169, 203}, {5, 226, 139, 225}, {188, 240, 71, 167}, {5, 226, 139, 149}, {217, 146, 83, 85}, {86, 106, 157, 242}, {185, 134, 22, 191}}},
{Region: "UK London mp001", IPs: []net.IP{{206, 189, 119, 92}}},
{Region: "UK London st001", IPs: []net.IP{{217, 146, 82, 83}}},
{Region: "UK London st002", IPs: []net.IP{{185, 134, 22, 80}}},
{Region: "UK London st003", IPs: []net.IP{{185, 134, 22, 92}}},
{Region: "UK London st004", IPs: []net.IP{{185, 44, 76, 186}}},
{Region: "UK London st005", IPs: []net.IP{{185, 44, 76, 188}}},
{Region: "UK Manchester", IPs: []net.IP{{37, 120, 200, 7}, {37, 120, 200, 117}, {37, 120, 233, 13}, {37, 120, 233, 37}, {37, 120, 233, 67}, {37, 120, 233, 107}, {37, 120, 233, 125}, {37, 120, 233, 155}, {37, 120, 233, 171}, {81, 92, 205, 115}, {84, 252, 95, 147}, {89, 44, 201, 93}, {89, 238, 135, 37}, {89, 238, 140, 227}, {89, 238, 140, 229}, {91, 90, 121, 139}, {91, 90, 121, 245}, {139, 28, 176, 43}, {139, 28, 176, 155}, {193, 148, 17, 133}, {194, 37, 98, 3}, {194, 37, 98, 5}, {194, 37, 98, 235}, {217, 138, 196, 93}}},
{Region: "US Atlanta", IPs: []net.IP{{66, 115, 175, 40}, {66, 115, 175, 42}, {66, 115, 175, 47}, {195, 181, 171, 226}, {195, 181, 171, 228}, {195, 181, 171, 231}, {195, 181, 171, 233}, {195, 181, 171, 236}, {195, 181, 171, 238}, {195, 181, 171, 241}, {195, 181, 171, 243}}},
{Region: "US Bend", IPs: []net.IP{{45, 43, 14, 73}, {45, 43, 14, 75}, {45, 43, 14, 83}, {45, 43, 14, 85}, {45, 43, 14, 93}, {45, 43, 14, 95}, {45, 43, 14, 103}, {45, 43, 14, 105}, {154, 16, 168, 184}, {154, 16, 168, 186}, {154, 16, 168, 188}}},
{Region: "US Boston", IPs: []net.IP{{173, 237, 207, 11}, {173, 237, 207, 13}, {173, 237, 207, 21}, {173, 237, 207, 23}, {173, 237, 207, 30}, {173, 237, 207, 32}, {173, 237, 207, 36}, {173, 237, 207, 42}, {173, 237, 207, 60}, {173, 237, 207, 62}, {173, 237, 207, 64}}},
{Region: "US Buffalo", IPs: []net.IP{{64, 44, 42, 164}, {64, 44, 42, 196}, {107, 174, 20, 130}, {107, 174, 20, 134}, {107, 175, 104, 84}, {172, 93, 146, 84}, {172, 93, 146, 210}, {172, 93, 146, 212}, {172, 93, 153, 146}, {172, 93, 153, 148}, {172, 93, 153, 150}}},
{Region: "US Charlotte", IPs: []net.IP{{154, 16, 171, 195}, {154, 16, 171, 197}, {154, 16, 171, 206}, {154, 16, 171, 213}, {155, 254, 28, 141}, {155, 254, 29, 163}, {155, 254, 29, 165}, {155, 254, 31, 182}, {155, 254, 31, 184}, {192, 154, 253, 67}, {192, 154, 253, 69}, {192, 154, 254, 135}, {192, 154, 254, 137}, {192, 158, 224, 110}}},
{Region: "US Chicago", IPs: []net.IP{{74, 119, 146, 131}, {74, 119, 146, 179}, {74, 119, 146, 195}, {74, 119, 146, 197}, {107, 152, 100, 19}, {143, 244, 60, 162}, {143, 244, 60, 164}, {143, 244, 60, 169}, {143, 244, 60, 172}, {143, 244, 60, 174}, {184, 170, 250, 72}, {184, 170, 250, 147}, {184, 170, 250, 152}, {185, 246, 209, 52}}},
{Region: "US Dallas", IPs: []net.IP{{66, 115, 177, 133}, {66, 115, 177, 136}, {66, 115, 177, 138}, {66, 115, 177, 143}, {66, 115, 177, 148}, {66, 115, 177, 151}, {66, 115, 177, 153}, {89, 187, 175, 165}, {89, 187, 175, 167}, {107, 181, 173, 163}, {172, 241, 114, 89}, {212, 102, 40, 66}, {212, 102, 40, 71}, {212, 102, 40, 73}, {212, 102, 40, 78}, {212, 102, 40, 81}, {212, 102, 40, 83}}},
{Region: "US Denver", IPs: []net.IP{{212, 102, 44, 66}, {212, 102, 44, 68}, {212, 102, 44, 71}, {212, 102, 44, 73}, {212, 102, 44, 76}, {212, 102, 44, 78}, {212, 102, 44, 81}, {212, 102, 44, 83}, {212, 102, 44, 86}, {212, 102, 44, 88}, {212, 102, 44, 91}, {212, 102, 44, 93}, {212, 102, 44, 96}, {212, 102, 44, 98}}},
{Region: "US Gahanna", IPs: []net.IP{{104, 244, 208, 35}, {104, 244, 208, 37}, {104, 244, 208, 107}, {104, 244, 208, 203}, {104, 244, 208, 205}, {104, 244, 208, 211}, {104, 244, 208, 229}, {104, 244, 209, 53}, {104, 244, 209, 99}, {104, 244, 209, 101}, {104, 244, 210, 131}, {104, 244, 210, 133}, {104, 244, 210, 139}, {104, 244, 210, 155}, {104, 244, 210, 157}, {104, 244, 211, 139}, {104, 244, 211, 171}, {104, 244, 211, 173}, {104, 244, 211, 181}}},
{Region: "US Houston", IPs: []net.IP{{104, 148, 30, 35}, {104, 148, 30, 39}, {104, 148, 30, 85}, {199, 10, 64, 83}, {199, 10, 64, 85}, {199, 10, 64, 101}, {199, 10, 64, 115}, {199, 10, 64, 117}, {199, 10, 64, 131}, {199, 10, 64, 147}, {199, 10, 64, 165}, {199, 10, 64, 179}, {199, 10, 64, 181}}},
{Region: "US Kansas City", IPs: []net.IP{{63, 141, 236, 245}, {63, 141, 248, 179}, {63, 141, 248, 181}, {69, 30, 249, 125}, {173, 208, 149, 197}, {173, 208, 202, 61}, {198, 204, 231, 147}, {198, 204, 231, 149}}},
{Region: "US Las Vegas", IPs: []net.IP{{45, 89, 173, 203}, {45, 89, 173, 205}, {79, 110, 54, 115}, {79, 110, 54, 117}, {79, 110, 54, 123}, {79, 110, 54, 125}, {79, 110, 54, 131}, {89, 187, 187, 149}, {185, 242, 5, 211}, {185, 242, 5, 213}, {185, 242, 5, 215}}},
{Region: "US Latham", IPs: []net.IP{{45, 43, 19, 66}, {45, 43, 19, 68}, {45, 43, 19, 74}, {45, 43, 19, 76}, {45, 43, 19, 82}, {45, 43, 19, 84}, {45, 43, 19, 90}, {45, 43, 19, 92}, {154, 16, 169, 3}, {154, 16, 169, 5}}},
{Region: "US Los Angeles", IPs: []net.IP{{84, 17, 45, 249}, {89, 187, 187, 71}, {89, 187, 187, 76}, {89, 187, 187, 83}, {89, 187, 187, 86}, {89, 187, 187, 88}, {138, 199, 9, 193}, {138, 199, 9, 195}, {138, 199, 9, 197}, {138, 199, 9, 199}, {138, 199, 9, 202}, {138, 199, 9, 204}, {138, 199, 9, 207}, {172, 83, 44, 83}, {184, 170, 243, 195}, {184, 170, 243, 197}, {184, 170, 243, 199}, {184, 170, 243, 215}, {192, 111, 134, 69}, {192, 111, 134, 195}, {192, 111, 134, 197}, {192, 111, 134, 200}, {192, 111, 134, 212}, {192, 111, 134, 215}, {192, 111, 134, 222}, {212, 103, 49, 147}, {212, 103, 49, 153}}},
{Region: "US Maryland", IPs: []net.IP{{23, 82, 8, 173}, {23, 82, 11, 51}, {23, 105, 160, 134}, {23, 105, 160, 138}, {23, 105, 160, 144}, {23, 105, 163, 94}, {23, 105, 163, 109}, {23, 105, 178, 142}, {23, 105, 178, 160}, {162, 210, 199, 215}, {162, 210, 199, 217}, {207, 244, 65, 15}, {207, 244, 84, 42}, {207, 244, 84, 44}, {207, 244, 84, 58}, {207, 244, 86, 31}, {207, 244, 125, 132}, {207, 244, 127, 47}, {207, 244, 127, 118}}},
{Region: "US Miami", IPs: []net.IP{{87, 101, 93, 131}, {87, 101, 93, 163}, {87, 101, 93, 181}, {89, 187, 173, 250}, {172, 83, 42, 131}, {172, 83, 42, 133}, {172, 83, 42, 136}, {172, 83, 42, 138}, {172, 83, 42, 141}, {172, 83, 42, 143}, {172, 83, 42, 146}, {172, 83, 42, 148}, {172, 83, 42, 151}, {172, 83, 42, 156}, {172, 83, 42, 158}, {193, 37, 252, 195}, {193, 37, 252, 197}, {193, 37, 252, 199}, {212, 102, 61, 132}}},
{Region: "UK Manchester", IPs: []net.IP{{37, 120, 233, 69}, {217, 138, 196, 203}, {91, 90, 121, 203}, {91, 90, 121, 189}}},
{Region: "US Atlanta", IPs: []net.IP{{66, 115, 154, 135}, {195, 181, 171, 238}, {195, 181, 171, 226}, {195, 181, 171, 247}}},
{Region: "US Bend", IPs: []net.IP{{154, 16, 168, 186}, {45, 43, 14, 83}, {45, 43, 14, 85}, {45, 43, 14, 105}}},
{Region: "US Boston", IPs: []net.IP{{173, 237, 207, 30}, {173, 237, 207, 36}, {173, 237, 207, 44}, {173, 237, 207, 62}, {173, 237, 207, 38}}},
{Region: "US Buffalo", IPs: []net.IP{{172, 93, 146, 84}, {107, 174, 20, 130}, {172, 93, 146, 212}}},
{Region: "US Charlotte", IPs: []net.IP{{192, 154, 255, 52}, {154, 16, 171, 195}, {154, 16, 171, 206}, {154, 16, 171, 213}}},
{Region: "US Chicago", IPs: []net.IP{{138, 199, 42, 141}, {138, 199, 42, 133}, {138, 199, 42, 151}, {143, 244, 60, 167}, {138, 199, 42, 149}, {184, 170, 250, 152}, {138, 199, 42, 153}, {89, 187, 182, 175}}},
{Region: "US Dallas", IPs: []net.IP{{107, 181, 173, 163}, {212, 102, 40, 81}, {66, 115, 177, 133}, {212, 102, 40, 73}}},
{Region: "US Denver", IPs: []net.IP{{212, 102, 44, 71}, {212, 102, 44, 66}, {212, 102, 44, 81}, {212, 102, 44, 73}, {212, 102, 44, 96}, {212, 102, 44, 78}}},
{Region: "US Gahanna", IPs: []net.IP{{104, 244, 210, 139}, {104, 244, 210, 123}, {104, 244, 209, 51}, {104, 244, 208, 99}, {104, 244, 211, 171}, {104, 244, 208, 211}}},
{Region: "US Houston", IPs: []net.IP{{199, 10, 64, 181}, {199, 10, 64, 147}, {199, 10, 64, 133}, {199, 10, 64, 67}, {199, 10, 64, 83}, {199, 10, 64, 99}, {199, 10, 64, 179}, {199, 10, 64, 85}}},
{Region: "US Kansas City", IPs: []net.IP{{63, 141, 248, 181}, {173, 208, 202, 59}}},
{Region: "US Las Vegas", IPs: []net.IP{{79, 110, 53, 205}, {79, 110, 54, 131}, {79, 110, 54, 133}, {89, 187, 187, 147}}},
{Region: "US Latham", IPs: []net.IP{{154, 16, 169, 5}, {45, 43, 19, 76}, {154, 16, 169, 7}, {45, 43, 19, 74}, {45, 43, 19, 68}, {45, 43, 19, 84}}},
{Region: "US Los Angeles", IPs: []net.IP{{138, 199, 9, 195}, {138, 199, 9, 209}, {184, 170, 243, 197}, {192, 111, 134, 202}, {89, 187, 187, 81}, {138, 199, 9, 199}, {184, 170, 243, 195}, {192, 111, 134, 197}, {89, 187, 187, 71}, {212, 103, 49, 147}}},
{Region: "US Maryland", IPs: []net.IP{{207, 244, 86, 33}, {207, 244, 65, 17}, {207, 244, 125, 132}, {207, 244, 127, 118}}},
{Region: "US Miami", IPs: []net.IP{{87, 101, 93, 181}, {87, 101, 93, 179}, {45, 87, 214, 243}, {87, 101, 93, 173}, {89, 38, 227, 171}, {89, 38, 227, 173}, {45, 87, 214, 253}, {91, 219, 214, 11}, {212, 102, 61, 130}, {91, 219, 214, 3}}},
{Region: "US Netherlands", IPs: []net.IP{{142, 93, 58, 71}}},
{Region: "US New York City", IPs: []net.IP{{37, 120, 202, 5}, {38, 132, 112, 101}, {84, 17, 35, 66}, {84, 17, 35, 76}, {84, 17, 35, 91}, {84, 17, 35, 108}, {84, 17, 35, 116}, {89, 187, 177, 120}, {89, 187, 177, 122}, {89, 187, 178, 92}, {89, 187, 178, 94}, {98, 142, 220, 37}, {138, 199, 40, 162}, {138, 199, 40, 174}, {138, 199, 40, 182}, {138, 199, 40, 184}, {172, 98, 75, 35}, {199, 36, 221, 104}, {199, 36, 221, 116}}},
{Region: "US New York City", IPs: []net.IP{{199, 36, 221, 114}, {172, 98, 75, 37}, {89, 187, 177, 122}, {199, 36, 221, 99}, {172, 98, 75, 39}, {199, 36, 221, 116}, {84, 17, 35, 116}, {84, 17, 35, 83}}},
{Region: "US New York City mp001", IPs: []net.IP{{45, 55, 60, 159}}},
{Region: "US New York City st001", IPs: []net.IP{{92, 119, 177, 19}}},
{Region: "US New York City st002", IPs: []net.IP{{92, 119, 177, 21}}},
{Region: "US New York City st003", IPs: []net.IP{{92, 119, 177, 23}}},
{Region: "US New York City st004", IPs: []net.IP{{193, 148, 18, 51}}},
{Region: "US New York City st005", IPs: []net.IP{{193, 148, 18, 53}}},
{Region: "US Orlando", IPs: []net.IP{{66, 115, 182, 72}, {66, 115, 182, 74}, {66, 115, 182, 79}, {66, 115, 182, 84}, {66, 115, 182, 104}, {66, 115, 182, 106}, {198, 147, 22, 83}, {198, 147, 22, 85}, {198, 147, 22, 87}, {198, 147, 22, 133}, {198, 147, 22, 147}, {198, 147, 22, 151}, {198, 147, 22, 163}, {198, 147, 22, 197}}},
{Region: "US Phoenix", IPs: []net.IP{{107, 181, 184, 115}, {107, 181, 184, 117}, {172, 98, 87, 37}, {184, 170, 240, 179}, {184, 170, 240, 181}, {199, 58, 187, 3}, {199, 58, 187, 5}, {199, 58, 187, 8}, {199, 58, 187, 10}, {199, 58, 187, 13}, {199, 58, 187, 15}, {199, 58, 187, 20}, {199, 58, 187, 23}, {199, 58, 187, 25}, {199, 58, 187, 67}, {199, 58, 187, 69}}},
{Region: "US Orlando", IPs: []net.IP{{198, 147, 22, 197}, {66, 115, 182, 82}, {198, 147, 22, 85}, {66, 115, 182, 77}, {198, 147, 22, 149}, {198, 147, 22, 195}, {198, 147, 22, 131}, {66, 115, 182, 84}, {198, 147, 22, 147}, {66, 115, 182, 67}, {66, 115, 182, 104}, {66, 115, 182, 112}}},
{Region: "US Phoenix", IPs: []net.IP{{107, 181, 184, 115}, {199, 58, 187, 18}, {199, 58, 187, 15}, {199, 58, 187, 20}, {172, 98, 87, 37}, {107, 181, 184, 117}, {199, 58, 187, 25}}},
{Region: "US Portugal", IPs: []net.IP{{142, 93, 81, 242}}},
{Region: "US Saint Louis", IPs: []net.IP{{148, 72, 169, 209}, {148, 72, 169, 211}, {148, 72, 169, 213}, {148, 72, 170, 108}, {148, 72, 174, 36}, {148, 72, 174, 38}, {148, 72, 174, 46}, {148, 72, 174, 48}, {148, 72, 174, 51}, {148, 72, 174, 53}}},
{Region: "US Salt Lake City", IPs: []net.IP{{104, 200, 131, 165}, {104, 200, 131, 167}, {104, 200, 131, 170}, {104, 200, 131, 172}, {104, 200, 131, 229}, {104, 200, 131, 233}, {104, 200, 131, 245}, {104, 200, 131, 249}}},
{Region: "US San Francisco", IPs: []net.IP{{107, 181, 166, 37}, {107, 181, 166, 39}, {107, 181, 166, 51}, {107, 181, 166, 53}, {107, 181, 166, 85}, {185, 124, 240, 141}, {185, 124, 240, 143}, {185, 124, 240, 145}, {185, 124, 240, 147}, {185, 124, 240, 149}, {185, 124, 240, 151}, {185, 124, 240, 161}, {185, 124, 240, 165}, {185, 124, 240, 167}, {185, 124, 240, 169}, {198, 8, 81, 37}}},
{Region: "US Saint Louis", IPs: []net.IP{{148, 72, 169, 211}, {148, 72, 174, 36}, {148, 72, 174, 46}, {148, 72, 174, 53}}},
{Region: "US Salt Lake City", IPs: []net.IP{{104, 200, 131, 249}, {104, 200, 131, 229}, {104, 200, 131, 172}, {104, 200, 131, 167}, {104, 200, 131, 170}, {104, 200, 131, 233}, {104, 200, 131, 245}}},
{Region: "US San Francisco", IPs: []net.IP{{107, 181, 166, 229}, {107, 181, 166, 85}, {185, 124, 240, 155}, {185, 124, 240, 145}}},
{Region: "US San Francisco mp001", IPs: []net.IP{{165, 232, 53, 25}}},
{Region: "US Seatle", IPs: []net.IP{{84, 17, 41, 77}, {84, 17, 41, 79}, {84, 17, 41, 83}, {104, 200, 129, 243}, {104, 200, 129, 245}, {198, 8, 80, 83}, {198, 8, 80, 85}, {198, 8, 80, 87}, {198, 8, 80, 227}, {198, 8, 80, 229}, {199, 229, 250, 167}, {212, 102, 46, 37}, {212, 102, 46, 39}, {212, 102, 46, 45}, {212, 102, 46, 46}, {212, 102, 46, 51}, {212, 102, 46, 54}, {212, 102, 46, 56}, {212, 102, 46, 65}, {212, 102, 46, 71}}},
{Region: "US Tampa", IPs: []net.IP{{209, 216, 92, 5}, {209, 216, 92, 10}, {209, 216, 92, 13}, {209, 216, 92, 197}, {209, 216, 92, 202}, {209, 216, 92, 205}, {209, 216, 92, 207}, {209, 216, 92, 210}, {209, 216, 92, 212}, {209, 216, 92, 215}, {209, 216, 92, 217}, {209, 216, 92, 220}, {209, 216, 92, 222}, {209, 216, 92, 225}}},
{Region: "Ukraine", IPs: []net.IP{{45, 9, 238, 30}, {45, 9, 238, 47}, {176, 107, 185, 71}, {176, 107, 185, 73}}},
{Region: "United Arab Emirates", IPs: []net.IP{{45, 9, 249, 245}, {45, 9, 249, 247}, {45, 9, 250, 101}, {176, 125, 231, 3}, {176, 125, 231, 11}, {176, 125, 231, 13}, {176, 125, 231, 19}, {176, 125, 231, 27}, {176, 125, 231, 29}, {176, 125, 231, 35}}},
{Region: "Vietnam", IPs: []net.IP{{202, 143, 110, 29}, {202, 143, 110, 32}, {202, 143, 110, 34}}},
{Region: "US Seatle", IPs: []net.IP{{198, 8, 80, 83}, {84, 17, 41, 79}, {212, 102, 46, 71}, {212, 102, 46, 45}, {212, 102, 46, 46}, {84, 17, 41, 85}}},
{Region: "US Tampa", IPs: []net.IP{{209, 216, 92, 200}, {209, 216, 92, 227}, {209, 216, 92, 207}, {209, 216, 92, 202}}},
{Region: "Ukraine", IPs: []net.IP{{45, 9, 238, 23}, {176, 107, 185, 71}}},
{Region: "United Arab Emirates", IPs: []net.IP{{45, 9, 250, 101}, {176, 125, 231, 19}, {45, 9, 249, 243}, {176, 125, 231, 5}, {45, 9, 250, 103}, {176, 125, 231, 13}, {45, 9, 249, 247}, {45, 9, 249, 245}}},
{Region: "Vietnam", IPs: []net.IP{{202, 143, 110, 32}, {202, 143, 110, 36}}},
}
}

View File

@@ -17,6 +17,8 @@ const (
PrivateInternetAccess = "private internet access"
// Privatevpn is a VPN provider.
Privatevpn = "privatevpn"
// Protonvpn is a VPN provider.
Protonvpn = "protonvpn"
// PureVPN is a VPN provider.
Purevpn = "purevpn"
// Surfshark is a VPN provider.

View File

@@ -90,7 +90,7 @@ func VyprvpnServers() []models.VyprvpnServer {
{Region: "USA New York", IPs: []net.IP{{209, 99, 63, 18}}},
{Region: "USA San Francisco", IPs: []net.IP{{209, 99, 95, 18}}},
{Region: "USA Seattle", IPs: []net.IP{{209, 99, 94, 18}}},
{Region: "USA Washington DC", IPs: []net.IP{{209, 99, 62, 18}}},
{Region: "USA Washington", IPs: []net.IP{{209, 99, 62, 18}}},
{Region: "Ukraine", IPs: []net.IP{{128, 90, 96, 64}}},
{Region: "United Kingdom", IPs: []net.IP{{209, 99, 22, 18}}},
{Region: "Uruguay", IPs: []net.IP{{209, 99, 61, 21}}},

View File

@@ -2,11 +2,18 @@ package firewall
import (
"context"
"errors"
"fmt"
"github.com/qdm12/gluetun/internal/constants"
)
var (
ErrEnable = errors.New("failed enabling firewall")
ErrDisable = errors.New("failed disabling firewall")
ErrUserPostRules = errors.New("cannot run user post firewall rules")
)
func (c *configurator) SetEnabled(ctx context.Context, enabled bool) (err error) {
c.stateMutex.Lock()
defer c.stateMutex.Unlock()
@@ -33,7 +40,7 @@ func (c *configurator) SetEnabled(ctx context.Context, enabled bool) (err error)
c.logger.Info("enabling...")
if err := c.enable(ctx); err != nil {
return err
return fmt.Errorf("%w: %s", ErrEnable, err)
}
c.enabled = true
c.logger.Info("enabled successfully")
@@ -45,7 +52,10 @@ func (c *configurator) disable(ctx context.Context) (err error) {
if err = c.clearAllRules(ctx); err != nil {
return fmt.Errorf("cannot disable firewall: %w", err)
}
if err = c.setAllPolicies(ctx, "ACCEPT"); err != nil {
if err = c.setIPv4AllPolicies(ctx, "ACCEPT"); err != nil {
return fmt.Errorf("cannot disable firewall: %w", err)
}
if err = c.setIPv6AllPolicies(ctx, "ACCEPT"); err != nil {
return fmt.Errorf("cannot disable firewall: %w", err)
}
return nil
@@ -56,20 +66,26 @@ func (c *configurator) fallbackToDisabled(ctx context.Context) {
if ctx.Err() != nil {
return
}
if err := c.SetEnabled(ctx, false); err != nil {
c.logger.Error(err)
if err := c.disable(ctx); err != nil {
c.logger.Error("failed reversing firewall changes: " + err.Error())
}
}
func (c *configurator) enable(ctx context.Context) (err error) {
if err = c.setAllPolicies(ctx, "DROP"); err != nil {
touched := false
if err = c.setIPv4AllPolicies(ctx, "DROP"); err != nil {
return fmt.Errorf("cannot enable firewall: %w", err)
}
touched = true
if err = c.setIPv6AllPolicies(ctx, "DROP"); err != nil {
return fmt.Errorf("cannot enable firewall: %w", err)
}
const remove = false
defer func() {
if err != nil {
if touched && err != nil {
c.fallbackToDisabled(ctx)
}
}()
@@ -121,7 +137,7 @@ func (c *configurator) enable(ctx context.Context) (err error) {
}
if err := c.runUserPostRules(ctx, "/iptables/post-rules.txt", remove); err != nil {
return fmt.Errorf("cannot enable firewall: %w", err)
return fmt.Errorf("%w: %s", ErrUserPostRules, err)
}
return nil

View File

@@ -34,6 +34,7 @@ type configurator struct { //nolint:maligned
routing routing.Routing
openFile os.OpenFileFunc // for custom iptables rules
iptablesMutex sync.Mutex
ip6tablesMutex sync.Mutex
debug bool
defaultInterface string
defaultGateway net.IP
@@ -41,6 +42,9 @@ type configurator struct { //nolint:maligned
localIP net.IP
networkInfoMutex sync.Mutex
// Fixed state
ip6Tables bool
// State
enabled bool
vpnConnection models.OpenVPNConnection
@@ -51,12 +55,14 @@ type configurator struct { //nolint:maligned
// NewConfigurator creates a new Configurator instance.
func NewConfigurator(logger logging.Logger, routing routing.Routing, openFile os.OpenFileFunc) Configurator {
commander := command.NewCommander()
return &configurator{
commander: command.NewCommander(),
commander: commander,
logger: logger.NewChild(logging.SetPrefix("firewall: ")),
routing: routing,
openFile: openFile,
allowedInputPorts: make(map[uint16]string),
ip6Tables: ip6tablesSupported(context.Background(), commander),
}
}

View File

@@ -0,0 +1,60 @@
package firewall
import (
"context"
"errors"
"fmt"
"strings"
"github.com/qdm12/golibs/command"
)
var (
ErrIP6Tables = errors.New("failed ip6tables command")
ErrIP6NotSupported = errors.New("ip6tables not supported")
)
func ip6tablesSupported(ctx context.Context, commander command.Commander) (supported bool) {
if _, err := commander.Run(ctx, "ip6tables", "-L"); err != nil {
return false
}
return true
}
func (c *configurator) runIP6tablesInstructions(ctx context.Context, instructions []string) error {
for _, instruction := range instructions {
if err := c.runIP6tablesInstruction(ctx, instruction); err != nil {
return err
}
}
return nil
}
func (c *configurator) runIP6tablesInstruction(ctx context.Context, instruction string) error {
if !c.ip6Tables {
return nil
}
c.ip6tablesMutex.Lock() // only one ip6tables command at once
defer c.ip6tablesMutex.Unlock()
if c.debug {
fmt.Println("ip6tables " + instruction)
}
flags := strings.Fields(instruction)
if output, err := c.commander.Run(ctx, "ip6tables", flags...); err != nil {
return fmt.Errorf("%w \"ip6tables %s\": %s: %s", ErrIP6Tables, instruction, output, err)
}
return nil
}
func (c *configurator) setIPv6AllPolicies(ctx context.Context, policy string) error {
switch policy {
case "ACCEPT", "DROP":
default:
return fmt.Errorf("policy %q not recognized", policy)
}
return c.runIP6tablesInstructions(ctx, []string{
"--policy INPUT " + policy,
"--policy OUTPUT " + policy,
"--policy FORWARD " + policy,
})
}

View File

@@ -2,6 +2,7 @@ package firewall
import (
"context"
"errors"
"fmt"
"io/ioutil"
"net"
@@ -11,6 +12,15 @@ import (
"github.com/qdm12/gluetun/internal/models"
)
var (
ErrIPTablesVersionTooShort = errors.New("iptables version string is too short")
ErrIPTables = errors.New("failed iptables command")
ErrPolicyUnknown = errors.New("unknown policy")
ErrClearRules = errors.New("cannot clear all rules")
ErrSetIPtablesPolicies = errors.New("cannot set iptables policies")
ErrNeedIP6Tables = errors.New("ip6tables is required, please upgrade your kernel to support it")
)
func appendOrDelete(remove bool) string {
if remove {
return "--delete"
@@ -43,7 +53,7 @@ func (c *configurator) Version(ctx context.Context) (string, error) {
words := strings.Fields(output)
const minWords = 2
if len(words) < minWords {
return "", fmt.Errorf("iptables --version: output is too short: %q", output)
return "", fmt.Errorf("%w: %s", ErrIPTablesVersionTooShort, output)
}
return words[1], nil
}
@@ -65,55 +75,71 @@ func (c *configurator) runIptablesInstruction(ctx context.Context, instruction s
}
flags := strings.Fields(instruction)
if output, err := c.commander.Run(ctx, "iptables", flags...); err != nil {
return fmt.Errorf("failed executing \"iptables %s\": %s: %w", instruction, output, err)
return fmt.Errorf("%w \"iptables %s\": %s: %s", ErrIPTables, instruction, output, err)
}
return nil
}
func (c *configurator) clearAllRules(ctx context.Context) error {
return c.runIptablesInstructions(ctx, []string{
if err := c.runMixedIptablesInstructions(ctx, []string{
"--flush", // flush all chains
"--delete-chain", // delete all chains
})
}); err != nil {
return fmt.Errorf("%w: %s", ErrClearRules, err.Error())
}
return nil
}
func (c *configurator) setAllPolicies(ctx context.Context, policy string) error {
func (c *configurator) setIPv4AllPolicies(ctx context.Context, policy string) error {
switch policy {
case "ACCEPT", "DROP":
default:
return fmt.Errorf("policy %q not recognized", policy)
return fmt.Errorf("%w: %s: %s", ErrSetIPtablesPolicies, ErrPolicyUnknown, policy)
}
return c.runIptablesInstructions(ctx, []string{
fmt.Sprintf("--policy INPUT %s", policy),
fmt.Sprintf("--policy OUTPUT %s", policy),
fmt.Sprintf("--policy FORWARD %s", policy),
})
if err := c.runIptablesInstructions(ctx, []string{
"--policy INPUT " + policy,
"--policy OUTPUT " + policy,
"--policy FORWARD " + policy,
}); err != nil {
return fmt.Errorf("%w: %s", ErrSetIPtablesPolicies, err)
}
return nil
}
func (c *configurator) acceptInputThroughInterface(ctx context.Context, intf string, remove bool) error {
return c.runIptablesInstruction(ctx, fmt.Sprintf(
return c.runMixedIptablesInstruction(ctx, fmt.Sprintf(
"%s INPUT -i %s -j ACCEPT", appendOrDelete(remove), intf,
))
}
func (c *configurator) acceptInputToSubnet(ctx context.Context, intf string, destination net.IPNet, remove bool) error {
isIP4Subnet := destination.IP.To4() != nil
interfaceFlag := "-i " + intf
if intf == "*" { // all interfaces
interfaceFlag = ""
}
return c.runIptablesInstruction(ctx, fmt.Sprintf(
"%s INPUT %s -d %s -j ACCEPT", appendOrDelete(remove), interfaceFlag, destination.String(),
))
instruction := fmt.Sprintf("%s INPUT %s -d %s -j ACCEPT",
appendOrDelete(remove), interfaceFlag, destination.String())
if isIP4Subnet {
return c.runIptablesInstruction(ctx, instruction)
}
if !c.ip6Tables {
return fmt.Errorf("accept input to subnet %s: %w", destination, ErrNeedIP6Tables)
}
return c.runIP6tablesInstruction(ctx, instruction)
}
func (c *configurator) acceptOutputThroughInterface(ctx context.Context, intf string, remove bool) error {
return c.runIptablesInstruction(ctx, fmt.Sprintf(
return c.runMixedIptablesInstruction(ctx, fmt.Sprintf(
"%s OUTPUT -o %s -j ACCEPT", appendOrDelete(remove), intf,
))
}
func (c *configurator) acceptEstablishedRelatedTraffic(ctx context.Context, remove bool) error {
return c.runIptablesInstructions(ctx, []string{
return c.runMixedIptablesInstructions(ctx, []string{
fmt.Sprintf("%s OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT", appendOrDelete(remove)),
fmt.Sprintf("%s INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT", appendOrDelete(remove)),
})
@@ -121,22 +147,37 @@ func (c *configurator) acceptEstablishedRelatedTraffic(ctx context.Context, remo
func (c *configurator) acceptOutputTrafficToVPN(ctx context.Context,
defaultInterface string, connection models.OpenVPNConnection, remove bool) error {
return c.runIptablesInstruction(ctx,
fmt.Sprintf("%s OUTPUT -d %s -o %s -p %s -m %s --dport %d -j ACCEPT",
appendOrDelete(remove), connection.IP, defaultInterface, connection.Protocol, connection.Protocol, connection.Port))
instruction := fmt.Sprintf("%s OUTPUT -d %s -o %s -p %s -m %s --dport %d -j ACCEPT",
appendOrDelete(remove), connection.IP, defaultInterface, connection.Protocol,
connection.Protocol, connection.Port)
isIPv4 := connection.IP.To4() != nil
if isIPv4 {
return c.runIptablesInstruction(ctx, instruction)
} else if !c.ip6Tables {
return fmt.Errorf("accept output to VPN server: %w", ErrNeedIP6Tables)
}
return c.runIP6tablesInstruction(ctx, instruction)
}
// Thanks to @npawelek.
func (c *configurator) acceptOutputFromIPToSubnet(ctx context.Context,
intf string, sourceIP net.IP, destinationSubnet net.IPNet, remove bool) error {
doIPv4 := sourceIP.To4() != nil && destinationSubnet.IP.To4() != nil
interfaceFlag := "-o " + intf
if intf == "*" { // all interfaces
interfaceFlag = ""
}
return c.runIptablesInstruction(ctx, fmt.Sprintf(
"%s OUTPUT %s -s %s -d %s -j ACCEPT",
appendOrDelete(remove), interfaceFlag, sourceIP.String(), destinationSubnet.String(),
))
instruction := fmt.Sprintf("%s OUTPUT %s -s %s -d %s -j ACCEPT",
appendOrDelete(remove), interfaceFlag, sourceIP.String(), destinationSubnet.String())
if doIPv4 {
return c.runIptablesInstruction(ctx, instruction)
} else if !c.ip6Tables {
return fmt.Errorf("accept output from %s to %s: %w", sourceIP, destinationSubnet, ErrNeedIP6Tables)
}
return c.runIP6tablesInstruction(ctx, instruction)
}
// Used for port forwarding, with intf set to tun.
@@ -145,7 +186,7 @@ func (c *configurator) acceptInputToPort(ctx context.Context, intf string, port
if intf == "*" { // all interfaces
interfaceFlag = ""
}
return c.runIptablesInstructions(ctx, []string{
return c.runMixedIptablesInstructions(ctx, []string{
fmt.Sprintf("%s INPUT %s -p tcp --dport %d -j ACCEPT", appendOrDelete(remove), interfaceFlag, port),
fmt.Sprintf("%s INPUT %s -p udp --dport %d -j ACCEPT", appendOrDelete(remove), interfaceFlag, port),
})
@@ -178,16 +219,35 @@ func (c *configurator) runUserPostRules(ctx context.Context, filepath string, re
}
}()
for _, line := range lines {
if !strings.HasPrefix(line, "iptables ") {
var ipv4 bool
var rule string
switch {
case strings.HasPrefix(line, "iptables "):
ipv4 = true
rule = strings.TrimPrefix(line, "iptables ")
case strings.HasPrefix(line, "ip6tables "):
ipv4 = false
rule = strings.TrimPrefix(line, "ip6tables ")
default:
continue
}
rule := strings.TrimPrefix(line, "iptables ")
if remove {
rule = flipRule(rule)
}
if err = c.runIptablesInstruction(ctx, rule); err != nil {
return fmt.Errorf("cannot run custom rule: %w", err)
switch {
case ipv4:
err = c.runIptablesInstruction(ctx, rule)
case !c.ip6Tables:
err = fmt.Errorf("cannot run user ip6tables rule: %w", ErrNeedIP6Tables)
default: // ipv6
err = c.runIP6tablesInstruction(ctx, rule)
}
if err != nil {
return err
}
successfulRules = append(successfulRules, rule)
}
return nil

View File

@@ -0,0 +1,21 @@
package firewall
import (
"context"
)
func (c *configurator) runMixedIptablesInstructions(ctx context.Context, instructions []string) error {
for _, instruction := range instructions {
if err := c.runMixedIptablesInstruction(ctx, instruction); err != nil {
return err
}
}
return nil
}
func (c *configurator) runMixedIptablesInstruction(ctx context.Context, instruction string) error {
if err := c.runIptablesInstruction(ctx, instruction); err != nil {
return err
}
return c.runIP6tablesInstruction(ctx, instruction)
}

View File

@@ -10,7 +10,7 @@ import (
"time"
)
func (s *server) runHealthcheckLoop(ctx context.Context, wg *sync.WaitGroup) {
func (s *server) runHealthcheckLoop(ctx context.Context, healthy chan<- bool, wg *sync.WaitGroup) {
defer wg.Done()
for {
previousErr := s.handler.getErr()
@@ -18,6 +18,12 @@ func (s *server) runHealthcheckLoop(ctx context.Context, wg *sync.WaitGroup) {
err := healthCheck(ctx, s.resolver)
s.handler.setErr(err)
// Notify the healthy channel, or not if it's already full
select {
case healthy <- err == nil:
default:
}
if previousErr != nil && err == nil {
s.logger.Info("healthy!")
} else if previousErr == nil && err != nil {
@@ -36,8 +42,8 @@ func (s *server) runHealthcheckLoop(ctx context.Context, wg *sync.WaitGroup) {
}
continue
}
// Success, check again in 10 minutes
const period = 10 * time.Minute
// Success, check again in 5 seconds
const period = 5 * time.Second
timer := time.NewTimer(period)
select {
case <-ctx.Done():

View File

@@ -12,7 +12,7 @@ import (
)
type Server interface {
Run(ctx context.Context, wg *sync.WaitGroup)
Run(ctx context.Context, healthy chan<- bool, wg *sync.WaitGroup)
}
type server struct {
@@ -32,12 +32,12 @@ func NewServer(address string, logger logging.Logger) Server {
}
}
func (s *server) Run(ctx context.Context, wg *sync.WaitGroup) {
func (s *server) Run(ctx context.Context, healthy chan<- bool, wg *sync.WaitGroup) {
defer wg.Done()
internalWg := &sync.WaitGroup{}
internalWg.Add(1)
go s.runHealthcheckLoop(ctx, internalWg)
go s.runHealthcheckLoop(ctx, healthy, internalWg)
server := http.Server{
Addr: s.address,

View File

@@ -108,6 +108,21 @@ func (s *PrivatevpnServer) String() string {
s.Country, s.City, s.Hostname, goStringifyIPs(s.IPs))
}
type ProtonvpnServer struct {
Country string `json:"country"`
Region string `json:"region"`
City string `json:"city"`
Name string `json:"name"`
Hostname string `json:"hostname"`
EntryIP net.IP `json:"entry_ip"`
ExitIP net.IP `json:"exit_ip"` // TODO verify it matches with public IP once connected
}
func (s *ProtonvpnServer) String() string {
return fmt.Sprintf("{Country: %q, Region: %q, City: %q, Name: %q, Hostname: %q, EntryIP: %s, ExitIP: %s}",
s.Country, s.Region, s.City, s.Name, s.Hostname, goStringifyIP(s.EntryIP), goStringifyIP(s.ExitIP))
}
type PurevpnServer struct {
Country string `json:"country"`
Region string `json:"region"`

View File

@@ -10,6 +10,7 @@ type AllServers struct {
Privado PrivadoServers `json:"privado"`
Pia PiaServers `json:"pia"`
Privatevpn PrivatevpnServers `json:"privatevpn"`
Protonvpn ProtonvpnServers `json:"protonvpn"`
Purevpn PurevpnServers `json:"purevpn"`
Surfshark SurfsharkServers `json:"surfshark"`
Torguard TorguardServers `json:"torguard"`
@@ -26,6 +27,7 @@ func (a *AllServers) Count() int {
len(a.Privado.Servers) +
len(a.Pia.Servers) +
len(a.Privatevpn.Servers) +
len(a.Protonvpn.Servers) +
len(a.Purevpn.Servers) +
len(a.Surfshark.Servers) +
len(a.Torguard.Servers) +
@@ -73,6 +75,11 @@ type PrivatevpnServers struct {
Timestamp int64 `json:"timestamp"`
Servers []PrivatevpnServer `json:"servers"`
}
type ProtonvpnServers struct {
Version uint16 `json:"version"`
Timestamp int64 `json:"timestamp"`
Servers []ProtonvpnServer `json:"servers"`
}
type PurevpnServers struct {
Version uint16 `json:"version"`
Timestamp int64 `json:"timestamp"`

View File

@@ -76,7 +76,6 @@ func modifyCustomConfig(lines []string, username string,
modified = append(modified, "mute-replay-warnings")
modified = append(modified, "auth-nocache")
modified = append(modified, "pull-filter ignore \"auth-token\"") // prevent auth failed loop
modified = append(modified, `pull-filter ignore "ping-restart"`)
modified = append(modified, "auth-retry nointeract")
modified = append(modified, "suppress-timestamps")
modified = append(modified, "auth-user-pass "+constants.OpenVPNAuthConf)

View File

@@ -45,6 +45,7 @@ type looper struct {
client *http.Client
openFile os.OpenFileFunc
tunnelReady chan<- struct{}
healthy <-chan bool
cancel context.CancelFunc
// Internal channels and locks
loopLock sync.Mutex
@@ -54,15 +55,19 @@ type looper struct {
portForwardSignals chan net.IP
crashed bool
backoffTime time.Duration
healthWaitTime time.Duration
}
const defaultBackoffTime = 15 * time.Second
const (
defaultBackoffTime = 15 * time.Second
defaultHealthWaitTime = 6 * time.Second
)
func NewLooper(settings configuration.OpenVPN,
username string, puid, pgid int, allServers models.AllServers,
conf Configurator, fw firewall.Configurator, routing routing.Routing,
logger logging.Logger, client *http.Client, openFile os.OpenFileFunc,
tunnelReady chan<- struct{}, cancel context.CancelFunc) Looper {
tunnelReady chan<- struct{}, healthy <-chan bool, cancel context.CancelFunc) Looper {
return &looper{
state: state{
status: constants.Stopped,
@@ -80,6 +85,7 @@ func NewLooper(settings configuration.OpenVPN,
client: client,
openFile: openFile,
tunnelReady: tunnelReady,
healthy: healthy,
cancel: cancel,
start: make(chan struct{}),
running: make(chan models.LoopStatus),
@@ -87,6 +93,7 @@ func NewLooper(settings configuration.OpenVPN,
stopped: make(chan struct{}),
portForwardSignals: make(chan net.IP),
backoffTime: defaultBackoffTime,
healthWaitTime: defaultHealthWaitTime,
}
}
@@ -215,6 +222,22 @@ func (l *looper) Run(ctx context.Context, wg *sync.WaitGroup) { //nolint:gocogni
l.logAndWait(ctx, err)
l.crashed = true
stayHere = false
case healthy := <-l.healthy:
if healthy {
continue
}
// ensure it stays unhealthy for some time before restarting it
healthy = l.waitForHealth(ctx)
if healthy || ctx.Err() != nil {
continue
}
l.crashed = true // flag as crashed
l.state.setStatusWithLock(constants.Stopping)
l.logger.Warn("unhealthy program: restarting openvpn")
openvpnCancel()
<-waitError
l.state.setStatusWithLock(constants.Stopped)
stayHere = false
}
}
close(waitError)
@@ -240,6 +263,35 @@ func (l *looper) logAndWait(ctx context.Context, err error) {
}
}
// waitForHealth waits for a true healthy signal
// after restarting openvpn in order to avoid restarting
// openvpn in a loop as it requires a few seconds to connect.
func (l *looper) waitForHealth(ctx context.Context) (healthy bool) {
l.logger.Info("unhealthy program: waiting %s for it to change to healthy", l.healthWaitTime)
timer := time.NewTimer(l.healthWaitTime)
l.healthWaitTime *= 2
for {
select {
case healthy = <-l.healthy:
if !healthy {
break
}
if !timer.Stop() {
<-timer.C
}
l.healthWaitTime = defaultHealthWaitTime
return true
case <-timer.C:
return false
case <-ctx.Done():
if !timer.Stop() {
<-timer.C
}
return false
}
}
}
// portForward is a blocking operation which may or may not be infinite.
// You should therefore always call it in a goroutine.
func (l *looper) portForward(ctx context.Context, wg *sync.WaitGroup,

View File

@@ -95,7 +95,6 @@ func (c *cyberghost) BuildConf(connection models.OpenVPNConnection,
"auth-nocache",
"mute-replay-warnings",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
@@ -104,7 +103,8 @@ func (c *cyberghost) BuildConf(connection models.OpenVPNConnection,
fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf),
fmt.Sprintf("proto %s", connection.Protocol),
fmt.Sprintf("remote %s %d", connection.IP, connection.Port),
fmt.Sprintf("cipher %s", settings.Cipher),
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
fmt.Sprintf("auth %s", settings.Auth),
}
if strings.HasSuffix(settings.Cipher, "-gcm") {

View File

@@ -127,7 +127,6 @@ func (f *fastestvpn) BuildConf(connection models.OpenVPNConnection,
"auth-nocache",
"mute-replay-warnings",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
@@ -136,7 +135,8 @@ func (f *fastestvpn) BuildConf(connection models.OpenVPNConnection,
"auth-user-pass " + constants.OpenVPNAuthConf,
"proto " + connection.Protocol,
"remote " + connection.IP.String() + " " + strconv.Itoa(int(connection.Port)),
"cipher " + settings.Cipher,
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
"auth " + settings.Auth,
}
if !settings.Root {

View File

@@ -120,7 +120,6 @@ func (h *hideMyAss) BuildConf(connection models.OpenVPNConnection,
"mute-replay-warnings",
"auth-nocache",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
@@ -129,7 +128,8 @@ func (h *hideMyAss) BuildConf(connection models.OpenVPNConnection,
"auth-user-pass " + constants.OpenVPNAuthConf,
"proto " + connection.Protocol,
"remote " + connection.IP.String() + strconv.Itoa(int(connection.Port)),
"cipher " + settings.Cipher,
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
}
if !settings.Root {

View File

@@ -101,7 +101,6 @@ func (m *mullvad) BuildConf(connection models.OpenVPNConnection,
"mute-replay-warnings",
"auth-nocache",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
@@ -110,7 +109,8 @@ func (m *mullvad) BuildConf(connection models.OpenVPNConnection,
fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf),
fmt.Sprintf("proto %s", connection.Protocol),
fmt.Sprintf("remote %s %d", connection.IP, connection.Port),
fmt.Sprintf("cipher %s", settings.Cipher),
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
}
if settings.Provider.ExtraConfigOptions.OpenVPNIPv6 {
lines = append(lines, "tun-ipv6")

View File

@@ -116,7 +116,6 @@ func (n *nordvpn) BuildConf(connection models.OpenVPNConnection,
"auth-nocache",
"mute-replay-warnings",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
@@ -125,7 +124,8 @@ func (n *nordvpn) BuildConf(connection models.OpenVPNConnection,
fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf),
fmt.Sprintf("proto %s", connection.Protocol),
fmt.Sprintf("remote %s %d", connection.IP.String(), connection.Port),
fmt.Sprintf("cipher %s", settings.Cipher),
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
fmt.Sprintf("auth %s", settings.Auth),
}
if !settings.Root {

View File

@@ -167,7 +167,6 @@ func (p *pia) BuildConf(connection models.OpenVPNConnection,
"auth-nocache",
"mute-replay-warnings",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
@@ -176,7 +175,8 @@ func (p *pia) BuildConf(connection models.OpenVPNConnection,
fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf),
fmt.Sprintf("proto %s", connection.Protocol),
fmt.Sprintf("remote %s %d", connection.IP, connection.Port),
fmt.Sprintf("cipher %s", settings.Cipher),
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
fmt.Sprintf("auth %s", settings.Auth),
}
if strings.HasSuffix(settings.Cipher, "-gcm") {

View File

@@ -98,7 +98,6 @@ func (s *privado) BuildConf(connection models.OpenVPNConnection,
"auth-nocache",
"mute-replay-warnings",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
@@ -107,7 +106,8 @@ func (s *privado) BuildConf(connection models.OpenVPNConnection,
fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf),
fmt.Sprintf("proto %s", connection.Protocol),
fmt.Sprintf("remote %s %d", connection.IP, connection.Port),
fmt.Sprintf("cipher %s", settings.Cipher),
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
fmt.Sprintf("auth %s", settings.Auth),
}
if !settings.Root {

View File

@@ -127,7 +127,8 @@ func (p *privatevpn) BuildConf(connection models.OpenVPNConnection,
fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf),
fmt.Sprintf("proto %s", connection.Protocol),
fmt.Sprintf("remote %s %d", connection.IP, connection.Port),
fmt.Sprintf("cipher %s", settings.Cipher),
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
fmt.Sprintf("auth %s", settings.Auth),
}
if connection.Protocol == constants.UDP {

View File

@@ -0,0 +1,214 @@
package provider
import (
"context"
"fmt"
"math/rand"
"net"
"net/http"
"strconv"
"github.com/qdm12/gluetun/internal/configuration"
"github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/firewall"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/golibs/logging"
"github.com/qdm12/golibs/os"
)
type protonvpn struct {
servers []models.ProtonvpnServer
randSource rand.Source
}
func newProtonvpn(servers []models.ProtonvpnServer, timeNow timeNowFunc) *protonvpn {
return &protonvpn{
servers: servers,
randSource: rand.NewSource(timeNow().UnixNano()),
}
}
func (p *protonvpn) GetOpenVPNConnection(selection configuration.ServerSelection) (
connection models.OpenVPNConnection, err error) {
port, err := p.getPort(selection)
if err != nil {
return connection, err
}
if selection.TargetIP != nil {
return models.OpenVPNConnection{
IP: selection.TargetIP,
Port: port,
Protocol: selection.Protocol,
}, nil
}
servers := p.filterServers(selection.Countries, selection.Regions,
selection.Cities, selection.Names, selection.Hostnames)
if len(servers) == 0 {
return connection, p.notFoundErr(selection)
}
connections := make([]models.OpenVPNConnection, len(servers))
for i := range servers {
connections[i] = models.OpenVPNConnection{
IP: servers[i].EntryIP,
Port: port,
Protocol: selection.Protocol,
}
}
return pickRandomConnection(connections, p.randSource), nil
}
func (p *protonvpn) BuildConf(connection models.OpenVPNConnection,
username string, settings configuration.OpenVPN) (lines []string) {
if len(settings.Cipher) == 0 {
settings.Cipher = aes256cbc
}
if len(settings.Auth) == 0 {
settings.Auth = "SHA512"
}
const defaultMSSFix = 1450
if settings.MSSFix == 0 {
settings.MSSFix = defaultMSSFix
}
lines = []string{
"client",
"dev tun",
"nobind",
"persist-key",
"remote-cert-tls server",
"tls-exit",
// Protonvpn specific
"tun-mtu 1500",
"tun-mtu-extra 32",
"mssfix " + strconv.Itoa(int(settings.MSSFix)),
"reneg-sec 0",
"fast-io",
"key-direction 1",
"pull",
"comp-lzo no",
// Added constant values
"auth-nocache",
"mute-replay-warnings",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
"pull-filter ignore \"block-outside-dns\"",
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
// Modified variables
"verb " + strconv.Itoa(settings.Verbosity),
"auth-user-pass " + constants.OpenVPNAuthConf,
"proto " + connection.Protocol,
"remote " + connection.IP.String() + " " + strconv.Itoa(int(connection.Port)),
"cipher " + settings.Cipher,
"auth " + settings.Auth,
}
if !settings.Root {
lines = append(lines, "user "+username)
}
lines = append(lines, []string{
"<ca>",
"-----BEGIN CERTIFICATE-----",
constants.ProtonvpnCertificate,
"-----END CERTIFICATE-----",
"</ca>",
}...)
lines = append(lines, []string{
"<tls-auth>",
"-----BEGIN OpenVPN Static key V1-----",
constants.ProtonvpnOpenvpnStaticKeyV1,
"-----END OpenVPN Static key V1-----",
"</tls-auth>",
"",
}...)
return lines
}
func (p *protonvpn) PortForward(ctx context.Context, client *http.Client,
openFile os.OpenFileFunc, pfLogger logging.Logger, gateway net.IP, fw firewall.Configurator,
syncState func(port uint16) (pfFilepath string)) {
panic("port forwarding is not supported for protonvpn")
}
func (p *protonvpn) getPort(selection configuration.ServerSelection) (port uint16, err error) {
if selection.CustomPort == 0 {
switch selection.Protocol {
case constants.TCP:
const defaultTCPPort = 443
return defaultTCPPort, nil
case constants.UDP:
const defaultUDPPort = 1194
return defaultUDPPort, nil
}
}
port = selection.CustomPort
switch selection.Protocol {
case constants.TCP:
switch port {
case 443, 5995, 8443: //nolint:gomnd
default:
return 0, fmt.Errorf("%w: %d for protocol %s",
ErrInvalidPort, port, selection.Protocol)
}
case constants.UDP:
switch port {
case 80, 443, 1194, 4569, 5060: //nolint:gomnd
default:
return 0, fmt.Errorf("%w: %d for protocol %s",
ErrInvalidPort, port, selection.Protocol)
}
}
return port, nil
}
func (p *protonvpn) filterServers(countries, regions, cities, names, hostnames []string) (
servers []models.ProtonvpnServer) {
for _, server := range p.servers {
switch {
case
filterByPossibilities(server.Country, countries),
filterByPossibilities(server.Region, regions),
filterByPossibilities(server.City, cities),
filterByPossibilities(server.Name, names),
filterByPossibilities(server.Hostname, hostnames):
default:
servers = append(servers, server)
}
}
return servers
}
func (p *protonvpn) notFoundErr(selection configuration.ServerSelection) error {
message := "no server found for protocol " + selection.Protocol
if len(selection.Countries) > 0 {
message += " + countries " + commaJoin(selection.Countries)
}
if len(selection.Regions) > 0 {
message += " + regions " + commaJoin(selection.Regions)
}
if len(selection.Cities) > 0 {
message += " + cities " + commaJoin(selection.Cities)
}
if len(selection.Names) > 0 {
message += " + names " + commaJoin(selection.Names)
}
if len(selection.Hostnames) > 0 {
message += " + hostnames " + commaJoin(selection.Hostnames)
}
return fmt.Errorf(message)
}

View File

@@ -41,6 +41,8 @@ func New(provider string, allServers models.AllServers, timeNow timeNowFunc) Pro
return newPrivateInternetAccess(allServers.Pia.Servers, timeNow)
case constants.Privatevpn:
return newPrivatevpn(allServers.Privatevpn.Servers, timeNow)
case constants.Protonvpn:
return newProtonvpn(allServers.Protonvpn.Servers, timeNow)
case constants.Purevpn:
return newPurevpn(allServers.Purevpn.Servers, timeNow)
case constants.Surfshark:

View File

@@ -102,7 +102,6 @@ func (p *purevpn) BuildConf(connection models.OpenVPNConnection,
"auth-nocache",
"mute-replay-warnings",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
@@ -111,7 +110,8 @@ func (p *purevpn) BuildConf(connection models.OpenVPNConnection,
fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf),
fmt.Sprintf("proto %s", connection.Protocol),
fmt.Sprintf("remote %s %d", connection.IP.String(), connection.Port),
fmt.Sprintf("cipher %s", settings.Cipher),
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
}
if !settings.Root {
lines = append(lines, "user "+username)

View File

@@ -78,7 +78,7 @@ func (s *surfshark) GetOpenVPNConnection(selection configuration.ServerSelection
func (s *surfshark) BuildConf(connection models.OpenVPNConnection,
username string, settings configuration.OpenVPN) (lines []string) {
if len(settings.Cipher) == 0 {
settings.Cipher = aes256cbc
settings.Cipher = aes256gcm
}
if len(settings.Auth) == 0 {
settings.Auth = "SHA512"
@@ -114,7 +114,6 @@ func (s *surfshark) BuildConf(connection models.OpenVPNConnection,
"mute-replay-warnings",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
"pull-filter ignore \"block-outside-dns\"",
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
@@ -123,7 +122,8 @@ func (s *surfshark) BuildConf(connection models.OpenVPNConnection,
fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf),
fmt.Sprintf("proto %s", connection.Protocol),
fmt.Sprintf("remote %s %d", connection.IP, connection.Port),
fmt.Sprintf("cipher %s", settings.Cipher),
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
fmt.Sprintf("auth %s", settings.Auth),
}
if !settings.Root {

View File

@@ -138,7 +138,8 @@ func (t *torguard) BuildConf(connection models.OpenVPNConnection,
"auth-user-pass " + constants.OpenVPNAuthConf,
"proto " + connection.Protocol,
"remote " + connection.IP.String() + " " + strconv.Itoa(int(connection.Port)),
"cipher " + settings.Cipher,
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
"auth " + settings.Auth,
}

View File

@@ -99,7 +99,6 @@ func (v *vyprvpn) BuildConf(connection models.OpenVPNConnection,
"auth-nocache",
"mute-replay-warnings",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
@@ -108,7 +107,8 @@ func (v *vyprvpn) BuildConf(connection models.OpenVPNConnection,
fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf),
fmt.Sprintf("proto %s", connection.Protocol),
fmt.Sprintf("remote %s %d", connection.IP, connection.Port),
fmt.Sprintf("cipher %s", settings.Cipher),
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
fmt.Sprintf("auth %s", settings.Auth),
}
if !settings.Root {

View File

@@ -104,7 +104,6 @@ func (w *windscribe) BuildConf(connection models.OpenVPNConnection,
"auth-nocache",
"mute-replay-warnings",
"pull-filter ignore \"auth-token\"", // prevent auth failed loops
`pull-filter ignore "ping-restart"`,
"auth-retry nointeract",
"suppress-timestamps",
@@ -113,7 +112,8 @@ func (w *windscribe) BuildConf(connection models.OpenVPNConnection,
fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf),
fmt.Sprintf("proto %s", connection.Protocol),
fmt.Sprintf("remote %s %d", connection.IP, connection.Port),
fmt.Sprintf("cipher %s", settings.Cipher),
"data-ciphers-fallback " + settings.Cipher,
"data-ciphers " + settings.Cipher,
fmt.Sprintf("auth %s", settings.Auth),
}
if strings.HasSuffix(settings.Cipher, "-gcm") {

View File

@@ -25,6 +25,7 @@ func (s *storage) mergeServers(hardcoded, persisted models.AllServers) models.Al
Privado: s.mergePrivado(hardcoded.Privado, persisted.Privado),
Pia: s.mergePIA(hardcoded.Pia, persisted.Pia),
Privatevpn: s.mergePrivatevpn(hardcoded.Privatevpn, persisted.Privatevpn),
Protonvpn: s.mergeProtonvpn(hardcoded.Protonvpn, persisted.Protonvpn),
Purevpn: s.mergePureVPN(hardcoded.Purevpn, persisted.Purevpn),
Surfshark: s.mergeSurfshark(hardcoded.Surfshark, persisted.Surfshark),
Torguard: s.mergeTorguard(hardcoded.Torguard, persisted.Torguard),
@@ -140,6 +141,22 @@ func (s *storage) mergePrivatevpn(hardcoded, persisted models.PrivatevpnServers)
return persisted
}
func (s *storage) mergeProtonvpn(hardcoded, persisted models.ProtonvpnServers) models.ProtonvpnServers {
if persisted.Timestamp <= hardcoded.Timestamp {
return hardcoded
}
versionDiff := hardcoded.Version - persisted.Version
if versionDiff > 0 {
s.logger.Info(
"Protonvpn servers from file discarded because they are %d versions behind",
versionDiff)
return hardcoded
}
s.logger.Info("Using Protonvpn servers from file (%s more recent)",
getUnixTimeDifference(persisted.Timestamp, hardcoded.Timestamp))
return persisted
}
func (s *storage) mergePureVPN(hardcoded, persisted models.PurevpnServers) models.PurevpnServers {
if persisted.Timestamp <= hardcoded.Timestamp {
return hardcoded

View File

@@ -25,6 +25,7 @@ func countServers(allServers models.AllServers) int {
len(allServers.Privado.Servers) +
len(allServers.Pia.Servers) +
len(allServers.Privatevpn.Servers) +
len(allServers.Protonvpn.Servers) +
len(allServers.Purevpn.Servers) +
len(allServers.Surfshark.Servers) +
len(allServers.Torguard.Servers) +

View File

@@ -1,10 +0,0 @@
package updater
import (
"context"
"net"
)
type (
lookupIPFunc func(ctx context.Context, host string) (ips []net.IP, err error)
)

View File

@@ -2,16 +2,16 @@ package updater
import (
"context"
"fmt"
"sort"
"time"
"github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/updater/resolver"
)
func (u *updater) updateCyberghost(ctx context.Context) (err error) {
servers, err := findCyberghostServers(ctx, u.lookupIP)
servers, err := findCyberghostServers(ctx, u.presolver)
if err != nil {
return err
}
@@ -23,62 +23,82 @@ func (u *updater) updateCyberghost(ctx context.Context) (err error) {
return nil
}
func findCyberghostServers(ctx context.Context, lookupIP lookupIPFunc) (servers []models.CyberghostServer, err error) {
func findCyberghostServers(ctx context.Context, presolver resolver.Parallel) (
servers []models.CyberghostServer, err error) {
groups := getCyberghostGroups()
allCountryCodes := constants.CountryCodes()
cyberghostCountryCodes := getCyberghostSubdomainToRegion()
possibleCountryCodes := mergeCountryCodes(cyberghostCountryCodes, allCountryCodes)
results := make(chan models.CyberghostServer)
const maxGoroutines = 10
guard := make(chan struct{}, maxGoroutines)
defer close(guard)
// key is the host
possibleServers := make(map[string]models.CyberghostServer, len(groups)*len(possibleCountryCodes))
possibleHosts := make([]string, 0, len(groups)*len(possibleCountryCodes))
for groupID, groupName := range groups {
for countryCode, region := range possibleCountryCodes {
if err := ctx.Err(); err != nil {
return nil, err
}
const domain = "cg-dialup.net"
host := fmt.Sprintf("%s-%s.%s", groupID, countryCode, domain)
go tryCyberghostHostname(ctx, lookupIP, host, groupName, region, results, guard)
possibleHost := groupID + "-" + countryCode + "." + domain
possibleHosts = append(possibleHosts, possibleHost)
possibleServer := models.CyberghostServer{
Region: region,
Group: groupName,
}
possibleServers[possibleHost] = possibleServer
}
}
for i := 0; i < len(groups)*len(possibleCountryCodes); i++ {
server := <-results
if server.IPs == nil {
continue
const (
maxFailRatio = 1
minFound = 100
maxDuration = 10 * time.Second
maxNoNew = 2
maxFails = 1
)
settings := resolver.ParallelSettings{
MaxFailRatio: maxFailRatio,
MinFound: minFound,
Repeat: resolver.RepeatSettings{
MaxDuration: maxDuration,
BetweenDuration: time.Second,
MaxNoNew: maxNoNew,
MaxFails: maxFails,
SortIPs: true,
},
}
hostToIPs, _, err := presolver.Resolve(ctx, possibleHosts, settings)
if err != nil {
return nil, err
}
if err := ctx.Err(); err != nil {
return nil, err
}
// Set IPs for servers found
for host, IPs := range hostToIPs {
server := possibleServers[host]
server.IPs = IPs
possibleServers[host] = server
}
// Remove servers with no IPs (aka not found)
for host, server := range possibleServers {
if len(server.IPs) == 0 {
delete(possibleServers, host)
}
}
// Flatten possibleServers to a slice
servers = make([]models.CyberghostServer, 0, len(possibleServers))
for _, server := range possibleServers {
servers = append(servers, server)
}
if err := ctx.Err(); err != nil {
return servers, err
}
sort.Slice(servers, func(i, j int) bool {
return servers[i].Region < servers[j].Region
})
return servers, nil
}
func tryCyberghostHostname(ctx context.Context, lookupIP lookupIPFunc,
host, groupName, region string,
results chan<- models.CyberghostServer, guard chan struct{}) {
guard <- struct{}{}
defer func() {
<-guard
}()
const repetition = 10
IPs, err := resolveRepeat(ctx, lookupIP, host, repetition, time.Second)
if err != nil || len(IPs) == 0 {
results <- models.CyberghostServer{}
return
}
results <- models.CyberghostServer{
Region: region,
Group: groupName,
IPs: IPs,
}
}
//nolint:goconst
func stringifyCyberghostServers(servers []models.CyberghostServer) (s string) {
s = "func CyberghostServers() []models.CyberghostServer {\n"

View File

@@ -7,12 +7,14 @@ import (
"regexp"
"sort"
"strings"
"time"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/updater/resolver"
)
func (u *updater) updateFastestvpn(ctx context.Context) (err error) {
servers, warnings, err := findFastestvpnServersFromZip(ctx, u.client, u.lookupIP)
servers, warnings, err := findFastestvpnServersFromZip(ctx, u.client, u.presolver)
if u.options.CLI {
for _, warning := range warnings {
u.logger.Warn("FastestVPN: %s", warning)
@@ -29,7 +31,7 @@ func (u *updater) updateFastestvpn(ctx context.Context) (err error) {
return nil
}
func findFastestvpnServersFromZip(ctx context.Context, client *http.Client, lookupIP lookupIPFunc) (
func findFastestvpnServersFromZip(ctx context.Context, client *http.Client, presolver resolver.Parallel) (
servers []models.FastestvpnServer, warnings []string, err error) {
const zipURL = "https://support.fastestvpn.com/download/openvpn-tcp-udp-config-files"
contents, err := fetchAndExtractFiles(ctx, client, zipURL)
@@ -98,10 +100,22 @@ func findFastestvpnServersFromZip(ctx context.Context, client *http.Client, look
i++
}
const repetition = 1
const timeBetween = 0
const failOnErr = true
hostToIPs, _, err := parallelResolve(ctx, lookupIP, hosts, repetition, timeBetween, failOnErr)
const (
maxFailRatio = 0.1
maxNoNew = 1
maxFails = 2
)
settings := resolver.ParallelSettings{
MaxFailRatio: maxFailRatio,
Repeat: resolver.RepeatSettings{
MaxDuration: time.Second,
MaxNoNew: maxNoNew,
MaxFails: maxFails,
SortIPs: true,
},
}
hostToIPs, newWarnings, err := presolver.Resolve(ctx, hosts, settings)
warnings = append(warnings, newWarnings...)
if err != nil {
return nil, warnings, err
}
@@ -120,7 +134,7 @@ func findFastestvpnServersFromZip(ctx context.Context, client *http.Client, look
TCP: data.TCP,
UDP: data.UDP,
Country: data.Country,
IPs: uniqueSortedIPs(IPs),
IPs: IPs,
}
servers = append(servers, server)
}

View File

@@ -12,10 +12,11 @@ import (
"unicode"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/updater/resolver"
)
func (u *updater) updateHideMyAss(ctx context.Context) (err error) {
servers, warnings, err := findHideMyAssServers(ctx, u.client, u.lookupIP)
servers, warnings, err := findHideMyAssServers(ctx, u.client, u.presolver)
if u.options.CLI {
for _, warning := range warnings {
u.logger.Warn("HideMyAss: %s", warning)
@@ -32,7 +33,7 @@ func (u *updater) updateHideMyAss(ctx context.Context) (err error) {
return nil
}
func findHideMyAssServers(ctx context.Context, client *http.Client, lookupIP lookupIPFunc) (
func findHideMyAssServers(ctx context.Context, client *http.Client, presolver resolver.Parallel) (
servers []models.HideMyAssServer, warnings []string, err error) {
TCPhostToURL, err := findHideMyAssHostToURLForProto(ctx, client, "TCP")
if err != nil {
@@ -59,10 +60,27 @@ func findHideMyAssServers(ctx context.Context, client *http.Client, lookupIP loo
i++
}
const failOnErr = false
const resolveRepetition = 5
const timeBetween = 2 * time.Second
hostToIPs, warnings, _ := parallelResolve(ctx, lookupIP, hosts, resolveRepetition, timeBetween, failOnErr)
const (
maxFailRatio = 0.1
maxDuration = 15 * time.Second
betweenDuration = 2 * time.Second
maxNoNew = 2
maxFails = 2
)
settings := resolver.ParallelSettings{
MaxFailRatio: maxFailRatio,
Repeat: resolver.RepeatSettings{
MaxDuration: maxDuration,
BetweenDuration: betweenDuration,
MaxNoNew: maxNoNew,
MaxFails: maxFails,
SortIPs: true,
},
}
hostToIPs, warnings, err := presolver.Resolve(ctx, hosts, settings)
if err != nil {
return nil, warnings, err
}
servers = make([]models.HideMyAssServer, 0, len(hostToIPs))
for host, IPs := range hostToIPs {

View File

@@ -5,12 +5,14 @@ import (
"fmt"
"net/http"
"sort"
"time"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/updater/resolver"
)
func (u *updater) updatePrivado(ctx context.Context) (err error) {
servers, warnings, err := findPrivadoServersFromZip(ctx, u.client, u.lookupIP)
servers, warnings, err := findPrivadoServersFromZip(ctx, u.client, u.presolver)
if u.options.CLI {
for _, warning := range warnings {
u.logger.Warn("Privado: %s", warning)
@@ -27,7 +29,7 @@ func (u *updater) updatePrivado(ctx context.Context) (err error) {
return nil
}
func findPrivadoServersFromZip(ctx context.Context, client *http.Client, lookupIP lookupIPFunc) (
func findPrivadoServersFromZip(ctx context.Context, client *http.Client, presolver resolver.Parallel) (
servers []models.PrivadoServer, warnings []string, err error) {
const zipURL = "https://privado.io/apps/ovpn_configs.zip"
contents, err := fetchAndExtractFiles(ctx, client, zipURL)
@@ -47,11 +49,26 @@ func findPrivadoServersFromZip(ctx context.Context, client *http.Client, lookupI
hosts = append(hosts, hostname)
}
const repetition = 1
const timeBetween = 1
const failOnErr = false
hostToIPs, newWarnings, _ := parallelResolve(ctx, lookupIP, hosts, repetition, timeBetween, failOnErr)
const (
maxFailRatio = 0.1
maxDuration = 3 * time.Second
maxNoNew = 1
maxFails = 2
)
settings := resolver.ParallelSettings{
MaxFailRatio: maxFailRatio,
Repeat: resolver.RepeatSettings{
MaxDuration: maxDuration,
MaxNoNew: maxNoNew,
MaxFails: maxFails,
SortIPs: true,
},
}
hostToIPs, newWarnings, err := presolver.Resolve(ctx, hosts, settings)
warnings = append(warnings, newWarnings...)
if err != nil {
return nil, warnings, err
}
for hostname, IPs := range hostToIPs {
switch len(IPs) {

View File

@@ -11,10 +11,11 @@ import (
"github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/updater/resolver"
)
func (u *updater) updatePrivatevpn(ctx context.Context) (err error) {
servers, warnings, err := findPrivatevpnServersFromZip(ctx, u.client, u.lookupIP)
servers, warnings, err := findPrivatevpnServersFromZip(ctx, u.client, u.presolver)
if u.options.CLI {
for _, warning := range warnings {
u.logger.Warn("Privatevpn: %s", warning)
@@ -31,7 +32,7 @@ func (u *updater) updatePrivatevpn(ctx context.Context) (err error) {
return nil
}
func findPrivatevpnServersFromZip(ctx context.Context, client *http.Client, lookupIP lookupIPFunc) (
func findPrivatevpnServersFromZip(ctx context.Context, client *http.Client, presolver resolver.Parallel) (
servers []models.PrivatevpnServer, warnings []string, err error) {
// Note: all servers do both TCP and UDP
const zipURL = "https://privatevpn.com/client/PrivateVPN-TUN.zip"
@@ -93,10 +94,27 @@ func findPrivatevpnServersFromZip(ctx context.Context, client *http.Client, look
i++
}
const failOnError = false
hostToIPs, newWarnings, _ := parallelResolve(ctx, lookupIP, hostnames, 5, time.Second, failOnError)
if len(newWarnings) > 0 {
warnings = append(warnings, newWarnings...)
const (
maxFailRatio = 0.1
maxDuration = 6 * time.Second
betweenDuration = time.Second
maxNoNew = 2
maxFails = 2
)
settings := resolver.ParallelSettings{
MaxFailRatio: maxFailRatio,
Repeat: resolver.RepeatSettings{
MaxDuration: maxDuration,
BetweenDuration: betweenDuration,
MaxNoNew: maxNoNew,
MaxFails: maxFails,
SortIPs: true,
},
}
hostToIPs, newWarnings, err := presolver.Resolve(ctx, hostnames, settings)
warnings = append(warnings, newWarnings...)
if err != nil {
return nil, warnings, err
}
for hostname, server := range uniqueServers {

View File

@@ -0,0 +1,141 @@
package updater
import (
"context"
"encoding/json"
"fmt"
"net"
"net/http"
"sort"
"strings"
"github.com/qdm12/gluetun/internal/constants"
"github.com/qdm12/gluetun/internal/models"
)
func (u *updater) updateProtonvpn(ctx context.Context) (err error) {
servers, warnings, err := findProtonvpnServers(ctx, u.client)
if u.options.CLI {
for _, warning := range warnings {
u.logger.Warn("Protonvpn: %s", warning)
}
}
if err != nil {
return fmt.Errorf("cannot update Protonvpn servers: %w", err)
}
if u.options.Stdout {
u.println(stringifyProtonvpnServers(servers))
}
u.servers.Protonvpn.Timestamp = u.timeNow().Unix()
u.servers.Protonvpn.Servers = servers
return nil
}
func findProtonvpnServers(ctx context.Context, client *http.Client) (
servers []models.ProtonvpnServer, warnings []string, err error) {
const url = "https://api.protonmail.ch/vpn/logicals"
request, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return nil, nil, err
}
response, err := client.Do(request)
if err != nil {
return nil, nil, err
}
defer response.Body.Close()
if response.StatusCode != http.StatusOK {
return nil, nil, fmt.Errorf("%w: %s for %s", ErrHTTPStatusCodeNotOK, response.Status, url)
}
decoder := json.NewDecoder(response.Body)
var data struct {
LogicalServers []struct {
Name string
ExitCountry string
Region *string
City *string
Servers []struct {
EntryIP net.IP
ExitIP net.IP
Domain string
Status uint8
}
}
}
if err := decoder.Decode(&data); err != nil {
return nil, nil, err
}
if err := response.Body.Close(); err != nil {
return nil, nil, err
}
countryCodesMapping := constants.CountryCodes()
for _, logicalServer := range data.LogicalServers {
for _, physicalServer := range logicalServer.Servers {
if physicalServer.Status == 0 {
warnings = append(warnings, "ignoring server "+physicalServer.Domain+" as its status is 0")
continue
}
countryCode := strings.ToLower(logicalServer.ExitCountry)
country, ok := countryCodesMapping[countryCode]
if !ok {
warnings = append(warnings, "country not found for country code "+countryCode)
country = logicalServer.ExitCountry
}
server := models.ProtonvpnServer{
// Note: for multi-hop use the server name or hostname instead of the country
Country: country,
Region: getStringValue(logicalServer.Region),
City: getStringValue(logicalServer.City),
Name: logicalServer.Name,
Hostname: physicalServer.Domain,
EntryIP: physicalServer.EntryIP,
ExitIP: physicalServer.ExitIP,
}
servers = append(servers, server)
}
}
sort.Slice(servers, func(i, j int) bool {
a, b := servers[i], servers[j]
if a.Country == b.Country { //nolint:nestif
if a.Region == b.Region {
if a.City == b.City {
if a.Name == b.Name {
return a.Hostname < b.Hostname
}
return a.Name < b.Name
}
return a.City < b.City
}
return a.Region < b.Region
}
return a.Country < b.Country
})
return servers, warnings, nil
}
func getStringValue(ptr *string) string {
if ptr == nil {
return ""
}
return *ptr
}
func stringifyProtonvpnServers(servers []models.ProtonvpnServer) (s string) {
s = "func ProtonvpnServers() []models.ProtonvpnServer {\n"
s += " return []models.ProtonvpnServer{\n"
for _, server := range servers {
s += " " + server.String() + ",\n"
}
s += " }\n"
s += "}"
return s
}

View File

@@ -10,10 +10,11 @@ import (
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/publicip"
"github.com/qdm12/gluetun/internal/updater/resolver"
)
func (u *updater) updatePurevpn(ctx context.Context) (err error) {
servers, warnings, err := findPurevpnServers(ctx, u.client, u.lookupIP)
servers, warnings, err := findPurevpnServers(ctx, u.client, u.presolver)
if u.options.CLI {
for _, warning := range warnings {
u.logger.Warn("PureVPN: %s", warning)
@@ -30,7 +31,7 @@ func (u *updater) updatePurevpn(ctx context.Context) (err error) {
return nil
}
func findPurevpnServers(ctx context.Context, client *http.Client, lookupIP lookupIPFunc) (
func findPurevpnServers(ctx context.Context, client *http.Client, presolver resolver.Parallel) (
servers []models.PurevpnServer, warnings []string, err error) {
const zipURL = "https://s3-us-west-1.amazonaws.com/heartbleed/windows/New+OVPN+Files.zip"
contents, err := fetchAndExtractFiles(ctx, client, zipURL)
@@ -53,10 +54,25 @@ func findPurevpnServers(ctx context.Context, client *http.Client, lookupIP looku
hosts = append(hosts, host)
}
const repetition = 20
const timeBetween = time.Second
const failOnErr = true
hostToIPs, _, err := parallelResolve(ctx, lookupIP, hosts, repetition, timeBetween, failOnErr)
const (
maxFailRatio = 0.1
maxDuration = 20 * time.Second
betweenDuration = time.Second
maxNoNew = 2
maxFails = 2
)
settings := resolver.ParallelSettings{
MaxFailRatio: maxFailRatio,
Repeat: resolver.RepeatSettings{
MaxDuration: maxDuration,
BetweenDuration: betweenDuration,
MaxNoNew: maxNoNew,
MaxFails: maxFails,
SortIPs: true,
},
}
hostToIPs, newWarnings, err := presolver.Resolve(ctx, hosts, settings)
warnings = append(warnings, newWarnings...)
if err != nil {
return nil, warnings, err
}

View File

@@ -1,134 +0,0 @@
package updater
import (
"bytes"
"context"
"net"
"sort"
"time"
)
func newResolver(resolverAddress string) *net.Resolver {
d := net.Dialer{}
resolverAddress = net.JoinHostPort(resolverAddress, "53")
return &net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
return d.DialContext(ctx, "udp", resolverAddress)
},
}
}
func newLookupIP(r *net.Resolver) lookupIPFunc {
return func(ctx context.Context, host string) (ips []net.IP, err error) {
addresses, err := r.LookupIPAddr(ctx, host)
if err != nil {
return nil, err
}
ips = make([]net.IP, len(addresses))
for i := range addresses {
ips[i] = addresses[i].IP
}
return ips, nil
}
}
func parallelResolve(ctx context.Context, lookupIP lookupIPFunc, hosts []string,
repetition int, timeBetween time.Duration, failOnErr bool) (
hostToIPs map[string][]net.IP, warnings []string, err error) {
ctx, cancel := context.WithCancel(ctx)
defer cancel()
type result struct {
host string
ips []net.IP
}
results := make(chan result)
defer close(results)
errors := make(chan error)
defer close(errors)
for _, host := range hosts {
go func(host string) {
ips, err := resolveRepeat(ctx, lookupIP, host, repetition, timeBetween)
if err != nil {
errors <- err
return
}
results <- result{
host: host,
ips: ips,
}
}(host)
}
hostToIPs = make(map[string][]net.IP, len(hosts))
for range hosts {
select {
case newErr := <-errors:
if !failOnErr {
warnings = append(warnings, newErr.Error())
} else if err == nil {
err = newErr
cancel()
}
case r := <-results:
hostToIPs[r.host] = r.ips
}
}
return hostToIPs, warnings, err
}
func resolveRepeat(ctx context.Context, lookupIP lookupIPFunc, host string,
repetition int, timeBetween time.Duration) (ips []net.IP, err error) {
uniqueIPs := make(map[string]struct{})
i := 0
for {
newIPs, newErr := lookupIP(ctx, host)
if err == nil {
err = newErr // it's fine to fail some of the resolutions
}
for _, ip := range newIPs {
key := ip.String()
uniqueIPs[key] = struct{}{}
}
i++
if i == repetition {
break
}
timer := time.NewTimer(timeBetween)
select {
case <-timer.C:
case <-ctx.Done():
if !timer.Stop() {
<-timer.C
}
return nil, ctx.Err()
}
}
if len(uniqueIPs) == 0 {
return nil, err
}
ips = make([]net.IP, 0, len(uniqueIPs))
for key := range uniqueIPs {
ip := net.ParseIP(key)
if ipv4 := ip.To4(); ipv4 != nil {
ip = ipv4
}
ips = append(ips, ip)
}
sort.Slice(ips, func(i, j int) bool {
return bytes.Compare(ips[i], ips[j]) < 1
})
return ips, err
}

View File

@@ -0,0 +1,15 @@
package resolver
import "net"
func uniqueIPsToSlice(uniqueIPs map[string]struct{}) (ips []net.IP) {
ips = make([]net.IP, 0, len(uniqueIPs))
for key := range uniqueIPs {
IP := net.ParseIP(key)
if IPv4 := IP.To4(); IPv4 != nil {
IP = IPv4
}
ips = append(ips, IP)
}
return ips
}

View File

@@ -0,0 +1,41 @@
package resolver
import (
"net"
"testing"
"github.com/stretchr/testify/assert"
)
func Test_uniqueIPsToSlice(t *testing.T) {
t.Parallel()
testCases := map[string]struct {
inputIPs map[string]struct{}
outputIPs []net.IP
}{
"nil": {
inputIPs: nil,
outputIPs: []net.IP{},
},
"empty": {
inputIPs: map[string]struct{}{},
outputIPs: []net.IP{},
},
"single IPv4": {
inputIPs: map[string]struct{}{"1.1.1.1": {}},
outputIPs: []net.IP{{1, 1, 1, 1}},
},
"two IPv4s": {
inputIPs: map[string]struct{}{"1.1.1.1": {}, "1.1.2.1": {}},
outputIPs: []net.IP{{1, 1, 1, 1}, {1, 1, 2, 1}},
},
}
for name, testCase := range testCases {
testCase := testCase
t.Run(name, func(t *testing.T) {
t.Parallel()
outputIPs := uniqueIPsToSlice(testCase.inputIPs)
assert.Equal(t, testCase.outputIPs, outputIPs)
})
}
}

View File

@@ -0,0 +1,17 @@
package resolver
import (
"context"
"net"
)
func newResolver(resolverAddress string) *net.Resolver {
d := net.Dialer{}
resolverAddress = net.JoinHostPort(resolverAddress, "53")
return &net.Resolver{
PreferGo: true,
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
return d.DialContext(ctx, "udp", resolverAddress)
},
}
}

View File

@@ -0,0 +1,127 @@
package resolver
import (
"context"
"errors"
"fmt"
"net"
)
type Parallel interface {
Resolve(ctx context.Context, hosts []string, settings ParallelSettings) (
hostToIPs map[string][]net.IP, warnings []string, err error)
}
type parallel struct {
repeatResolver Repeat
}
func NewParallelResolver(address string) Parallel {
return &parallel{
repeatResolver: NewRepeat(address),
}
}
type ParallelSettings struct {
Repeat RepeatSettings
FailEarly bool
// Maximum ratio of the hosts failing DNS resolution
// divided by the total number of hosts requested.
// This value is between 0 and 1. Note this is only
// applicable if FailEarly is not set to true.
MaxFailRatio float64
// MinFound is the minimum number of hosts to be found.
// If it is bigger than the number of hosts given, it
// is set to the number of hosts given.
MinFound int
}
type parallelResult struct {
host string
IPs []net.IP
}
var (
ErrMinFound = errors.New("not enough hosts found")
ErrMaxFailRatio = errors.New("maximum failure ratio reached")
)
func (pr *parallel) Resolve(ctx context.Context, hosts []string,
settings ParallelSettings) (hostToIPs map[string][]net.IP, warnings []string, err error) {
minFound := settings.MinFound
if minFound > len(hosts) {
minFound = len(hosts)
}
ctx, cancel := context.WithCancel(ctx)
defer cancel()
results := make(chan parallelResult)
defer close(results)
errors := make(chan error)
defer close(errors)
for _, host := range hosts {
go pr.resolveAsync(ctx, host, settings.Repeat, results, errors)
}
hostToIPs = make(map[string][]net.IP, len(hosts))
maxFails := int(settings.MaxFailRatio * float64(len(hosts)))
for range hosts {
select {
case newErr := <-errors:
if settings.FailEarly {
if err == nil {
// only set the error to the first error encountered
// and not the context canceled errors coming after.
err = newErr
cancel()
}
break
}
// do not add warnings coming from the call to cancel()
if len(warnings) < maxFails {
warnings = append(warnings, newErr.Error())
}
if len(warnings) == maxFails {
cancel() // cancel only once when we reach maxFails
}
case result := <-results:
hostToIPs[result.host] = result.IPs
}
}
if err != nil { // fail early
return nil, warnings, err
}
if len(hostToIPs) < minFound {
return nil, warnings,
fmt.Errorf("%w: found %d hosts but expected at least %d",
ErrMinFound, len(hostToIPs), minFound)
}
failureRatio := float64(len(warnings)) / float64(len(hosts))
if failureRatio > settings.MaxFailRatio {
return hostToIPs, warnings,
fmt.Errorf("%w: %.2f failure ratio reached", ErrMaxFailRatio, failureRatio)
}
return hostToIPs, warnings, nil
}
func (pr *parallel) resolveAsync(ctx context.Context, host string,
settings RepeatSettings, results chan<- parallelResult, errors chan<- error) {
IPs, err := pr.repeatResolver.Resolve(ctx, host, settings)
if err != nil {
errors <- err
return
}
results <- parallelResult{
host: host,
IPs: IPs,
}
}

View File

@@ -0,0 +1,141 @@
package resolver
import (
"bytes"
"context"
"errors"
"fmt"
"net"
"sort"
"time"
)
type Repeat interface {
Resolve(ctx context.Context, host string, settings RepeatSettings) (IPs []net.IP, err error)
}
type repeat struct {
resolver *net.Resolver
}
func NewRepeat(address string) Repeat {
return &repeat{
resolver: newResolver(address),
}
}
type RepeatSettings struct {
MaxDuration time.Duration
BetweenDuration time.Duration
MaxNoNew int
// Maximum consecutive DNS resolution failures
MaxFails int
SortIPs bool
}
func (r *repeat) Resolve(ctx context.Context, host string, settings RepeatSettings) (ips []net.IP, err error) {
timedCtx, cancel := context.WithTimeout(ctx, settings.MaxDuration)
defer cancel()
noNewCounter := 0
failCounter := 0
uniqueIPs := make(map[string]struct{})
for err == nil {
// TODO
// - one resolving every 100ms for round robin DNS responses
// - one every second for time based DNS cycling responses
noNewCounter, failCounter, err = r.resolveOnce(ctx, timedCtx, host, settings, uniqueIPs, noNewCounter, failCounter)
}
if len(uniqueIPs) == 0 {
return nil, err
}
ips = uniqueIPsToSlice(uniqueIPs)
if settings.SortIPs {
sort.Slice(ips, func(i, j int) bool {
return bytes.Compare(ips[i], ips[j]) < 1
})
}
return ips, nil
}
var (
ErrMaxNoNew = errors.New("reached the maximum number of no new update")
ErrMaxFails = errors.New("reached the maximum number of consecutive failures")
ErrTimeout = errors.New("reached the timeout")
)
func (r *repeat) resolveOnce(ctx, timedCtx context.Context, host string,
settings RepeatSettings, uniqueIPs map[string]struct{}, noNewCounter, failCounter int) (
newNoNewCounter, newFailCounter int, err error) {
IPs, err := r.lookupIPs(timedCtx, host)
if err != nil {
failCounter++
if settings.MaxFails > 0 && failCounter == settings.MaxFails {
return noNewCounter, failCounter, fmt.Errorf("%w: %d failed attempts resolving %s: %s",
ErrMaxFails, settings.MaxFails, host, err)
}
// it's fine to fail some of the resolutions
return noNewCounter, failCounter, nil
}
failCounter = 0 // reset the counter if we had no error
anyNew := false
for _, IP := range IPs {
key := IP.String()
if _, ok := uniqueIPs[key]; !ok {
anyNew = true
uniqueIPs[key] = struct{}{}
}
}
if !anyNew {
noNewCounter++
}
if settings.MaxNoNew > 0 && noNewCounter == settings.MaxNoNew {
// we reached the maximum number of resolutions without
// finding any new IP address to our unique IP addresses set.
return noNewCounter, failCounter,
fmt.Errorf("%w: %d times no updated for %d IP addresses found",
ErrMaxNoNew, noNewCounter, len(uniqueIPs))
}
timer := time.NewTimer(settings.BetweenDuration)
select {
case <-timer.C:
return noNewCounter, failCounter, nil
case <-ctx.Done():
if !timer.Stop() {
<-timer.C
}
return noNewCounter, failCounter, ctx.Err()
case <-timedCtx.Done():
if err := ctx.Err(); err != nil {
// timedCtx was canceled from its parent context
return noNewCounter, failCounter, err
}
return noNewCounter, failCounter,
fmt.Errorf("%w: %s", ErrTimeout, timedCtx.Err())
}
}
func (r *repeat) lookupIPs(ctx context.Context, host string) (ips []net.IP, err error) {
addresses, err := r.resolver.LookupIPAddr(ctx, host)
if err != nil {
return nil, err
}
ips = make([]net.IP, 0, len(addresses))
for i := range addresses {
ip := addresses[i].IP
if ip == nil {
continue
}
ips = append(ips, ip)
}
return ips, nil
}

View File

@@ -0,0 +1,3 @@
// Package resolver defines custom resolvers to resolve
// hosts multiple times with adjustable settings.
package resolver

View File

@@ -1,83 +0,0 @@
package updater
import (
"context"
"fmt"
"net"
"sync"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_resolveRepeat(t *testing.T) {
t.Parallel()
testCases := map[string]struct {
lookupIPResult [][]net.IP
lookupIPErr error
n int
ips []net.IP
err error
}{
"failure twice": {
lookupIPResult: [][]net.IP{{}, {}},
lookupIPErr: fmt.Errorf("feeling sick"),
n: 2,
err: fmt.Errorf("feeling sick"),
},
"failure once": {
lookupIPResult: [][]net.IP{{}, {{1, 1, 1, 1}}},
lookupIPErr: fmt.Errorf("feeling sick"),
n: 2,
ips: []net.IP{{1, 1, 1, 1}},
err: fmt.Errorf("feeling sick"),
},
"successful": {
lookupIPResult: [][]net.IP{
{{1, 1, 1, 1}, {1, 1, 1, 2}},
{{2, 1, 1, 1}, {2, 1, 1, 2}},
{{2, 1, 1, 3}, {2, 1, 1, 2}},
},
n: 3,
ips: []net.IP{
{1, 1, 1, 1},
{1, 1, 1, 2},
{2, 1, 1, 1},
{2, 1, 1, 2},
{2, 1, 1, 3},
},
},
}
for name, testCase := range testCases {
testCase := testCase
t.Run(name, func(t *testing.T) {
t.Parallel()
if testCase.lookupIPErr == nil {
require.Len(t, testCase.lookupIPResult, testCase.n)
}
const host = "blabla"
i := 0
mutex := &sync.Mutex{}
lookupIP := func(ctx context.Context, argHost string) (
ips []net.IP, err error) {
assert.Equal(t, host, argHost)
mutex.Lock()
result := testCase.lookupIPResult[i]
i++
mutex.Unlock()
return result, testCase.err
}
ips, err := resolveRepeat(
context.Background(), lookupIP, host, testCase.n, 0)
if testCase.err != nil {
require.Error(t, err)
assert.Equal(t, testCase.err.Error(), err.Error())
} else {
assert.NoError(t, err)
}
assert.Equal(t, testCase.ips, ips)
})
}
}

View File

@@ -10,10 +10,11 @@ import (
"time"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/updater/resolver"
)
func (u *updater) updateSurfshark(ctx context.Context) (err error) {
servers, warnings, err := findSurfsharkServersFromZip(ctx, u.client, u.lookupIP)
servers, warnings, err := findSurfsharkServersFromZip(ctx, u.client, u.presolver)
if u.options.CLI {
for _, warning := range warnings {
u.logger.Warn("Surfshark: %s", warning)
@@ -31,7 +32,7 @@ func (u *updater) updateSurfshark(ctx context.Context) (err error) {
}
//nolint:deadcode,unused
func findSurfsharkServersFromAPI(ctx context.Context, client *http.Client, lookupIP lookupIPFunc) (
func findSurfsharkServersFromAPI(ctx context.Context, client *http.Client, presolver resolver.Parallel) (
servers []models.SurfsharkServer, warnings []string, err error) {
const url = "https://my.surfshark.com/vpn/api/v4/server/clusters"
@@ -69,12 +70,25 @@ func findSurfsharkServersFromAPI(ctx context.Context, client *http.Client, looku
hosts[i] = jsonServers[i].Host
}
const repetition = 20
const timeBetween = time.Second
const failOnErr = true
hostToIPs, _, err := parallelResolve(ctx, lookupIP, hosts, repetition, timeBetween, failOnErr)
const (
maxFailRatio = 0.1
maxDuration = 20 * time.Second
betweenDuration = time.Second
maxNoNew = 2
maxFails = 2
)
settings := resolver.ParallelSettings{
MaxFailRatio: maxFailRatio,
Repeat: resolver.RepeatSettings{
MaxDuration: maxDuration,
BetweenDuration: betweenDuration,
MaxNoNew: maxNoNew,
MaxFails: maxFails,
},
}
hostToIPs, warnings, err := presolver.Resolve(ctx, hosts, settings)
if err != nil {
return nil, nil, err
return nil, warnings, err
}
for _, jsonServer := range jsonServers {
@@ -87,14 +101,14 @@ func findSurfsharkServersFromAPI(ctx context.Context, client *http.Client, looku
}
server := models.SurfsharkServer{
Region: jsonServer.Country + " " + jsonServer.Location,
IPs: uniqueSortedIPs(IPs),
IPs: IPs,
}
servers = append(servers, server)
}
return servers, warnings, nil
}
func findSurfsharkServersFromZip(ctx context.Context, client *http.Client, lookupIP lookupIPFunc) (
func findSurfsharkServersFromZip(ctx context.Context, client *http.Client, presolver resolver.Parallel) (
servers []models.SurfsharkServer, warnings []string, err error) {
const zipURL = "https://my.surfshark.com/vpn/api/v1/server/configurations"
contents, err := fetchAndExtractFiles(ctx, client, zipURL)
@@ -119,10 +133,24 @@ func findSurfsharkServersFromZip(ctx context.Context, client *http.Client, looku
hosts = append(hosts, host)
}
const repetition = 20
const timeBetween = time.Second
const failOnErr = true
hostToIPs, _, err := parallelResolve(ctx, lookupIP, hosts, repetition, timeBetween, failOnErr)
const (
maxFailRatio = 0.1
maxDuration = 20 * time.Second
betweenDuration = time.Second
maxNoNew = 2
maxFails = 2
)
settings := resolver.ParallelSettings{
MaxFailRatio: maxFailRatio,
Repeat: resolver.RepeatSettings{
MaxDuration: maxDuration,
BetweenDuration: betweenDuration,
MaxNoNew: maxNoNew,
MaxFails: maxFails,
},
}
hostToIPs, newWarnings, err := presolver.Resolve(ctx, hosts, settings)
warnings = append(warnings, newWarnings...)
if err != nil {
return nil, warnings, err
}
@@ -144,14 +172,18 @@ func findSurfsharkServersFromZip(ctx context.Context, client *http.Client, looku
}
server := models.SurfsharkServer{
Region: region,
IPs: uniqueSortedIPs(IPs),
IPs: IPs,
}
servers = append(servers, server)
}
// process entries in mapping that were not in zip file
remainingServers, newWarnings := getRemainingServers(ctx, mapping, lookupIP)
remainingServers, newWarnings, err := getRemainingServers(ctx, mapping, presolver)
warnings = append(warnings, newWarnings...)
if err != nil {
return nil, warnings, err
}
servers = append(servers, remainingServers...)
sort.Slice(servers, func(i, j int) bool {
@@ -160,28 +192,46 @@ func findSurfsharkServersFromZip(ctx context.Context, client *http.Client, looku
return servers, warnings, nil
}
func getRemainingServers(ctx context.Context, mapping map[string]string, lookupIP lookupIPFunc) (
servers []models.SurfsharkServer, warnings []string) {
func getRemainingServers(ctx context.Context, mapping map[string]string, presolver resolver.Parallel) (
servers []models.SurfsharkServer, warnings []string, err error) {
hosts := make([]string, 0, len(mapping))
for subdomain := range mapping {
hosts = append(hosts, subdomain+".prod.surfshark.com")
}
const repetition = 20
const timeBetween = time.Second
const failOnErr = false
hostToIPs, warnings, _ := parallelResolve(ctx, lookupIP, hosts, repetition, timeBetween, failOnErr)
const (
maxFailRatio = 0.3
maxDuration = 20 * time.Second
betweenDuration = time.Second
maxNoNew = 2
maxFails = 2
)
settings := resolver.ParallelSettings{
MaxFailRatio: maxFailRatio,
Repeat: resolver.RepeatSettings{
MaxDuration: maxDuration,
BetweenDuration: betweenDuration,
MaxNoNew: maxNoNew,
MaxFails: maxFails,
SortIPs: true,
},
}
hostToIPs, warnings, err := presolver.Resolve(ctx, hosts, settings)
if err != nil {
return nil, warnings, err
}
servers = make([]models.SurfsharkServer, 0, len(hostToIPs))
for host, IPs := range hostToIPs {
subdomain := strings.TrimSuffix(host, ".prod.surfshark.com")
server := models.SurfsharkServer{
Region: mapping[subdomain],
IPs: uniqueSortedIPs(IPs),
IPs: IPs,
}
servers = append(servers, server)
}
return servers, warnings
return servers, warnings, nil
}
func stringifySurfsharkServers(servers []models.SurfsharkServer) (s string) {

View File

@@ -9,6 +9,7 @@ import (
"github.com/qdm12/gluetun/internal/configuration"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/updater/resolver"
"github.com/qdm12/golibs/logging"
)
@@ -24,11 +25,11 @@ type updater struct {
servers models.AllServers
// Functions for tests
logger logging.Logger
timeNow func() time.Time
println func(s string)
lookupIP lookupIPFunc
client *http.Client
logger logging.Logger
timeNow func() time.Time
println func(s string)
presolver resolver.Parallel
client *http.Client
}
func New(settings configuration.Updater, httpClient *http.Client,
@@ -36,15 +37,14 @@ func New(settings configuration.Updater, httpClient *http.Client,
if len(settings.DNSAddress) == 0 {
settings.DNSAddress = "1.1.1.1"
}
resolver := newResolver(settings.DNSAddress)
return &updater{
logger: logger,
timeNow: time.Now,
println: func(s string) { fmt.Println(s) },
lookupIP: newLookupIP(resolver),
client: httpClient,
options: settings,
servers: currentServers,
logger: logger,
timeNow: time.Now,
println: func(s string) { fmt.Println(s) },
presolver: resolver.NewParallelResolver(settings.DNSAddress),
client: httpClient,
options: settings,
servers: currentServers,
}
}
@@ -131,6 +131,16 @@ func (u *updater) UpdateServers(ctx context.Context) (allServers models.AllServe
}
}
if u.options.Protonvpn {
u.logger.Info("updating Protonvpn servers...")
if err := u.updateProtonvpn(ctx); err != nil {
if ctxErr := ctx.Err(); ctxErr != nil {
return allServers, ctxErr
}
u.logger.Error(err)
}
}
if u.options.Purevpn {
u.logger.Info("updating PureVPN servers...")
// TODO support servers offering only TCP or only UDP

View File

@@ -6,12 +6,14 @@ import (
"net/http"
"sort"
"strings"
"time"
"github.com/qdm12/gluetun/internal/models"
"github.com/qdm12/gluetun/internal/updater/resolver"
)
func (u *updater) updateVyprvpn(ctx context.Context) (err error) {
servers, warnings, err := findVyprvpnServers(ctx, u.client, u.lookupIP)
servers, warnings, err := findVyprvpnServers(ctx, u.client, u.presolver)
if u.options.CLI {
for _, warning := range warnings {
u.logger.Warn("Vyprvpn: %s", warning)
@@ -28,7 +30,7 @@ func (u *updater) updateVyprvpn(ctx context.Context) (err error) {
return nil
}
func findVyprvpnServers(ctx context.Context, client *http.Client, lookupIP lookupIPFunc) (
func findVyprvpnServers(ctx context.Context, client *http.Client, presolver resolver.Parallel) (
servers []models.VyprvpnServer, warnings []string, err error) {
const zipURL = "https://support.vyprvpn.com/hc/article_attachments/360052617332/Vypr_OpenVPN_20200320.zip"
contents, err := fetchAndExtractFiles(ctx, client, zipURL)
@@ -60,18 +62,31 @@ func findVyprvpnServers(ctx context.Context, client *http.Client, lookupIP looku
i++
}
const repetition = 1
const timeBetween = 1
const failOnErr = true
hostToIPs, _, err := parallelResolve(ctx, lookupIP, hosts, repetition, timeBetween, failOnErr)
const (
maxFailRatio = 0.1
maxNoNew = 2
maxFails = 2
)
settings := resolver.ParallelSettings{
MaxFailRatio: maxFailRatio,
Repeat: resolver.RepeatSettings{
MaxDuration: time.Second,
MaxNoNew: maxNoNew,
MaxFails: maxFails,
SortIPs: true,
},
}
hostToIPs, newWarnings, err := presolver.Resolve(ctx, hosts, settings)
warnings = append(warnings, newWarnings...)
if err != nil {
return nil, warnings, err
}
servers = make([]models.VyprvpnServer, 0, len(hostToIPs))
for host, IPs := range hostToIPs {
server := models.VyprvpnServer{
Region: hostToRegion[host],
IPs: uniqueSortedIPs(IPs),
IPs: IPs,
}
servers = append(servers, server)
}