Cyberghost support (#168)
* Host finder CLI for cyberghost * Resolver program updated with Cyberghost data * Gluetun cli clientkey subcommand
This commit is contained in:
@@ -18,6 +18,7 @@ import (
|
||||
"github.com/qdm12/private-internet-access-docker/internal/alpine"
|
||||
"github.com/qdm12/private-internet-access-docker/internal/cli"
|
||||
"github.com/qdm12/private-internet-access-docker/internal/constants"
|
||||
"github.com/qdm12/private-internet-access-docker/internal/cyberghost"
|
||||
"github.com/qdm12/private-internet-access-docker/internal/dns"
|
||||
"github.com/qdm12/private-internet-access-docker/internal/firewall"
|
||||
"github.com/qdm12/private-internet-access-docker/internal/models"
|
||||
@@ -47,6 +48,8 @@ func _main(background context.Context, args []string) int {
|
||||
switch args[1] {
|
||||
case "healthcheck":
|
||||
err = cli.HealthCheck()
|
||||
case "clientkey":
|
||||
err = cli.ClientKey(args[2:])
|
||||
default:
|
||||
err = fmt.Errorf("command %q is unknown", args[1])
|
||||
}
|
||||
@@ -78,6 +81,7 @@ func _main(background context.Context, args []string) int {
|
||||
mullvadConf := mullvad.NewConfigurator(fileManager, logger)
|
||||
windscribeConf := windscribe.NewConfigurator(fileManager)
|
||||
surfsharkConf := surfshark.NewConfigurator(fileManager)
|
||||
cyberghostConf := cyberghost.NewConfigurator(fileManager)
|
||||
tinyProxyConf := tinyproxy.NewConfigurator(fileManager, logger)
|
||||
shadowsocksConf := shadowsocks.NewConfigurator(fileManager, logger)
|
||||
streamMerger := command.NewStreamMerger()
|
||||
@@ -125,6 +129,9 @@ func _main(background context.Context, args []string) int {
|
||||
case constants.Surfshark:
|
||||
openVPNUser = allSettings.Surfshark.User
|
||||
openVPNPassword = allSettings.Surfshark.Password
|
||||
case constants.Cyberghost:
|
||||
openVPNUser = allSettings.Cyberghost.User
|
||||
openVPNPassword = allSettings.Cyberghost.Password
|
||||
}
|
||||
err = ovpnConf.WriteAuthFile(openVPNUser, openVPNPassword, allSettings.System.UID, allSettings.System.GID)
|
||||
fatalOnError(err)
|
||||
@@ -220,6 +227,24 @@ func _main(background context.Context, args []string) int {
|
||||
allSettings.OpenVPN.Root,
|
||||
allSettings.OpenVPN.Cipher,
|
||||
allSettings.OpenVPN.Auth)
|
||||
case constants.Cyberghost:
|
||||
connections, err = cyberghostConf.GetOpenVPNConnections(
|
||||
allSettings.Cyberghost.Group,
|
||||
allSettings.Cyberghost.Region,
|
||||
allSettings.OpenVPN.NetworkProtocol,
|
||||
allSettings.OpenVPN.TargetIP)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
err = cyberghostConf.BuildConf(
|
||||
connections,
|
||||
allSettings.Cyberghost.ClientKey,
|
||||
allSettings.OpenVPN.Verbosity,
|
||||
allSettings.System.UID,
|
||||
allSettings.System.GID,
|
||||
allSettings.OpenVPN.Root,
|
||||
allSettings.OpenVPN.Cipher,
|
||||
allSettings.OpenVPN.Auth)
|
||||
}
|
||||
fatalOnError(err)
|
||||
|
||||
|
||||
365
cmd/hostfinder/main.go
Normal file
365
cmd/hostfinder/main.go
Normal file
@@ -0,0 +1,365 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"fmt"
|
||||
"net"
|
||||
"os"
|
||||
"sort"
|
||||
)
|
||||
|
||||
func main() {
|
||||
ctx := context.Background()
|
||||
os.Exit(_main(ctx))
|
||||
}
|
||||
|
||||
func _main(ctx context.Context) int {
|
||||
fmt.Println("Host finder for Cyberghost")
|
||||
resolverAddress := flag.String("resolver", "1.1.1.1", "DNS Resolver IP address to use")
|
||||
flag.Parse()
|
||||
|
||||
resolver := newResolver(*resolverAddress)
|
||||
lookupIP := newLookupIP(resolver)
|
||||
|
||||
const domain = "cg-dialup.net"
|
||||
groups := getCyberghostGroups()
|
||||
countryCodes := getCountryCodes()
|
||||
type result struct {
|
||||
groupName string
|
||||
region string
|
||||
subdomain string
|
||||
exists bool
|
||||
}
|
||||
resultsChannel := make(chan result)
|
||||
const maxGoroutines = 10
|
||||
guard := make(chan struct{}, maxGoroutines)
|
||||
fmt.Print("Subdomains found: ")
|
||||
for groupName, groupID := range groups {
|
||||
for country, countryCode := range countryCodes {
|
||||
go func(groupName, groupID, country, countryCode string) {
|
||||
r := result{
|
||||
region: country,
|
||||
groupName: groupName,
|
||||
subdomain: fmt.Sprintf("%s-%s", groupID, countryCode),
|
||||
}
|
||||
fqdn := fmt.Sprintf("%s.%s", r.subdomain, domain)
|
||||
guard <- struct{}{}
|
||||
ips, err := lookupIP(ctx, fqdn)
|
||||
<-guard
|
||||
if err == nil && len(ips) > 0 {
|
||||
r.exists = true
|
||||
}
|
||||
resultsChannel <- r
|
||||
}(groupName, groupID, country, countryCode)
|
||||
}
|
||||
}
|
||||
results := make([]result, len(groups)*len(countryCodes))
|
||||
for i := range results {
|
||||
results[i] = <-resultsChannel
|
||||
fmt.Printf("%s ", results[i].subdomain)
|
||||
}
|
||||
fmt.Print("\n\n")
|
||||
sort.Slice(results, func(i, j int) bool {
|
||||
return results[i].region < results[j].region
|
||||
})
|
||||
for _, r := range results {
|
||||
if r.exists {
|
||||
// Use in resolver program
|
||||
fmt.Printf("{subdomain: %q, region: %q, group: %q},\n", r.subdomain, r.region, r.groupName)
|
||||
}
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
func newResolver(ip string) *net.Resolver {
|
||||
return &net.Resolver{
|
||||
PreferGo: true,
|
||||
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
|
||||
d := net.Dialer{}
|
||||
return d.DialContext(ctx, "udp", net.JoinHostPort(ip, "53"))
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
type lookupIPFunc func(ctx context.Context, host string) (ips []net.IP, err error)
|
||||
|
||||
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 getCyberghostGroups() map[string]string {
|
||||
return map[string]string{
|
||||
"Premium UDP Europe": "87-1",
|
||||
"Premium UDP USA": "94-1",
|
||||
"Premium UDP Asia": "95-1",
|
||||
"NoSpy UDP Europe": "87-8",
|
||||
"Premium TCP Europe": "97-1",
|
||||
"Premium TCP USA": "93-1",
|
||||
"Premium TCP Asia": "96-1",
|
||||
"NoSpy TCP Europe": "97-8",
|
||||
}
|
||||
}
|
||||
|
||||
func getCountryCodes() map[string]string {
|
||||
return map[string]string{
|
||||
"Afghanistan": "af",
|
||||
"Aland Islands": "ax",
|
||||
"Albania": "al",
|
||||
"Algeria": "dz",
|
||||
"American Samoa": "as",
|
||||
"Andorra": "ad",
|
||||
"Angola": "ao",
|
||||
"Anguilla": "ai",
|
||||
"Antarctica": "aq",
|
||||
"Antigua and Barbuda": "ag",
|
||||
"Argentina": "ar",
|
||||
"Armenia": "am",
|
||||
"Aruba": "aw",
|
||||
"Australia": "au",
|
||||
"Austria": "at",
|
||||
"Azerbaijan": "az",
|
||||
"Bahamas": "bs",
|
||||
"Bahrain": "bh",
|
||||
"Bangladesh": "bd",
|
||||
"Barbados": "bb",
|
||||
"Belarus": "by",
|
||||
"Belgium": "be",
|
||||
"Belize": "bz",
|
||||
"Benin": "bj",
|
||||
"Bermuda": "bm",
|
||||
"Bhutan": "bt",
|
||||
"Bolivia": "bo",
|
||||
"Bonaire": "bq",
|
||||
"Bosnia and Herzegovina": "ba",
|
||||
"Botswana": "bw",
|
||||
"Bouvet Island": "bv",
|
||||
"Brazil": "br",
|
||||
"British Indian Ocean Territory": "io",
|
||||
"British Virgin Islands": "vg",
|
||||
"Brunei Darussalam": "bn",
|
||||
"Bulgaria": "bg",
|
||||
"Burkina Faso": "bf",
|
||||
"Burundi": "bi",
|
||||
"Cambodia": "kh",
|
||||
"Cameroon": "cm",
|
||||
"Canada": "ca",
|
||||
"Cape Verde": "cv",
|
||||
"Cayman Islands": "ky",
|
||||
"Central African Republic": "cf",
|
||||
"Chad": "td",
|
||||
"Chile": "cl",
|
||||
"China": "cn",
|
||||
"Christmas Island": "cx",
|
||||
"Cocos Islands": "cc",
|
||||
"Colombia": "co",
|
||||
"Comoros": "km",
|
||||
"Congo": "cg",
|
||||
"Cook Islands": "ck",
|
||||
"Costa Rica": "cr",
|
||||
"Cote d'Ivoire": "ci",
|
||||
"Croatia": "hr",
|
||||
"Cuba": "cu",
|
||||
"Curacao": "cw",
|
||||
"Cyprus": "cy",
|
||||
"Czech Republic": "cz",
|
||||
"Democratic Republic of the Congo": "cd",
|
||||
"Denmark": "dk",
|
||||
"Djibouti": "dj",
|
||||
"Dominica": "dm",
|
||||
"Dominican Republic": "do",
|
||||
"Ecuador": "ec",
|
||||
"Egypt": "eg",
|
||||
"El Salvador": "sv",
|
||||
"Equatorial Guinea": "gq",
|
||||
"Eritrea": "er",
|
||||
"Estonia": "ee",
|
||||
"Ethiopia": "et",
|
||||
"Falkland Islands": "fk",
|
||||
"Faroe Islands": "fo",
|
||||
"Fiji": "fj",
|
||||
"Finland": "fi",
|
||||
"France": "fr",
|
||||
"French Guiana": "gf",
|
||||
"French Polynesia": "pf",
|
||||
"French Southern Territories": "tf",
|
||||
"Gabon": "ga",
|
||||
"Gambia": "gm",
|
||||
"Georgia": "ge",
|
||||
"Germany": "de",
|
||||
"Ghana": "gh",
|
||||
"Gibraltar": "gi",
|
||||
"Greece": "gr",
|
||||
"Greenland": "gl",
|
||||
"Grenada": "gd",
|
||||
"Guadeloupe": "gp",
|
||||
"Guam": "gu",
|
||||
"Guatemala": "gt",
|
||||
"Guernsey": "gg",
|
||||
"Guinea-Bissau": "gw",
|
||||
"Guinea": "gn",
|
||||
"Guyana": "gy",
|
||||
"Haiti": "ht",
|
||||
"Heard Island and McDonald Islands": "hm",
|
||||
"Honduras": "hn",
|
||||
"Hong Kong": "hk",
|
||||
"Hungary": "hu",
|
||||
"Iceland": "is",
|
||||
"India": "in",
|
||||
"Indonesia": "id",
|
||||
"Iran": "ir",
|
||||
"Iraq": "iq",
|
||||
"Ireland": "ie",
|
||||
"Isle of Man": "im",
|
||||
"Israel": "il",
|
||||
"Italy": "it",
|
||||
"Jamaica": "jm",
|
||||
"Japan": "jp",
|
||||
"Jersey": "je",
|
||||
"Jordan": "jo",
|
||||
"Kazakhstan": "kz",
|
||||
"Kenya": "ke",
|
||||
"Kiribati": "ki",
|
||||
"Korea": "kr",
|
||||
"Kuwait": "kw",
|
||||
"Kyrgyzstan": "kg",
|
||||
"Lao People's Democratic Republic": "la",
|
||||
"Latvia": "lv",
|
||||
"Lebanon": "lb",
|
||||
"Lesotho": "ls",
|
||||
"Liberia": "lr",
|
||||
"Libya": "ly",
|
||||
"Liechtenstein": "li",
|
||||
"Lithuania": "lt",
|
||||
"Luxembourg": "lu",
|
||||
"Macao": "mo",
|
||||
"Macedonia": "mk",
|
||||
"Madagascar": "mg",
|
||||
"Malawi": "mw",
|
||||
"Malaysia": "my",
|
||||
"Maldives": "mv",
|
||||
"Mali": "ml",
|
||||
"Malta": "mt",
|
||||
"Marshall Islands": "mh",
|
||||
"Martinique": "mq",
|
||||
"Mauritania": "mr",
|
||||
"Mauritius": "mu",
|
||||
"Mayotte": "yt",
|
||||
"Mexico": "mx",
|
||||
"Micronesia": "fm",
|
||||
"Moldova": "md",
|
||||
"Monaco": "mc",
|
||||
"Mongolia": "mn",
|
||||
"Montenegro": "me",
|
||||
"Montserrat": "ms",
|
||||
"Morocco": "ma",
|
||||
"Mozambique": "mz",
|
||||
"Myanmar": "mm",
|
||||
"Namibia": "na",
|
||||
"Nauru": "nr",
|
||||
"Nepal": "np",
|
||||
"Netherlands": "nl",
|
||||
"New Caledonia": "nc",
|
||||
"New Zealand": "nz",
|
||||
"Nicaragua": "ni",
|
||||
"Niger": "ne",
|
||||
"Nigeria": "ng",
|
||||
"Niue": "nu",
|
||||
"Norfolk Island": "nf",
|
||||
"Northern Mariana Islands": "mp",
|
||||
"Norway": "no",
|
||||
"Oman": "om",
|
||||
"Pakistan": "pk",
|
||||
"Palau": "pw",
|
||||
"Palestine, State of": "ps",
|
||||
"Panama": "pa",
|
||||
"Papua New Guinea": "pg",
|
||||
"Paraguay": "py",
|
||||
"Peru": "pe",
|
||||
"Philippines": "ph",
|
||||
"Pitcairn": "pn",
|
||||
"Poland": "pl",
|
||||
"Portugal": "pt",
|
||||
"Puerto Rico": "pr",
|
||||
"Qatar": "qa",
|
||||
"Reunion": "re",
|
||||
"Romania": "ro",
|
||||
"Russian Federation": "ru",
|
||||
"Rwanda": "rw",
|
||||
"Saint Barthelemy": "bl",
|
||||
"Saint Helena": "sh",
|
||||
"Saint Kitts and Nevis": "kn",
|
||||
"Saint Lucia": "lc",
|
||||
"Saint Martin": "mf",
|
||||
"Saint Pierre and Miquelon": "pm",
|
||||
"Saint Vincent and the Grenadines": "vc",
|
||||
"Samoa": "ws",
|
||||
"San Marino": "sm",
|
||||
"Sao Tome and Principe": "st",
|
||||
"Saudi Arabia": "sa",
|
||||
"Senegal": "sn",
|
||||
"Serbia": "rs",
|
||||
"Seychelles": "sc",
|
||||
"Sierra Leone": "sl",
|
||||
"Singapore": "sg",
|
||||
"Sint Maarten": "sx",
|
||||
"Slovakia": "sk",
|
||||
"Slovenia": "si",
|
||||
"Solomon Islands": "sb",
|
||||
"Somalia": "so",
|
||||
"South Africa": "za",
|
||||
"South Georgia and the South Sandwich Islands": "gs",
|
||||
"South Sudan": "ss",
|
||||
"Spain": "es",
|
||||
"Sri Lanka": "lk",
|
||||
"Sudan": "sd",
|
||||
"Suriname": "sr",
|
||||
"Svalbard and Jan Mayen": "sj",
|
||||
"Swaziland": "sz",
|
||||
"Sweden": "se",
|
||||
"Switzerland": "ch",
|
||||
"Syrian Arab Republic": "sy",
|
||||
"Taiwan": "tw",
|
||||
"Tajikistan": "tj",
|
||||
"Tanzania": "tz",
|
||||
"Thailand": "th",
|
||||
"Timor-Leste": "tl",
|
||||
"Togo": "tg",
|
||||
"Tokelau": "tk",
|
||||
"Tonga": "to",
|
||||
"Trinidad and Tobago": "tt",
|
||||
"Tunisia": "tn",
|
||||
"Turkey": "tr",
|
||||
"Turkmenistan": "tm",
|
||||
"Turks and Caicos Islands": "tc",
|
||||
"Tuvalu": "tv",
|
||||
"Uganda": "ug",
|
||||
"Ukraine": "ua",
|
||||
"United Arab Emirates": "ae",
|
||||
"United Kingdom": "gb",
|
||||
"United States Minor Outlying Islands": "um",
|
||||
"United States": "us",
|
||||
"Uruguay": "uy",
|
||||
"US Virgin Islands": "vi",
|
||||
"Uzbekistan": "uz",
|
||||
"Vanuatu": "vu",
|
||||
"Vatican City State": "va",
|
||||
"Venezuela": "ve",
|
||||
"Vietnam": "vn",
|
||||
"Wallis and Futuna": "wf",
|
||||
"Western Sahara": "eh",
|
||||
"Yemen": "ye",
|
||||
"Zambia": "zm",
|
||||
"Zimbabwe": "zw",
|
||||
}
|
||||
}
|
||||
@@ -18,7 +18,7 @@ func main() {
|
||||
|
||||
func _main(ctx context.Context) int {
|
||||
resolverAddress := flag.String("resolver", "1.1.1.1", "DNS Resolver IP address to use")
|
||||
provider := flag.String("provider", "pia", "VPN provider to resolve for, 'pia' or 'windscribe'")
|
||||
provider := flag.String("provider", "pia", "VPN provider to resolve for, 'pia', 'windscribe' or 'cyberghost'")
|
||||
region := flag.String("region", "all", "Comma separated list of VPN provider region names to resolve for, use 'all' to resolve all")
|
||||
flag.Parse()
|
||||
|
||||
@@ -37,6 +37,9 @@ func _main(ctx context.Context) int {
|
||||
case "surfshark":
|
||||
domain = "prod.surfshark.com"
|
||||
servers = surfsharkServers()
|
||||
case "cyberghost":
|
||||
domain = "cg-dialup.net"
|
||||
servers = cyberghostServers()
|
||||
default:
|
||||
fmt.Printf("Provider %q is not supported\n", *provider)
|
||||
return 1
|
||||
@@ -119,6 +122,11 @@ func formatLine(provider string, s server, ips []net.IP) string {
|
||||
"{Region: models.SurfsharkRegion(%q), IPs: []net.IP{%s}},",
|
||||
s.region, ipString,
|
||||
)
|
||||
case "cyberghost":
|
||||
return fmt.Sprintf(
|
||||
"{Region: models.CyberghostRegion(%q), Group: models.CyberghostGroup(%q), IPs: []net.IP{%s}},",
|
||||
s.region, s.group, ipString,
|
||||
)
|
||||
}
|
||||
return ""
|
||||
}
|
||||
@@ -180,6 +188,7 @@ func uniqueSortedIPs(ips []net.IP) []net.IP {
|
||||
type server struct {
|
||||
subdomain string
|
||||
region string
|
||||
group string // only for cyberghost
|
||||
}
|
||||
|
||||
func piaServers() []server {
|
||||
@@ -463,3 +472,192 @@ func surfsharkServers() []server {
|
||||
{subdomain: "za-jnb", region: "South Africa"},
|
||||
}
|
||||
}
|
||||
|
||||
func cyberghostServers() []server {
|
||||
return []server{
|
||||
{subdomain: "97-1-al", region: "Albania", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-al", region: "Albania", group: "Premium UDP Europe"},
|
||||
{subdomain: "87-1-dz", region: "Algeria", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-dz", region: "Algeria", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-ad", region: "Andorra", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-ad", region: "Andorra", group: "Premium UDP Europe"},
|
||||
{subdomain: "94-1-ar", region: "Argentina", group: "Premium UDP USA"},
|
||||
{subdomain: "93-1-ar", region: "Argentina", group: "Premium TCP USA"},
|
||||
{subdomain: "87-1-am", region: "Armenia", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-am", region: "Armenia", group: "Premium TCP Europe"},
|
||||
{subdomain: "95-1-au", region: "Australia", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-au", region: "Australia", group: "Premium TCP Asia"},
|
||||
{subdomain: "97-1-at", region: "Austria", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-at", region: "Austria", group: "Premium UDP Europe"},
|
||||
{subdomain: "93-1-bs", region: "Bahamas", group: "Premium TCP USA"},
|
||||
{subdomain: "94-1-bs", region: "Bahamas", group: "Premium UDP USA"},
|
||||
{subdomain: "95-1-bd", region: "Bangladesh", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-bd", region: "Bangladesh", group: "Premium TCP Asia"},
|
||||
{subdomain: "97-1-by", region: "Belarus", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-by", region: "Belarus", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-be", region: "Belgium", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-be", region: "Belgium", group: "Premium UDP Europe"},
|
||||
{subdomain: "87-1-ba", region: "Bosnia and Herzegovina", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-ba", region: "Bosnia and Herzegovina", group: "Premium TCP Europe"},
|
||||
{subdomain: "94-1-br", region: "Brazil", group: "Premium UDP USA"},
|
||||
{subdomain: "93-1-br", region: "Brazil", group: "Premium TCP USA"},
|
||||
{subdomain: "87-1-bg", region: "Bulgaria", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-bg", region: "Bulgaria", group: "Premium TCP Europe"},
|
||||
{subdomain: "96-1-kh", region: "Cambodia", group: "Premium TCP Asia"},
|
||||
{subdomain: "95-1-kh", region: "Cambodia", group: "Premium UDP Asia"},
|
||||
{subdomain: "93-1-ca", region: "Canada", group: "Premium TCP USA"},
|
||||
{subdomain: "94-1-ca", region: "Canada", group: "Premium UDP USA"},
|
||||
{subdomain: "93-1-cl", region: "Chile", group: "Premium TCP USA"},
|
||||
{subdomain: "94-1-cl", region: "Chile", group: "Premium UDP USA"},
|
||||
{subdomain: "96-1-cn", region: "China", group: "Premium TCP Asia"},
|
||||
{subdomain: "95-1-cn", region: "China", group: "Premium UDP Asia"},
|
||||
{subdomain: "94-1-co", region: "Colombia", group: "Premium UDP USA"},
|
||||
{subdomain: "93-1-co", region: "Colombia", group: "Premium TCP USA"},
|
||||
{subdomain: "93-1-cr", region: "Costa Rica", group: "Premium TCP USA"},
|
||||
{subdomain: "94-1-cr", region: "Costa Rica", group: "Premium UDP USA"},
|
||||
{subdomain: "87-1-cy", region: "Cyprus", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-cy", region: "Cyprus", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-cz", region: "Czech Republic", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-cz", region: "Czech Republic", group: "Premium UDP Europe"},
|
||||
{subdomain: "87-1-dk", region: "Denmark", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-dk", region: "Denmark", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-eg", region: "Egypt", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-eg", region: "Egypt", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-ee", region: "Estonia", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-ee", region: "Estonia", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-fi", region: "Finland", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-fi", region: "Finland", group: "Premium UDP Europe"},
|
||||
{subdomain: "87-1-fr", region: "France", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-fr", region: "France", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-ge", region: "Georgia", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-ge", region: "Georgia", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-de", region: "Germany", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-de", region: "Germany", group: "Premium UDP Europe"},
|
||||
{subdomain: "87-1-gr", region: "Greece", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-gr", region: "Greece", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-gl", region: "Greenland", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-gl", region: "Greenland", group: "Premium UDP Europe"},
|
||||
{subdomain: "96-1-hk", region: "Hong Kong", group: "Premium TCP Asia"},
|
||||
{subdomain: "95-1-hk", region: "Hong Kong", group: "Premium UDP Asia"},
|
||||
{subdomain: "87-1-hu", region: "Hungary", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-hu", region: "Hungary", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-is", region: "Iceland", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-is", region: "Iceland", group: "Premium UDP Europe"},
|
||||
{subdomain: "87-1-in", region: "India", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-in", region: "India", group: "Premium TCP Europe"},
|
||||
{subdomain: "95-1-id", region: "Indonesia", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-id", region: "Indonesia", group: "Premium TCP Asia"},
|
||||
{subdomain: "87-1-ir", region: "Iran", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-ir", region: "Iran", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-ie", region: "Ireland", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-ie", region: "Ireland", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-im", region: "Isle of Man", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-im", region: "Isle of Man", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-il", region: "Israel", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-il", region: "Israel", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-it", region: "Italy", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-it", region: "Italy", group: "Premium UDP Europe"},
|
||||
{subdomain: "95-1-jp", region: "Japan", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-jp", region: "Japan", group: "Premium TCP Asia"},
|
||||
{subdomain: "97-1-kz", region: "Kazakhstan", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-kz", region: "Kazakhstan", group: "Premium UDP Europe"},
|
||||
{subdomain: "95-1-ke", region: "Kenya", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-ke", region: "Kenya", group: "Premium TCP Asia"},
|
||||
{subdomain: "95-1-kr", region: "Korea", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-kr", region: "Korea", group: "Premium TCP Asia"},
|
||||
{subdomain: "97-1-lv", region: "Latvia", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-lv", region: "Latvia", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-li", region: "Liechtenstein", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-li", region: "Liechtenstein", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-lt", region: "Lithuania", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-lt", region: "Lithuania", group: "Premium UDP Europe"},
|
||||
{subdomain: "87-1-lu", region: "Luxembourg", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-lu", region: "Luxembourg", group: "Premium TCP Europe"},
|
||||
{subdomain: "96-1-mo", region: "Macao", group: "Premium TCP Asia"},
|
||||
{subdomain: "95-1-mo", region: "Macao", group: "Premium UDP Asia"},
|
||||
{subdomain: "97-1-mk", region: "Macedonia", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-mk", region: "Macedonia", group: "Premium UDP Europe"},
|
||||
{subdomain: "95-1-my", region: "Malaysia", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-my", region: "Malaysia", group: "Premium TCP Asia"},
|
||||
{subdomain: "87-1-mt", region: "Malta", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-mt", region: "Malta", group: "Premium TCP Europe"},
|
||||
{subdomain: "93-1-mx", region: "Mexico", group: "Premium TCP USA"},
|
||||
{subdomain: "94-1-mx", region: "Mexico", group: "Premium UDP USA"},
|
||||
{subdomain: "87-1-md", region: "Moldova", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-md", region: "Moldova", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-mc", region: "Monaco", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-mc", region: "Monaco", group: "Premium TCP Europe"},
|
||||
{subdomain: "96-1-mn", region: "Mongolia", group: "Premium TCP Asia"},
|
||||
{subdomain: "95-1-mn", region: "Mongolia", group: "Premium UDP Asia"},
|
||||
{subdomain: "87-1-me", region: "Montenegro", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-me", region: "Montenegro", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-ma", region: "Morocco", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-ma", region: "Morocco", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-nl", region: "Netherlands", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-nl", region: "Netherlands", group: "Premium UDP Europe"},
|
||||
{subdomain: "95-1-nz", region: "New Zealand", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-nz", region: "New Zealand", group: "Premium TCP Asia"},
|
||||
{subdomain: "87-1-ng", region: "Nigeria", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-ng", region: "Nigeria", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-no", region: "Norway", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-no", region: "Norway", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-pk", region: "Pakistan", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-pk", region: "Pakistan", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-pa", region: "Panama", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-pa", region: "Panama", group: "Premium UDP Europe"},
|
||||
{subdomain: "95-1-ph", region: "Philippines", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-ph", region: "Philippines", group: "Premium TCP Asia"},
|
||||
{subdomain: "97-1-pl", region: "Poland", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-pl", region: "Poland", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-pt", region: "Portugal", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-pt", region: "Portugal", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-qa", region: "Qatar", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-qa", region: "Qatar", group: "Premium UDP Europe"},
|
||||
{subdomain: "87-1-ro", region: "Romania", group: "Premium UDP Europe"},
|
||||
{subdomain: "87-8-ro", region: "Romania", group: "NoSpy UDP Europe"},
|
||||
{subdomain: "97-8-ro", region: "Romania", group: "NoSpy TCP Europe"},
|
||||
{subdomain: "97-1-ro", region: "Romania", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-ru", region: "Russian Federation", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-ru", region: "Russian Federation", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-sa", region: "Saudi Arabia", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-sa", region: "Saudi Arabia", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-rs", region: "Serbia", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-rs", region: "Serbia", group: "Premium UDP Europe"},
|
||||
{subdomain: "95-1-sg", region: "Singapore", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-sg", region: "Singapore", group: "Premium TCP Asia"},
|
||||
{subdomain: "87-1-sk", region: "Slovakia", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-sk", region: "Slovakia", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-si", region: "Slovenia", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-si", region: "Slovenia", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-za", region: "South Africa", group: "Premium UDP Europe"},
|
||||
{subdomain: "95-1-za", region: "South Africa", group: "Premium UDP Asia"},
|
||||
{subdomain: "97-1-za", region: "South Africa", group: "Premium TCP Europe"},
|
||||
{subdomain: "96-1-za", region: "South Africa", group: "Premium TCP Asia"},
|
||||
{subdomain: "97-1-es", region: "Spain", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-es", region: "Spain", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-lk", region: "Sri Lanka", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-lk", region: "Sri Lanka", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-se", region: "Sweden", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-se", region: "Sweden", group: "Premium UDP Europe"},
|
||||
{subdomain: "87-1-ch", region: "Switzerland", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-ch", region: "Switzerland", group: "Premium TCP Europe"},
|
||||
{subdomain: "96-1-tw", region: "Taiwan", group: "Premium TCP Asia"},
|
||||
{subdomain: "95-1-tw", region: "Taiwan", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-th", region: "Thailand", group: "Premium TCP Asia"},
|
||||
{subdomain: "95-1-th", region: "Thailand", group: "Premium UDP Asia"},
|
||||
{subdomain: "87-1-tr", region: "Turkey", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-tr", region: "Turkey", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-ua", region: "Ukraine", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-ua", region: "Ukraine", group: "Premium UDP Europe"},
|
||||
{subdomain: "87-1-ae", region: "United Arab Emirates", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-ae", region: "United Arab Emirates", group: "Premium TCP Europe"},
|
||||
{subdomain: "97-1-gb", region: "United Kingdom", group: "Premium TCP Europe"},
|
||||
{subdomain: "87-1-gb", region: "United Kingdom", group: "Premium UDP Europe"},
|
||||
{subdomain: "94-1-us", region: "United States", group: "Premium UDP USA"},
|
||||
{subdomain: "93-1-us", region: "United States", group: "Premium TCP USA"},
|
||||
{subdomain: "87-1-ve", region: "Venezuela", group: "Premium UDP Europe"},
|
||||
{subdomain: "97-1-ve", region: "Venezuela", group: "Premium TCP Europe"},
|
||||
{subdomain: "95-1-vn", region: "Vietnam", group: "Premium UDP Asia"},
|
||||
{subdomain: "96-1-vn", region: "Vietnam", group: "Premium TCP Asia"},
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user