diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md index 3ccf84c4..0cb95183 100644 --- a/.github/ISSUE_TEMPLATE/bug.md +++ b/.github/ISSUE_TEMPLATE/bug.md @@ -20,6 +20,7 @@ assignees: qdm12 - [ ] Mullvad - [ ] Windscribe - [ ] Surfshark + - [ ] Cyberghost 3. What's the version of the program? diff --git a/.github/ISSUE_TEMPLATE/help.md b/.github/ISSUE_TEMPLATE/help.md index ba2ba6ea..df5d42e3 100644 --- a/.github/ISSUE_TEMPLATE/help.md +++ b/.github/ISSUE_TEMPLATE/help.md @@ -20,6 +20,7 @@ assignees: - [ ] Mullvad - [ ] Windscribe - [ ] Surfshark + - [ ] Cyberghost 3. What's the version of the program? diff --git a/Dockerfile b/Dockerfile index c6361300..e12d51f5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,7 +42,7 @@ ENV VPNSP=pia \ UID=1000 \ GID=1000 \ IP_STATUS_FILE="/ip" \ - # PIA, Windscribe and Surfshark only + # PIA, Windscribe, Surfshark and Cyberghost only USER= \ PASSWORD= \ REGION="Austria" \ @@ -56,6 +56,8 @@ ENV VPNSP=pia \ ISP= \ # Mullvad and Windscribe only PORT= \ + # Cyberghost only + CYBERGHOST_GROUP="Premium UDP Europe" \ # Openvpn OPENVPN_CIPHER= \ OPENVPN_AUTH= \ diff --git a/README.md b/README.md index 6121a2e2..70841aa4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Gluetun VPN client -*Lightweight swiss-knife-like VPN client to tunnel to Private Internet Access, Mullvad, Windscribe and Surfshark VPN servers, using Go, OpenVPN, iptables, DNS over TLS, ShadowSocks and Tinyproxy* +*Lightweight swiss-knife-like VPN client to tunnel to Private Internet Access, Mullvad, Windscribe, Surfshark and Cyberghost VPN servers, using Go, OpenVPN, iptables, DNS over TLS, ShadowSocks and Tinyproxy* **ANNOUNCEMENT**: *New wiki available [here](https://github.com/qdm12/private-internet-access-docker/wiki)* @@ -33,7 +33,7 @@ ## Features - Based on Alpine 3.11 for a small Docker image below 50MB -- Supports **Private Internet Access**, **Mullvad**, **Windscribe** and **Surfshark** servers +- Supports **Private Internet Access**, **Mullvad**, **Windscribe**, **Surfshark** and **Cyberghost** servers - 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 - Choose the vpn network protocol, `udp` or `tcp` @@ -64,6 +64,10 @@ - Pick the [region](https://github.com/qdm12/private-internet-access-docker/wiki/Surfshark) or a multi hop region name +### Cyberghost + +- Pick the [region](https://github.com/qdm12/private-internet-access-docker/wiki/Cyberghost) + ### Extra niche features - Possibility of split horizon DNS by selecting multiple DNS over TLS providers @@ -82,6 +86,7 @@ [![https://windscribe.com/?affid=mh7nyafu](https://raw.githubusercontent.com/qdm12/private-internet-access-docker/master/doc/windscribe.jpg)](https://windscribe.com/?affid=mh7nyafu) - Surfshark: **username** and **password** ([sign up](https://order.surfshark.com/)) + - Cyberghost: **username**, **password** and **device client key file** ([sign up](https://www.cyberghostvpn.com/en_US/buy/cyberghost-vpn-4)) - If you have a host or router firewall, please refer [to the firewall documentation](https://github.com/qdm12/private-internet-access-docker/blob/master/doc/firewall.md) 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` @@ -178,6 +183,24 @@ Want more testing? ▶ [see the Wiki](https://github.com/qdm12/private-internet- | 🏁 `PASSWORD` | | | Your password | | `REGION` | `Austria` | One of the [Surfshark regions (subdomains)](https://github.com/qdm12/private-internet-access-docker/wiki/surfshark) | VPN server region | +- Cyberghost + + | Variable | Default | Choices | Description | + | --- | --- | --- | --- | + | 🏁 `USER` | | | Your username | + | 🏁 `PASSWORD` | | | Your password | + | 🏁 `CLIENT_KEY` | | | Your device client key content on a single line, **see below** | + | `REGION` | `Austria` | One of the [Cyberghost countries](https://github.com/qdm12/private-internet-access-docker/wiki/Cyberghost#regions) | VPN server country | + | `CYBERGHOST_GROUP` | `Premium UDP Europe` | One of the [server groups](https://github.com/qdm12/private-internet-access-docker/wiki/Cyberghost#server-groups) | Server group | + + To make `CLIENT_KEY`, run the following using your client.key file: + + ```sh + docker run -it --rm -v /yourpath/client.key:/client.key:ro qmcgaw/private-internet-access clientkey + ``` + + And use the line produced as the environment variable `CLIENT_KEY` + ### DNS over TLS None of the following values are required. diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index ed3b44f4..8adade66 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -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) diff --git a/cmd/hostfinder/main.go b/cmd/hostfinder/main.go new file mode 100644 index 00000000..ea2ac7fb --- /dev/null +++ b/cmd/hostfinder/main.go @@ -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", + } +} diff --git a/cmd/resolver/main.go b/cmd/resolver/main.go index 5cef7f63..8c21f113 100644 --- a/cmd/resolver/main.go +++ b/cmd/resolver/main.go @@ -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"}, + } +} diff --git a/docker-compose.yml b/docker-compose.yml index 0271ddb3..519fcf4c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,7 +21,7 @@ services: - OPENVPN_TARGET_IP= - TZ= - # PIA, Windscribe and Surfshark only + # PIA, Windscribe, Surfshark and Cyberghost only - REGION=Austria - USER=js89ds7 - PASSWORD=8fd9s239G @@ -38,6 +38,10 @@ services: # Mullvad and Windscribe only - PORT= + # Cyberghost only + - CYBERGHOST_GROUP=Premium UDP Europe + - CLIENT_KEY= + # DNS over TLS - DOT=on - DOT_PROVIDERS=cloudflare diff --git a/internal/cli/cli.go b/internal/cli/cli.go index 5b755d4f..823a8252 100644 --- a/internal/cli/cli.go +++ b/internal/cli/cli.go @@ -1,10 +1,34 @@ package cli import ( + "flag" "fmt" + "strings" + "net" + + "github.com/qdm12/golibs/files" ) +func ClientKey(args []string) error { + flagSet := flag.NewFlagSet("clientkey", flag.ExitOnError) + filepath := flagSet.String("path", "/client.key", "file path to the client.key file") + if err := flagSet.Parse(args); err != nil { + return err + } + fileManager := files.NewFileManager() + data, err := fileManager.ReadFile(*filepath) + if err != nil { + return err + } + s := string(data) + s = strings.ReplaceAll(s, "\n", "") + s = strings.TrimPrefix(s, "-----BEGIN PRIVATE KEY-----") + s = strings.TrimSuffix(s, "-----END PRIVATE KEY-----") + fmt.Println(s) + return nil +} + func HealthCheck() error { ips, err := net.LookupIP("github.com") if err != nil { diff --git a/internal/constants/cyberghost.go b/internal/constants/cyberghost.go new file mode 100644 index 00000000..89e14bff --- /dev/null +++ b/internal/constants/cyberghost.go @@ -0,0 +1,230 @@ +package constants + +import ( + "net" + "sort" + + "github.com/qdm12/private-internet-access-docker/internal/models" +) + +const ( + CyberghostCertificate = "MIIGWjCCBEKgAwIBAgIJAJxUG61mxDS7MA0GCSqGSIb3DQEBDQUAMHsxCzAJBgNVBAYTAlJPMRIwEAYDVQQHEwlCdWNoYXJlc3QxGDAWBgNVBAoTD0N5YmVyR2hvc3QgAlJPMRIwEAYDVQQHEwlCdWNoYXJlc3QxGDAWBgNVBAoTD0N5YmVyR2hvc3QgUy5BLjEbMBkGA1UEAxMSQ3liZXJHaG9zdCBSb290IENBMSEwHwYJKoZIhvcNAQkBFhJpbmZvQGN5YmVyZ2hvc3Qucm+CCQCcVButZsQ0uzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBDQUAA4ICAQDNyQ92kj4qiNjnHk99qvnFw9qGfwB9ofaPL74zh0G5hEe3Wgb2o4fqUGnvUNgOu53gJksz3DcPQ8t40wfmm9I1Z8tiM9qrqvkuQ+nKcLgdooXtEsTybPIYDZ2cWR/5E0TKRvC7RFzKgQ4D77Vbi4TdaHiDV7ZNfU1iLCoBGcYm80hcUHEs5KIVLwUmcSOTmbZBySJxcSD0yUpS7nlZGwLY6VQrU+JFwDSisbXT4DXf3iSzSIb3DQEBDQUAA4ICAQDNyQ92kj4qiNjnHk99qvnFw9qGfwB9ofaPL74zh0G5hEe3Wgb2o4fqUGnvUNgOu53gJksz3DcPQ8t40wfmm9I1Z8tiM9qrqvkuQ+nKcLgdooXtEsTybPIYDZ2cWR/5E0TKRvC7RFzKgQ4D77Vbi4TdaHiDV7ZNfU1iLCoBGcYm80hcUHEs5KIVLwUmcSOTmbZBySJxcSD0yUpS7nlZGwLY6VQrU+JFwDSisbXT4DXf3iSzTbgZg95LmstV6R6WKZkSFdUrE0DHl4dHoZvTFX+1LhwhHgjgDLaosX0vhG/C/7LpoVWimd6RRQT3M9o4Fa1TuhfvBzQ20QHrmRV/yKvGNK0xckZ6EZ/QY7Z55ORU15Tgab4ebnblYPWoEmn0mIYP3LFFeoR5OS1EX7+j4kPv+bwPGsmpHjxmZyq2Y7sJBpbOCJgbkn52WZdPBIRDpPdIHQ8pAJC4T0iMK9xvAwWNl/V6EYYNpR97osyEDXn+BTdAHlhJ5fck9KlwI9mb1Kg1bhbvbmaIAiOLenSULYf3j6rI1ygo3R2cCyybtuAq8M7z0OECAwEAAaOB4DCB3TAdBgNVHQ4EFgQU6tdK1g/He5qzjeAoM5eHt4in9iUwga0GA1UdIwSBpTCBooAU6tdK1g/He5qzjeAoM5eHt4in9iWhf6R9MHsxCzAJBgNVBAYTAlJPMRIwEAYDVQQHEwlCdWNoYXJlc3QxGDAWBgNVBAoTD0N5YmVyR2hvc3QgUy5BLjEbMBkGA1UEAxMSQ3liZXJHaG9zdCBSb290IENBMSEwHwYJKoZIhvcNAQkBFhJpAlJPMRIwEAYDVQQHEwlCdWNoYXJlc3QxGDAWBgNVBAoTD0N5YmVyR2hvc3QgUy5BLjEbMBkGA1UEAxMSQ3liZXJHaG9zdCBSb290IENBMSEwHwYJKoZIhvcNAQkBFhJpbmZvQGN5YmVyZ2hvc3Qucm+CCQCcVButZsQ0uzAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBDQUAA4ICAQDNyQ92kj4qiNjnHk99qvnFw9qGfwB9ofaPL74zh0G5hEe3UHEs5KIVLwUmcSOTmbZBySJxcSD0yUpS7nlZGwLY6VQrU+JFwDSisbXT4DXf3iSzWgb2o4fqUGnvUNgOu53gJksz3DcPQ8t40wfmm9I1Z8tiM9qrqvkuQ+nKcLgdooXtEsTybPIYDZ2cWR/5E0TKRvC7RFzKgQ4D77Vbi4TdaHiDV7ZNfU1iLCoBGcYm80hcUHEs5KIVLwUmcSOTmbZBySJxcSD0yUpS7nlZGwLY6VQrU+JFwDSisbXT4DXf3iSzlgiX2i8S8fPGdXvU37E9bdAXwP5nZriYq1s0D59Qfvz+vLXVkmyZp6ztxjKjKolemPMak0Y5c1Q4RjNF6tmQoFuy/ACSkWy14Tzu2dFp7UiVbGg1FOvKhfs48zC2/IUQv1arqmPT/9LVq3B2DVT9UKXRUXX/f/jSSsVjkz4uUe2jUyL+XHX1nSmROTPHSAJ+oKf0BLnfqUxFkEUTwLnayssP2nwGgq35b7wEbTFIXdrjHGFUVQIDeERz8UThew==" + CyberghostClientCertificate = "MIIGsTCCBJmgAwIBAgIEAulLdDANBgkqhkiG9w0BAQsFADB7MQswCQYDVQQGEwJSTzESMBAGA1UEBxMJQnVjaGFyZXN0MRgwFgYDVQQKEw9DeWJlckdob3N0IFMuQS4xGzAZBgNVBAMTEkN5YmVyR2hvc3QgUm9vdCBDQTEhMB8GCSqGSIb3DQEJARYSaW5mb0BjeWJlcmdob3N0LnJvMB4XDTIwMDMyNjE2MzAwN1oXDTMwMDMyNDE2MzAwN1owgYExCzAJBgNVBAYTAlJPMRIwEAYDVQQHDAlCdWNoYXJlc3QxGDAWBgNVBAoMD0N5YmVyR2hvc3QgUy5BLjEhMB8GA1UEAwwYcm95dmFubGllcm9wOTJAZ21haWwuY29tbDCBrQYDVR0jBIGlMIGigBTq10rWD8d7mrON4Cgzl4e3iKf2JaF/pH0wezELMAkGbDCBrQYDVR0jBIGlMIGigBTq10rWD8d7mrON4Cgzl4e3iKf2JaF/pH0wezELMAkGA1UEBhMCUk8xEjAQBgNVBAcTCUJ1Y2hhcmVzdDEYMBYGA1UEChMPQ3liZXJHaG9zdCBTLkEuMRswGQYDVQQDExJDeWJlckdob3N0IFJvb3QgQ0ExITAfBgkqhkiG9w0BCQEWEmluZm9AY3liZXJnaG9zdC5yb4IJAJxUG61mxDS7MA0GCSqGSIb3DQEBCwUAA4ICAQDGmt1vfww2E5tSTb9kCn6M7D/94/ZKXWSBL7m2CxDQvItjOj8grl0HfvvPsNbfLugb1iyPtkzO47DqLNDYzlf+lb4T5FLB75ksb0Q+kEfk6NCEVEdFiOcsFqXzdCBTLkEuMRswGQYDVQQDExJDeWJlckdob3N0IFJvb3QgQ0ExITAfBgkqhkiG9w0BCQEWEmluZm9AY3liZXJnaG9zdC5yb4IJAJxUG61mxDS7MA0GCSqGSIb3DQEBCwUAsNbfLugb1iyPtkzO47DqLNDYzlf+lb4T5FLB75ksb0Q+kEfk6NCEVEdFiOcsFqXzA1UEBhMCUk8xEjAQBgNVBAcTCUJ1Y2hhcmVzdDEYMBYGA1UEChMPQ3liZXJHaG9zdCBTLkEuMRswGQYDVQQDExJDeWJlckdob3N0IFJvb3QgQ0ExITAfBgkqhkiG9w0BCQEWEmluZm9AY3liZXJnaG9zdC5yb4IJAJxUG61mxDS7MA0GCSqGSIb3DQEBCwUAbDCBrQYDVR0jBIGlMIGigBTq10rWD8d7mrON4Cgzl4e3iKf2JaF/pH0wezELMAkGA1UEBhMCUk8xEjAQBgNVBAcTCUJ1Y2hhcmVzdDEYMBYGA1UEChMPQ3liZXJHaG9zdCBTLkEuMRswGQYDVQQDExJDeWJlckdob3N0IFJvb3QgQ0ExITAfBgkqhkiG9w0BCQEWEmluZm9AY3liZXJnaG9zdC5yb4IJAJxUG61mxDS7MA0GCSqGSIb3DQEBCwUAA4ICAQDGmt1vfww2E5tSTb9kCn6M7D/94/ZKXWSBL7m2CxDQvItjOj8grl0HfvvPVnlinhqQKNeyHqcHg2oS33hIIoDGasxmNqoexlh3HOQgzjUsXTG5entMOe3INKmEH97I17P2uKVZfzJtOvdLcg/XDC8HFLW8HnKjPeZs0+mo5wl7bIOmox40BB2fL0KDsNbfLugb1iyPtkzO47DqLNDYzlf+lb4T5FLB75ksb0Q+kEfk6NCEVEdFiOcsFqXzVnlinhqQKNeyHqcHg2oS33hIIoDGasxmNqoexlh3HOQgzjUsXTG5entMOe3INKmEH97I17P2uKVZfzJtOvdLcg/XDC8HFLW8HnKjPeZs0+mo5wl7bIOmox40BB2fL0KDfeMGYeF0GmiJpY2EkbEt0nIxils1oRmEtxuR49hrVVBGIyAf8A==" +) + +func CyberghostRegionChoices() (choices []string) { + uniqueChoices := map[string]struct{}{} + for _, server := range CyberghostServers() { + uniqueChoices[string(server.Region)] = struct{}{} + } + for choice := range uniqueChoices { + choices = append(choices, choice) + } + sort.Slice(choices, func(i, j int) bool { + return choices[i] < choices[j] + }) + return choices +} + +func CyberghostGroupChoices() (choices []string) { + uniqueChoices := map[string]struct{}{} + for _, server := range CyberghostServers() { + uniqueChoices[string(server.Group)] = struct{}{} + } + for choice := range uniqueChoices { + choices = append(choices, choice) + } + sort.Slice(choices, func(i, j int) bool { + return choices[i] < choices[j] + }) + return choices +} + +func CyberghostServers() []models.CyberghostServer { + return []models.CyberghostServer{ + {Region: models.CyberghostRegion("Albania"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{31, 171, 152, 99}, {31, 171, 152, 100}, {31, 171, 152, 102}, {31, 171, 152, 105}, {31, 171, 152, 107}, {31, 171, 152, 109}, {31, 171, 152, 133}, {31, 171, 152, 135}, {31, 171, 152, 136}, {31, 171, 152, 139}}}, + {Region: models.CyberghostRegion("Albania"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{31, 171, 152, 99}, {31, 171, 152, 101}, {31, 171, 152, 103}, {31, 171, 152, 105}, {31, 171, 152, 106}, {31, 171, 152, 133}, {31, 171, 152, 135}, {31, 171, 152, 137}, {31, 171, 152, 138}, {31, 171, 152, 139}}}, + {Region: models.CyberghostRegion("Algeria"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 133, 91, 7}, {45, 133, 91, 9}, {45, 133, 91, 12}, {45, 133, 91, 15}, {45, 133, 91, 17}, {45, 133, 91, 18}, {45, 133, 91, 20}, {45, 133, 91, 23}, {45, 133, 91, 24}, {45, 133, 91, 26}}}, + {Region: models.CyberghostRegion("Algeria"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 133, 91, 7}, {45, 133, 91, 10}, {45, 133, 91, 11}, {45, 133, 91, 15}, {45, 133, 91, 17}, {45, 133, 91, 18}, {45, 133, 91, 21}, {45, 133, 91, 25}, {45, 133, 91, 26}, {45, 133, 91, 29}}}, + {Region: models.CyberghostRegion("Andorra"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 139, 49, 10}, {45, 139, 49, 14}, {45, 139, 49, 15}, {45, 139, 49, 16}, {45, 139, 49, 17}, {45, 139, 49, 18}, {45, 139, 49, 19}, {45, 139, 49, 23}, {45, 139, 49, 25}, {45, 139, 49, 28}}}, + {Region: models.CyberghostRegion("Andorra"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 139, 49, 7}, {45, 139, 49, 9}, {45, 139, 49, 10}, {45, 139, 49, 12}, {45, 139, 49, 15}, {45, 139, 49, 16}, {45, 139, 49, 17}, {45, 139, 49, 25}, {45, 139, 49, 27}, {45, 139, 49, 28}}}, + {Region: models.CyberghostRegion("Argentina"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{190, 106, 130, 16}, {190, 106, 130, 17}, {190, 106, 130, 20}, {190, 106, 130, 22}, {190, 106, 130, 23}, {190, 106, 130, 34}, {190, 106, 130, 37}, {190, 106, 130, 38}, {190, 106, 130, 44}, {190, 106, 130, 45}}}, + {Region: models.CyberghostRegion("Argentina"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{190, 106, 130, 15}, {190, 106, 130, 16}, {190, 106, 130, 18}, {190, 106, 130, 19}, {190, 106, 130, 20}, {190, 106, 130, 34}, {190, 106, 130, 36}, {190, 106, 130, 37}, {190, 106, 130, 43}, {190, 106, 130, 52}}}, + {Region: models.CyberghostRegion("Armenia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 139, 50, 10}, {45, 139, 50, 12}, {45, 139, 50, 14}, {45, 139, 50, 18}, {45, 139, 50, 19}, {45, 139, 50, 20}, {45, 139, 50, 21}, {45, 139, 50, 26}, {45, 139, 50, 27}, {45, 139, 50, 29}}}, + {Region: models.CyberghostRegion("Armenia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 139, 50, 8}, {45, 139, 50, 10}, {45, 139, 50, 11}, {45, 139, 50, 14}, {45, 139, 50, 18}, {45, 139, 50, 20}, {45, 139, 50, 24}, {45, 139, 50, 26}, {45, 139, 50, 27}, {45, 139, 50, 29}}}, + {Region: models.CyberghostRegion("Australia"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{27, 50, 79, 3}, {27, 50, 79, 4}, {27, 50, 79, 5}, {27, 50, 79, 6}, {27, 50, 79, 9}, {27, 50, 79, 12}, {27, 50, 79, 14}, {103, 13, 101, 171}, {202, 130, 33, 114}, {202, 130, 33, 118}}}, + {Region: models.CyberghostRegion("Australia"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{27, 50, 79, 3}, {27, 50, 79, 6}, {27, 50, 79, 9}, {27, 50, 79, 10}, {27, 50, 79, 11}, {27, 50, 79, 13}, {103, 13, 101, 174}, {202, 130, 33, 114}, {202, 130, 33, 117}, {202, 130, 33, 118}}}, + {Region: models.CyberghostRegion("Austria"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{89, 187, 168, 133}, {89, 187, 168, 144}, {89, 187, 168, 150}, {89, 187, 168, 151}, {89, 187, 168, 162}, {89, 187, 168, 163}, {89, 187, 168, 164}, {89, 187, 168, 167}, {89, 187, 168, 178}, {89, 187, 168, 182}}}, + {Region: models.CyberghostRegion("Austria"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{89, 187, 168, 138}, {89, 187, 168, 139}, {89, 187, 168, 149}, {89, 187, 168, 150}, {89, 187, 168, 161}, {89, 187, 168, 165}, {89, 187, 168, 167}, {89, 187, 168, 168}, {89, 187, 168, 174}, {89, 187, 168, 182}}}, + {Region: models.CyberghostRegion("Bahamas"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{45, 132, 143, 8}, {45, 132, 143, 10}, {45, 132, 143, 11}, {45, 132, 143, 19}, {45, 132, 143, 24}, {45, 132, 143, 28}, {45, 132, 143, 31}, {45, 132, 143, 42}, {45, 132, 143, 43}, {45, 132, 143, 44}}}, + {Region: models.CyberghostRegion("Bahamas"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{45, 132, 143, 1}, {45, 132, 143, 2}, {45, 132, 143, 3}, {45, 132, 143, 5}, {45, 132, 143, 7}, {45, 132, 143, 18}, {45, 132, 143, 23}, {45, 132, 143, 30}, {45, 132, 143, 32}, {45, 132, 143, 48}}}, + {Region: models.CyberghostRegion("Bangladesh"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 132, 142, 3}, {45, 132, 142, 8}, {45, 132, 142, 12}, {45, 132, 142, 20}, {45, 132, 142, 22}, {45, 132, 142, 26}, {45, 132, 142, 27}, {45, 132, 142, 37}, {45, 132, 142, 39}, {45, 132, 142, 42}}}, + {Region: models.CyberghostRegion("Bangladesh"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 132, 142, 6}, {45, 132, 142, 8}, {45, 132, 142, 13}, {45, 132, 142, 18}, {45, 132, 142, 33}, {45, 132, 142, 35}, {45, 132, 142, 38}, {45, 132, 142, 41}, {45, 132, 142, 42}, {45, 132, 142, 45}}}, + {Region: models.CyberghostRegion("Belarus"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 194, 3}, {45, 132, 194, 4}, {45, 132, 194, 26}, {45, 132, 194, 28}, {45, 132, 194, 34}, {45, 132, 194, 38}, {45, 132, 194, 39}, {45, 132, 194, 42}, {45, 132, 194, 44}, {45, 132, 194, 48}}}, + {Region: models.CyberghostRegion("Belarus"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 194, 4}, {45, 132, 194, 5}, {45, 132, 194, 9}, {45, 132, 194, 10}, {45, 132, 194, 20}, {45, 132, 194, 25}, {45, 132, 194, 29}, {45, 132, 194, 31}, {45, 132, 194, 40}, {45, 132, 194, 45}}}, + {Region: models.CyberghostRegion("Belgium"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 143, 52}, {37, 120, 143, 55}, {37, 120, 143, 58}, {185, 210, 217, 10}, {185, 210, 217, 54}, {185, 210, 217, 244}, {185, 210, 217, 251}, {185, 232, 21, 119}, {193, 9, 114, 228}, {193, 9, 114, 230}}}, + {Region: models.CyberghostRegion("Belgium"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{5, 253, 205, 22}, {5, 253, 205, 23}, {37, 120, 143, 165}, {185, 210, 217, 14}, {185, 210, 217, 248}, {185, 210, 217, 254}, {193, 9, 114, 212}, {193, 9, 114, 213}, {193, 9, 114, 219}, {193, 9, 114, 228}}}, + {Region: models.CyberghostRegion("Bosnia and Herzegovina"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Bosnia and Herzegovina"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Brazil"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{45, 231, 207, 65}, {45, 231, 207, 67}, {45, 231, 207, 68}, {45, 231, 207, 69}, {45, 231, 207, 75}, {177, 67, 81, 170}, {181, 41, 203, 98}, {181, 41, 203, 100}, {181, 41, 203, 102}, {181, 41, 203, 110}}}, + {Region: models.CyberghostRegion("Brazil"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{45, 231, 207, 77}, {177, 67, 81, 163}, {177, 67, 81, 164}, {177, 67, 81, 165}, {177, 67, 81, 167}, {177, 67, 81, 170}, {177, 67, 81, 173}, {177, 67, 81, 174}, {181, 41, 203, 103}, {181, 41, 203, 104}}}, + {Region: models.CyberghostRegion("Bulgaria"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 152, 99}, {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, 108}, {37, 120, 152, 109}, {37, 120, 152, 110}}}, + {Region: models.CyberghostRegion("Bulgaria"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 152, 99}, {37, 120, 152, 100}, {37, 120, 152, 101}, {37, 120, 152, 103}, {37, 120, 152, 104}, {37, 120, 152, 105}, {37, 120, 152, 107}, {37, 120, 152, 108}, {37, 120, 152, 109}, {37, 120, 152, 110}}}, + {Region: models.CyberghostRegion("Cambodia"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{188, 215, 235, 36}, {188, 215, 235, 38}, {188, 215, 235, 39}, {188, 215, 235, 40}, {188, 215, 235, 43}, {188, 215, 235, 46}, {188, 215, 235, 47}, {188, 215, 235, 48}, {188, 215, 235, 51}, {188, 215, 235, 54}}}, + {Region: models.CyberghostRegion("Cambodia"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{188, 215, 235, 35}, {188, 215, 235, 36}, {188, 215, 235, 37}, {188, 215, 235, 38}, {188, 215, 235, 45}, {188, 215, 235, 46}, {188, 215, 235, 52}, {188, 215, 235, 53}, {188, 215, 235, 55}, {188, 215, 235, 58}}}, + {Region: models.CyberghostRegion("Canada"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{37, 120, 205, 8}, {37, 120, 205, 28}, {104, 245, 145, 163}, {104, 245, 146, 38}, {104, 245, 146, 101}, {176, 113, 74, 44}, {176, 113, 74, 52}, {176, 113, 74, 67}, {176, 113, 74, 126}, {176, 113, 74, 217}}}, + {Region: models.CyberghostRegion("Canada"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{37, 120, 205, 40}, {54, 39, 11, 194}, {104, 245, 145, 164}, {104, 245, 146, 41}, {139, 28, 218, 86}, {139, 28, 218, 87}, {176, 113, 74, 19}, {176, 113, 74, 25}, {176, 113, 74, 30}, {176, 113, 74, 195}}}, + {Region: models.CyberghostRegion("Chile"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{190, 105, 239, 129}, {190, 105, 239, 130}, {190, 105, 239, 131}, {190, 105, 239, 132}, {190, 105, 239, 133}, {190, 105, 239, 134}, {190, 105, 239, 135}, {190, 105, 239, 136}, {190, 105, 239, 137}, {190, 105, 239, 138}}}, + {Region: models.CyberghostRegion("Chile"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{190, 105, 239, 129}, {190, 105, 239, 130}, {190, 105, 239, 131}, {190, 105, 239, 132}, {190, 105, 239, 133}, {190, 105, 239, 134}, {190, 105, 239, 135}, {190, 105, 239, 136}, {190, 105, 239, 137}, {190, 105, 239, 138}}}, + {Region: models.CyberghostRegion("China"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 132, 193, 2}, {45, 132, 193, 3}, {45, 132, 193, 9}, {45, 132, 193, 10}, {45, 132, 193, 12}, {45, 132, 193, 13}, {45, 132, 193, 32}, {45, 132, 193, 36}, {45, 132, 193, 43}, {45, 132, 193, 45}}}, + {Region: models.CyberghostRegion("China"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 132, 193, 2}, {45, 132, 193, 3}, {45, 132, 193, 4}, {45, 132, 193, 14}, {45, 132, 193, 19}, {45, 132, 193, 22}, {45, 132, 193, 30}, {45, 132, 193, 35}, {45, 132, 193, 36}, {45, 132, 193, 42}}}, + {Region: models.CyberghostRegion("Colombia"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{190, 105, 229, 19}, {190, 105, 229, 20}, {190, 105, 229, 21}, {190, 105, 229, 22}}}, + {Region: models.CyberghostRegion("Colombia"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{190, 105, 229, 19}, {190, 105, 229, 20}, {190, 105, 229, 21}, {190, 105, 229, 22}}}, + {Region: models.CyberghostRegion("Costa Rica"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{143, 202, 160, 67}, {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, 77}, {143, 202, 160, 78}}}, + {Region: models.CyberghostRegion("Costa Rica"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{143, 202, 160, 67}, {143, 202, 160, 68}, {143, 202, 160, 69}, {143, 202, 160, 70}, {143, 202, 160, 71}, {143, 202, 160, 73}, {143, 202, 160, 74}, {143, 202, 160, 75}, {143, 202, 160, 76}, {143, 202, 160, 78}}}, + {Region: models.CyberghostRegion("Cyprus"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 137, 8}, {45, 132, 137, 11}, {45, 132, 137, 12}, {45, 132, 137, 15}, {45, 132, 137, 17}, {45, 132, 137, 18}, {45, 132, 137, 19}, {45, 132, 137, 23}, {45, 132, 137, 26}, {45, 132, 137, 28}}}, + {Region: models.CyberghostRegion("Cyprus"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 137, 8}, {45, 132, 137, 10}, {45, 132, 137, 16}, {45, 132, 137, 19}, {45, 132, 137, 20}, {45, 132, 137, 21}, {45, 132, 137, 22}, {45, 132, 137, 23}, {45, 132, 137, 25}, {45, 132, 137, 28}}}, + {Region: models.CyberghostRegion("Czech Republic"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{195, 181, 160, 66}, {195, 181, 160, 72}, {195, 181, 161, 7}, {195, 181, 161, 9}, {195, 181, 161, 10}, {195, 181, 161, 11}, {195, 181, 161, 14}, {195, 181, 161, 17}, {195, 181, 161, 23}, {195, 181, 161, 25}}}, + {Region: models.CyberghostRegion("Czech Republic"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{185, 216, 35, 231}, {185, 216, 35, 232}, {185, 216, 35, 235}, {195, 181, 160, 75}, {195, 181, 161, 2}, {195, 181, 161, 8}, {195, 181, 161, 15}, {195, 181, 161, 16}, {195, 181, 161, 23}, {195, 181, 161, 25}}}, + {Region: models.CyberghostRegion("Denmark"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 145, 93}, {37, 120, 194, 39}, {37, 120, 194, 41}, {37, 120, 194, 53}, {95, 174, 65, 166}, {95, 174, 65, 167}, {95, 174, 65, 174}, {185, 206, 224, 230}, {185, 206, 224, 235}, {185, 206, 224, 253}}}, + {Region: models.CyberghostRegion("Denmark"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 145, 84}, {37, 120, 145, 88}, {37, 120, 194, 38}, {37, 120, 194, 58}, {95, 174, 65, 163}, {95, 174, 65, 165}, {185, 206, 224, 227}, {185, 206, 224, 243}, {185, 206, 224, 245}, {185, 206, 224, 253}}}, + {Region: models.CyberghostRegion("Egypt"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 139, 7}, {45, 132, 139, 22}, {45, 132, 139, 24}, {45, 132, 139, 27}, {45, 132, 139, 28}, {45, 132, 139, 29}, {188, 214, 122, 36}, {188, 214, 122, 41}, {188, 214, 122, 52}, {188, 214, 122, 56}}}, + {Region: models.CyberghostRegion("Egypt"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 139, 7}, {45, 132, 139, 17}, {45, 132, 139, 18}, {45, 132, 139, 22}, {45, 132, 139, 23}, {188, 214, 122, 41}, {188, 214, 122, 48}, {188, 214, 122, 49}, {188, 214, 122, 51}, {188, 214, 122, 61}}}, + {Region: models.CyberghostRegion("Estonia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{77, 247, 111, 6}, {77, 247, 111, 11}, {77, 247, 111, 52}, {77, 247, 111, 53}, {77, 247, 111, 55}, {77, 247, 111, 56}, {77, 247, 111, 57}, {77, 247, 111, 60}, {77, 247, 111, 61}, {77, 247, 111, 62}}}, + {Region: models.CyberghostRegion("Estonia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{77, 247, 111, 3}, {77, 247, 111, 4}, {77, 247, 111, 5}, {77, 247, 111, 7}, {77, 247, 111, 11}, {77, 247, 111, 12}, {77, 247, 111, 52}, {77, 247, 111, 53}, {77, 247, 111, 55}, {77, 247, 111, 59}}}, + {Region: models.CyberghostRegion("Finland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{194, 34, 133, 171}, {194, 34, 133, 172}, {194, 34, 133, 176}, {194, 34, 133, 179}, {194, 34, 133, 180}, {194, 34, 133, 195}, {194, 34, 133, 196}, {194, 34, 133, 204}, {194, 34, 133, 207}, {194, 34, 133, 208}}}, + {Region: models.CyberghostRegion("Finland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{194, 34, 133, 163}, {194, 34, 133, 164}, {194, 34, 133, 167}, {194, 34, 133, 178}, {194, 34, 133, 192}, {194, 34, 133, 201}, {194, 34, 133, 205}, {194, 34, 133, 206}, {194, 34, 133, 208}, {194, 34, 133, 214}}}, + {Region: models.CyberghostRegion("France"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{84, 17, 60, 21}, {84, 17, 60, 33}, {84, 17, 60, 89}, {84, 17, 60, 92}, {84, 17, 60, 114}, {84, 17, 61, 23}, {84, 17, 61, 43}, {84, 17, 61, 111}, {84, 17, 61, 235}, {151, 106, 8, 36}}}, + {Region: models.CyberghostRegion("France"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{84, 17, 60, 8}, {84, 17, 60, 54}, {84, 17, 60, 161}, {84, 17, 60, 188}, {84, 17, 61, 32}, {84, 17, 61, 101}, {84, 17, 61, 163}, {84, 17, 61, 187}, {84, 17, 61, 213}, {151, 106, 8, 46}}}, + {Region: models.CyberghostRegion("Georgia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 138, 7}, {45, 132, 138, 8}, {45, 132, 138, 9}, {45, 132, 138, 12}, {45, 132, 138, 14}, {45, 132, 138, 18}, {45, 132, 138, 19}, {45, 132, 138, 20}, {45, 132, 138, 23}, {45, 132, 138, 27}}}, + {Region: models.CyberghostRegion("Georgia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 138, 7}, {45, 132, 138, 8}, {45, 132, 138, 9}, {45, 132, 138, 10}, {45, 132, 138, 17}, {45, 132, 138, 18}, {45, 132, 138, 25}, {45, 132, 138, 26}, {45, 132, 138, 27}, {45, 132, 138, 28}}}, + {Region: models.CyberghostRegion("Germany"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 217, 110}, {84, 17, 48, 75}, {84, 17, 48, 100}, {84, 17, 48, 182}, {84, 17, 49, 129}, {154, 28, 188, 50}, {154, 28, 188, 128}, {178, 162, 208, 155}, {178, 162, 209, 72}, {178, 162, 216, 49}}}, + {Region: models.CyberghostRegion("Germany"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 217, 5}, {37, 120, 217, 27}, {84, 17, 48, 20}, {84, 17, 48, 64}, {84, 17, 48, 68}, {84, 17, 48, 182}, {84, 17, 49, 141}, {84, 17, 49, 144}, {154, 28, 188, 90}, {154, 28, 188, 143}}}, + {Region: models.CyberghostRegion("Greece"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{154, 57, 3, 130}, {154, 57, 3, 132}, {154, 57, 3, 135}, {154, 57, 3, 138}, {154, 57, 3, 140}, {188, 123, 126, 168}, {188, 123, 126, 170}, {188, 123, 126, 176}, {188, 123, 126, 177}, {188, 123, 126, 178}}}, + {Region: models.CyberghostRegion("Greece"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{154, 57, 3, 130}, {154, 57, 3, 132}, {154, 57, 3, 133}, {154, 57, 3, 137}, {188, 123, 126, 167}, {188, 123, 126, 170}, {188, 123, 126, 172}, {188, 123, 126, 173}, {188, 123, 126, 174}, {188, 123, 126, 177}}}, + {Region: models.CyberghostRegion("Greenland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 209, 8}, {45, 131, 209, 9}, {45, 131, 209, 12}, {45, 131, 209, 16}, {45, 131, 209, 18}, {45, 131, 209, 20}, {45, 131, 209, 22}, {45, 131, 209, 23}, {45, 131, 209, 26}, {45, 131, 209, 27}}}, + {Region: models.CyberghostRegion("Greenland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 209, 6}, {45, 131, 209, 11}, {45, 131, 209, 19}, {45, 131, 209, 20}, {45, 131, 209, 21}, {45, 131, 209, 23}, {45, 131, 209, 26}, {45, 131, 209, 27}, {45, 131, 209, 28}, {45, 131, 209, 29}}}, + {Region: models.CyberghostRegion("Hong Kong"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{84, 17, 56, 130}, {84, 17, 56, 136}, {84, 17, 56, 148}, {84, 17, 56, 149}, {84, 17, 56, 152}, {84, 17, 56, 172}, {84, 17, 56, 173}, {84, 17, 56, 175}, {84, 17, 56, 176}, {84, 17, 56, 181}}}, + {Region: models.CyberghostRegion("Hong Kong"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{84, 17, 56, 133}, {84, 17, 56, 140}, {84, 17, 56, 146}, {84, 17, 56, 151}, {84, 17, 56, 162}, {84, 17, 56, 166}, {84, 17, 56, 172}, {84, 17, 56, 174}, {84, 17, 56, 176}, {84, 17, 56, 182}}}, + {Region: models.CyberghostRegion("Hungary"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{185, 104, 187, 83}, {185, 104, 187, 85}, {185, 104, 187, 86}, {185, 104, 187, 92}, {185, 189, 114, 116}, {185, 189, 114, 119}, {185, 189, 114, 120}, {185, 189, 114, 121}, {185, 189, 114, 124}, {185, 189, 114, 125}}}, + {Region: models.CyberghostRegion("Hungary"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{185, 104, 187, 83}, {185, 104, 187, 85}, {185, 104, 187, 93}, {185, 189, 114, 115}, {185, 189, 114, 118}, {185, 189, 114, 119}, {185, 189, 114, 120}, {185, 189, 114, 121}, {185, 189, 114, 123}, {185, 189, 114, 125}}}, + {Region: models.CyberghostRegion("Iceland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{213, 167, 139, 19}, {213, 167, 139, 20}, {213, 167, 139, 21}, {213, 167, 139, 22}, {213, 167, 139, 23}, {213, 167, 139, 24}, {213, 167, 139, 25}, {213, 167, 139, 26}, {213, 167, 139, 28}, {213, 167, 139, 30}}}, + {Region: models.CyberghostRegion("Iceland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{213, 167, 139, 19}, {213, 167, 139, 21}, {213, 167, 139, 22}, {213, 167, 139, 24}, {213, 167, 139, 25}, {213, 167, 139, 26}, {213, 167, 139, 27}, {213, 167, 139, 28}, {213, 167, 139, 29}, {213, 167, 139, 30}}}, + {Region: models.CyberghostRegion("India"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{43, 241, 71, 115}, {43, 241, 71, 118}, {43, 241, 71, 120}, {43, 241, 71, 122}, {43, 241, 71, 125}, {43, 241, 71, 147}, {43, 241, 71, 148}, {43, 241, 71, 149}, {43, 241, 71, 154}, {43, 241, 71, 156}}}, + {Region: models.CyberghostRegion("India"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{43, 241, 71, 116}, {43, 241, 71, 117}, {43, 241, 71, 118}, {43, 241, 71, 122}, {43, 241, 71, 125}, {43, 241, 71, 147}, {43, 241, 71, 148}, {43, 241, 71, 153}, {43, 241, 71, 155}, {43, 241, 71, 156}}}, + {Region: models.CyberghostRegion("Indonesia"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{113, 20, 29, 243}, {113, 20, 29, 244}, {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, 252}, {113, 20, 29, 254}}}, + {Region: models.CyberghostRegion("Indonesia"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{113, 20, 29, 243}, {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, 252}, {113, 20, 29, 253}}}, + {Region: models.CyberghostRegion("Iran"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 4, 10}, {45, 131, 4, 16}, {45, 131, 4, 17}, {45, 131, 4, 18}, {45, 131, 4, 20}, {45, 131, 4, 21}, {45, 131, 4, 22}, {45, 131, 4, 24}, {45, 131, 4, 25}, {45, 131, 4, 28}}}, + {Region: models.CyberghostRegion("Iran"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 4, 6}, {45, 131, 4, 8}, {45, 131, 4, 12}, {45, 131, 4, 14}, {45, 131, 4, 15}, {45, 131, 4, 20}, {45, 131, 4, 23}, {45, 131, 4, 24}, {45, 131, 4, 27}, {45, 131, 4, 28}}}, + {Region: models.CyberghostRegion("Ireland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{84, 247, 48, 3}, {84, 247, 48, 4}, {84, 247, 48, 5}, {84, 247, 48, 8}, {84, 247, 48, 9}, {84, 247, 48, 10}, {84, 247, 48, 11}, {84, 247, 48, 12}, {84, 247, 48, 19}, {84, 247, 48, 21}}}, + {Region: models.CyberghostRegion("Ireland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{84, 247, 48, 3}, {84, 247, 48, 13}, {84, 247, 48, 14}, {84, 247, 48, 20}, {84, 247, 48, 21}, {84, 247, 48, 23}, {84, 247, 48, 24}, {84, 247, 48, 25}, {84, 247, 48, 26}, {84, 247, 48, 27}}}, + {Region: models.CyberghostRegion("Isle of Man"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 140, 7}, {45, 132, 140, 8}, {45, 132, 140, 10}, {45, 132, 140, 11}, {45, 132, 140, 15}, {45, 132, 140, 17}, {45, 132, 140, 18}, {45, 132, 140, 19}, {45, 132, 140, 27}, {45, 132, 140, 28}}}, + {Region: models.CyberghostRegion("Isle of Man"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 140, 7}, {45, 132, 140, 9}, {45, 132, 140, 10}, {45, 132, 140, 16}, {45, 132, 140, 19}, {45, 132, 140, 20}, {45, 132, 140, 21}, {45, 132, 140, 25}, {45, 132, 140, 26}, {45, 132, 140, 28}}}, + {Region: models.CyberghostRegion("Israel"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{160, 116, 0, 163}, {160, 116, 0, 164}, {160, 116, 0, 166}, {160, 116, 0, 167}, {160, 116, 0, 169}, {160, 116, 0, 170}, {160, 116, 0, 171}, {160, 116, 0, 172}, {160, 116, 0, 173}, {160, 116, 0, 174}}}, + {Region: models.CyberghostRegion("Israel"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{160, 116, 0, 163}, {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, 172}, {160, 116, 0, 173}, {160, 116, 0, 174}}}, + {Region: models.CyberghostRegion("Italy"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{84, 17, 58, 11}, {84, 17, 58, 19}, {87, 101, 94, 70}, {87, 101, 94, 116}, {185, 217, 71, 133}, {185, 217, 71, 137}, {212, 102, 55, 100}, {212, 102, 55, 123}, {212, 102, 55, 139}, {212, 102, 55, 184}}}, + {Region: models.CyberghostRegion("Italy"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{84, 17, 58, 7}, {84, 17, 58, 100}, {84, 17, 58, 103}, {84, 17, 58, 104}, {87, 101, 94, 116}, {87, 101, 94, 124}, {185, 217, 71, 132}, {185, 217, 71, 134}, {212, 102, 55, 156}, {212, 102, 55, 167}}}, + {Region: models.CyberghostRegion("Japan"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{156, 146, 35, 5}, {156, 146, 35, 8}, {156, 146, 35, 9}, {156, 146, 35, 17}, {156, 146, 35, 20}, {156, 146, 35, 33}, {156, 146, 35, 36}, {156, 146, 35, 42}, {156, 146, 35, 45}, {156, 146, 35, 50}}}, + {Region: models.CyberghostRegion("Japan"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{156, 146, 35, 6}, {156, 146, 35, 8}, {156, 146, 35, 19}, {156, 146, 35, 22}, {156, 146, 35, 27}, {156, 146, 35, 32}, {156, 146, 35, 35}, {156, 146, 35, 37}, {156, 146, 35, 41}, {156, 146, 35, 47}}}, + {Region: models.CyberghostRegion("Kazakhstan"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 133, 88, 7}, {45, 133, 88, 11}, {45, 133, 88, 12}, {45, 133, 88, 13}, {45, 133, 88, 14}, {45, 133, 88, 20}, {45, 133, 88, 23}, {45, 133, 88, 24}, {45, 133, 88, 26}, {45, 133, 88, 28}}}, + {Region: models.CyberghostRegion("Kazakhstan"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 133, 88, 8}, {45, 133, 88, 12}, {45, 133, 88, 13}, {45, 133, 88, 15}, {45, 133, 88, 19}, {45, 133, 88, 20}, {45, 133, 88, 24}, {45, 133, 88, 25}, {45, 133, 88, 26}, {45, 133, 88, 28}}}, + {Region: models.CyberghostRegion("Kenya"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Kenya"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Korea"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{27, 255, 75, 227}, {27, 255, 75, 229}, {27, 255, 75, 233}, {27, 255, 75, 234}, {27, 255, 75, 235}, {27, 255, 75, 236}, {27, 255, 75, 248}, {27, 255, 75, 249}, {27, 255, 75, 251}, {27, 255, 75, 254}}}, + {Region: models.CyberghostRegion("Korea"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{27, 255, 75, 228}, {27, 255, 75, 229}, {27, 255, 75, 230}, {27, 255, 75, 231}, {27, 255, 75, 234}, {27, 255, 75, 235}, {27, 255, 75, 244}, {27, 255, 75, 245}, {27, 255, 75, 246}, {27, 255, 75, 247}}}, + {Region: models.CyberghostRegion("Latvia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{109, 248, 148, 244}, {109, 248, 148, 251}, {109, 248, 148, 252}, {109, 248, 148, 253}, {109, 248, 149, 19}, {109, 248, 149, 20}, {109, 248, 149, 21}, {109, 248, 149, 22}, {109, 248, 149, 24}, {109, 248, 149, 27}}}, + {Region: models.CyberghostRegion("Latvia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{109, 248, 148, 248}, {109, 248, 148, 252}, {109, 248, 148, 253}, {109, 248, 148, 254}, {109, 248, 149, 19}, {109, 248, 149, 20}, {109, 248, 149, 21}, {109, 248, 149, 24}, {109, 248, 149, 28}, {109, 248, 149, 29}}}, + {Region: models.CyberghostRegion("Liechtenstein"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 139, 48, 6}, {45, 139, 48, 7}, {45, 139, 48, 9}, {45, 139, 48, 16}, {45, 139, 48, 17}, {45, 139, 48, 19}, {45, 139, 48, 20}, {45, 139, 48, 22}, {45, 139, 48, 23}, {45, 139, 48, 27}}}, + {Region: models.CyberghostRegion("Liechtenstein"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 139, 48, 9}, {45, 139, 48, 12}, {45, 139, 48, 15}, {45, 139, 48, 16}, {45, 139, 48, 17}, {45, 139, 48, 18}, {45, 139, 48, 24}, {45, 139, 48, 26}, {45, 139, 48, 28}, {45, 139, 48, 29}}}, + {Region: models.CyberghostRegion("Lithuania"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{85, 206, 162, 211}, {85, 206, 162, 213}, {85, 206, 162, 214}, {85, 206, 162, 216}, {85, 206, 162, 219}, {85, 206, 162, 220}, {85, 206, 165, 18}, {85, 206, 165, 20}, {85, 206, 165, 24}, {85, 206, 165, 25}}}, + {Region: models.CyberghostRegion("Lithuania"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{85, 206, 162, 210}, {85, 206, 162, 211}, {85, 206, 162, 214}, {85, 206, 162, 215}, {85, 206, 162, 220}, {85, 206, 162, 221}, {85, 206, 162, 222}, {85, 206, 165, 18}, {85, 206, 165, 25}, {85, 206, 165, 26}}}, + {Region: models.CyberghostRegion("Luxembourg"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{5, 253, 204, 5}, {5, 253, 204, 6}, {5, 253, 204, 9}, {5, 253, 204, 10}, {5, 253, 204, 12}, {5, 253, 204, 14}, {5, 253, 204, 20}, {5, 253, 204, 23}, {5, 253, 204, 29}, {5, 253, 204, 30}}}, + {Region: models.CyberghostRegion("Luxembourg"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{5, 253, 204, 7}, {5, 253, 204, 11}, {5, 253, 204, 20}, {5, 253, 204, 22}, {5, 253, 204, 23}, {5, 253, 204, 26}, {5, 253, 204, 27}, {5, 253, 204, 28}, {5, 253, 204, 29}, {5, 253, 204, 30}}}, + {Region: models.CyberghostRegion("Macao"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 137, 197, 8}, {45, 137, 197, 9}, {45, 137, 197, 12}, {45, 137, 197, 14}, {45, 137, 197, 17}, {45, 137, 197, 33}, {45, 137, 197, 35}, {45, 137, 197, 42}, {45, 137, 197, 45}, {45, 137, 197, 47}}}, + {Region: models.CyberghostRegion("Macao"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 137, 197, 2}, {45, 137, 197, 7}, {45, 137, 197, 18}, {45, 137, 197, 19}, {45, 137, 197, 28}, {45, 137, 197, 30}, {45, 137, 197, 33}, {45, 137, 197, 35}, {45, 137, 197, 44}, {45, 137, 197, 47}}}, + {Region: models.CyberghostRegion("Macedonia"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Macedonia"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Malaysia"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Malaysia"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Malta"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 137, 198, 6}, {45, 137, 198, 8}, {45, 137, 198, 9}, {45, 137, 198, 11}, {45, 137, 198, 16}, {45, 137, 198, 18}, {45, 137, 198, 22}, {45, 137, 198, 23}, {45, 137, 198, 25}, {45, 137, 198, 27}}}, + {Region: models.CyberghostRegion("Malta"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 137, 198, 8}, {45, 137, 198, 10}, {45, 137, 198, 12}, {45, 137, 198, 13}, {45, 137, 198, 16}, {45, 137, 198, 17}, {45, 137, 198, 21}, {45, 137, 198, 23}, {45, 137, 198, 26}, {45, 137, 198, 28}}}, + {Region: models.CyberghostRegion("Mexico"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{45, 133, 180, 99}, {45, 133, 180, 106}, {45, 133, 180, 107}, {45, 133, 180, 108}, {45, 133, 180, 115}, {45, 133, 180, 118}, {45, 133, 180, 119}, {45, 133, 180, 121}, {45, 133, 180, 122}, {45, 133, 180, 123}}}, + {Region: models.CyberghostRegion("Mexico"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{45, 133, 180, 99}, {45, 133, 180, 101}, {45, 133, 180, 104}, {45, 133, 180, 105}, {45, 133, 180, 106}, {45, 133, 180, 115}, {45, 133, 180, 117}, {45, 133, 180, 118}, {45, 133, 180, 120}, {45, 133, 180, 121}}}, + {Region: models.CyberghostRegion("Moldova"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{178, 175, 130, 243}, {178, 175, 130, 245}, {178, 175, 130, 250}, {178, 175, 130, 251}, {178, 175, 130, 253}, {178, 175, 130, 254}, {178, 175, 142, 131}, {178, 175, 142, 132}, {178, 175, 142, 133}, {178, 175, 142, 134}}}, + {Region: models.CyberghostRegion("Moldova"), Group: models.CyberghostGroup("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, 253}, {178, 175, 130, 254}, {178, 175, 142, 132}, {178, 175, 142, 133}}}, + {Region: models.CyberghostRegion("Monaco"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 137, 199, 7}, {45, 137, 199, 9}, {45, 137, 199, 11}, {45, 137, 199, 12}, {45, 137, 199, 14}, {45, 137, 199, 16}, {45, 137, 199, 20}, {45, 137, 199, 24}, {45, 137, 199, 25}, {45, 137, 199, 29}}}, + {Region: models.CyberghostRegion("Monaco"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 137, 199, 6}, {45, 137, 199, 7}, {45, 137, 199, 10}, {45, 137, 199, 16}, {45, 137, 199, 18}, {45, 137, 199, 22}, {45, 137, 199, 23}, {45, 137, 199, 24}, {45, 137, 199, 25}, {45, 137, 199, 27}}}, + {Region: models.CyberghostRegion("Mongolia"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 139, 51, 4}, {45, 139, 51, 13}, {45, 139, 51, 14}, {45, 139, 51, 17}, {45, 139, 51, 18}, {45, 139, 51, 22}, {45, 139, 51, 23}, {45, 139, 51, 32}, {45, 139, 51, 44}, {45, 139, 51, 48}}}, + {Region: models.CyberghostRegion("Mongolia"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 139, 51, 3}, {45, 139, 51, 6}, {45, 139, 51, 11}, {45, 139, 51, 12}, {45, 139, 51, 17}, {45, 139, 51, 20}, {45, 139, 51, 28}, {45, 139, 51, 30}, {45, 139, 51, 37}, {45, 139, 51, 41}}}, + {Region: models.CyberghostRegion("Montenegro"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 208, 6}, {45, 131, 208, 7}, {45, 131, 208, 8}, {45, 131, 208, 9}, {45, 131, 208, 10}, {45, 131, 208, 13}, {45, 131, 208, 14}, {45, 131, 208, 20}, {45, 131, 208, 24}, {45, 131, 208, 28}}}, + {Region: models.CyberghostRegion("Montenegro"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 208, 6}, {45, 131, 208, 8}, {45, 131, 208, 9}, {45, 131, 208, 12}, {45, 131, 208, 16}, {45, 131, 208, 20}, {45, 131, 208, 22}, {45, 131, 208, 24}, {45, 131, 208, 26}, {45, 131, 208, 28}}}, + {Region: models.CyberghostRegion("Morocco"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 211, 6}, {45, 131, 211, 9}, {45, 131, 211, 11}, {45, 131, 211, 13}, {45, 131, 211, 18}, {45, 131, 211, 21}, {45, 131, 211, 22}, {45, 131, 211, 23}, {45, 131, 211, 28}, {45, 131, 211, 29}}}, + {Region: models.CyberghostRegion("Morocco"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 211, 9}, {45, 131, 211, 10}, {45, 131, 211, 13}, {45, 131, 211, 18}, {45, 131, 211, 20}, {45, 131, 211, 21}, {45, 131, 211, 25}, {45, 131, 211, 26}, {45, 131, 211, 28}, {45, 131, 211, 29}}}, + {Region: models.CyberghostRegion("Netherlands"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{84, 17, 47, 3}, {84, 17, 47, 20}, {84, 17, 47, 39}, {84, 17, 47, 42}, {84, 17, 47, 74}, {84, 17, 47, 111}, {139, 28, 217, 199}, {185, 132, 177, 136}, {190, 2, 149, 196}, {195, 181, 172, 69}}}, + {Region: models.CyberghostRegion("Netherlands"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{84, 17, 47, 4}, {84, 17, 47, 8}, {84, 17, 47, 12}, {84, 17, 47, 38}, {84, 17, 47, 68}, {185, 132, 177, 235}, {190, 2, 149, 28}, {190, 2, 149, 30}, {190, 2, 149, 208}, {195, 181, 172, 79}}}, + {Region: models.CyberghostRegion("New Zealand"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{103, 231, 91, 131}, {103, 231, 91, 132}, {103, 231, 91, 133}, {103, 231, 91, 134}, {103, 231, 91, 135}, {103, 231, 91, 136}, {103, 231, 91, 137}, {103, 231, 91, 138}, {103, 231, 91, 139}, {103, 231, 91, 140}}}, + {Region: models.CyberghostRegion("New Zealand"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{103, 231, 91, 131}, {103, 231, 91, 132}, {103, 231, 91, 133}, {103, 231, 91, 134}, {103, 231, 91, 135}, {103, 231, 91, 136}, {103, 231, 91, 137}, {103, 231, 91, 138}, {103, 231, 91, 139}, {103, 231, 91, 140}}}, + {Region: models.CyberghostRegion("Nigeria"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 137, 196, 6}, {45, 137, 196, 10}, {45, 137, 196, 12}, {45, 137, 196, 13}, {45, 137, 196, 15}, {45, 137, 196, 16}, {45, 137, 196, 17}, {45, 137, 196, 20}, {45, 137, 196, 24}, {45, 137, 196, 29}}}, + {Region: models.CyberghostRegion("Nigeria"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 137, 196, 6}, {45, 137, 196, 7}, {45, 137, 196, 8}, {45, 137, 196, 9}, {45, 137, 196, 12}, {45, 137, 196, 13}, {45, 137, 196, 14}, {45, 137, 196, 20}, {45, 137, 196, 28}, {45, 137, 196, 29}}}, + {Region: models.CyberghostRegion("Norway"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 12, 223, 131}, {45, 12, 223, 135}, {45, 12, 223, 136}, {45, 12, 223, 138}, {185, 206, 225, 231}, {185, 206, 225, 233}, {185, 253, 97, 235}, {185, 253, 97, 236}, {185, 253, 97, 247}, {185, 253, 97, 253}}}, + {Region: models.CyberghostRegion("Norway"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 12, 223, 132}, {45, 12, 223, 137}, {45, 12, 223, 138}, {45, 12, 223, 141}, {185, 206, 225, 27}, {185, 206, 225, 30}, {185, 253, 97, 245}, {185, 253, 97, 246}, {185, 253, 97, 248}, {185, 253, 97, 249}}}, + {Region: models.CyberghostRegion("Pakistan"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Pakistan"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Panama"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 210, 9}, {45, 131, 210, 10}, {45, 131, 210, 14}, {45, 131, 210, 15}, {45, 131, 210, 16}, {45, 131, 210, 21}, {45, 131, 210, 22}, {45, 131, 210, 23}, {45, 131, 210, 24}, {45, 131, 210, 26}}}, + {Region: models.CyberghostRegion("Panama"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 210, 6}, {45, 131, 210, 8}, {45, 131, 210, 9}, {45, 131, 210, 12}, {45, 131, 210, 14}, {45, 131, 210, 18}, {45, 131, 210, 19}, {45, 131, 210, 25}, {45, 131, 210, 28}, {45, 131, 210, 29}}}, + {Region: models.CyberghostRegion("Philippines"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{188, 214, 125, 39}, {188, 214, 125, 45}, {188, 214, 125, 47}, {188, 214, 125, 49}, {188, 214, 125, 50}, {188, 214, 125, 51}, {188, 214, 125, 53}, {188, 214, 125, 57}, {188, 214, 125, 58}, {188, 214, 125, 61}}}, + {Region: models.CyberghostRegion("Philippines"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{188, 214, 125, 35}, {188, 214, 125, 36}, {188, 214, 125, 37}, {188, 214, 125, 48}, {188, 214, 125, 55}, {188, 214, 125, 56}, {188, 214, 125, 57}, {188, 214, 125, 58}, {188, 214, 125, 59}, {188, 214, 125, 62}}}, + {Region: models.CyberghostRegion("Poland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 156, 11}, {37, 120, 156, 17}, {37, 120, 156, 23}, {37, 120, 156, 25}, {37, 120, 156, 26}, {51, 75, 56, 35}, {51, 75, 56, 37}, {51, 75, 56, 41}, {54, 37, 238, 36}, {54, 37, 238, 43}}}, + {Region: models.CyberghostRegion("Poland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 156, 8}, {37, 120, 156, 10}, {37, 120, 156, 12}, {37, 120, 156, 18}, {37, 120, 156, 19}, {37, 120, 156, 24}, {51, 75, 56, 33}, {51, 75, 56, 40}, {51, 75, 56, 41}, {54, 37, 238, 33}}}, + {Region: models.CyberghostRegion("Portugal"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{89, 26, 243, 47}, {89, 26, 243, 48}, {89, 26, 243, 50}, {89, 26, 243, 51}, {89, 26, 243, 54}, {89, 26, 243, 58}, {89, 26, 243, 60}, {185, 90, 57, 172}, {185, 90, 57, 176}, {185, 90, 57, 179}}}, + {Region: models.CyberghostRegion("Portugal"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{89, 26, 243, 47}, {89, 26, 243, 50}, {89, 26, 243, 51}, {89, 26, 243, 53}, {89, 26, 243, 58}, {185, 90, 57, 173}, {185, 90, 57, 175}, {185, 90, 57, 176}, {185, 90, 57, 178}, {185, 90, 57, 179}}}, + {Region: models.CyberghostRegion("Qatar"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 7, 6}, {45, 131, 7, 9}, {45, 131, 7, 10}, {45, 131, 7, 13}, {45, 131, 7, 16}, {45, 131, 7, 17}, {45, 131, 7, 20}, {45, 131, 7, 22}, {45, 131, 7, 23}, {45, 131, 7, 28}}}, + {Region: models.CyberghostRegion("Qatar"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 7, 8}, {45, 131, 7, 9}, {45, 131, 7, 14}, {45, 131, 7, 15}, {45, 131, 7, 16}, {45, 131, 7, 17}, {45, 131, 7, 23}, {45, 131, 7, 27}, {45, 131, 7, 28}, {45, 131, 7, 29}}}, + {Region: models.CyberghostRegion("Romania"), Group: models.CyberghostGroup("NoSpy TCP Europe"), IPs: []net.IP{{85, 9, 20, 134}, {85, 9, 20, 135}, {85, 9, 20, 137}, {85, 9, 20, 138}, {85, 9, 20, 139}, {85, 9, 20, 147}, {85, 9, 20, 149}, {85, 9, 20, 154}, {85, 9, 20, 248}, {85, 9, 20, 249}}}, + {Region: models.CyberghostRegion("Romania"), Group: models.CyberghostGroup("NoSpy UDP Europe"), IPs: []net.IP{{85, 9, 20, 134}, {85, 9, 20, 138}, {85, 9, 20, 139}, {85, 9, 20, 144}, {85, 9, 20, 145}, {85, 9, 20, 147}, {85, 9, 20, 148}, {85, 9, 20, 151}, {85, 9, 20, 248}, {85, 9, 20, 249}}}, + {Region: models.CyberghostRegion("Romania"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{193, 176, 84, 44}, {193, 176, 84, 49}, {193, 176, 84, 51}, {193, 176, 84, 52}, {193, 176, 84, 88}, {193, 176, 84, 121}, {193, 176, 84, 126}, {193, 176, 85, 72}, {193, 176, 85, 74}, {193, 176, 85, 101}}}, + {Region: models.CyberghostRegion("Romania"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{193, 176, 84, 46}, {193, 176, 84, 47}, {193, 176, 84, 48}, {193, 176, 84, 49}, {193, 176, 84, 90}, {193, 176, 84, 125}, {193, 176, 85, 68}, {193, 176, 85, 72}, {193, 176, 85, 78}, {193, 176, 85, 91}}}, + {Region: models.CyberghostRegion("Russian Federation"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 192, 42}, {45, 132, 192, 43}, {45, 132, 192, 49}, {45, 132, 192, 60}, {45, 132, 192, 63}, {45, 132, 192, 66}, {45, 132, 192, 78}, {45, 132, 192, 80}, {45, 132, 192, 85}, {45, 132, 192, 96}}}, + {Region: models.CyberghostRegion("Russian Federation"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 192, 11}, {45, 132, 192, 15}, {45, 132, 192, 24}, {45, 132, 192, 32}, {45, 132, 192, 43}, {45, 132, 192, 49}, {45, 132, 192, 55}, {45, 132, 192, 63}, {45, 132, 192, 65}, {45, 132, 192, 95}}}, + {Region: models.CyberghostRegion("Saudi Arabia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 6, 7}, {45, 131, 6, 10}, {45, 131, 6, 12}, {45, 131, 6, 13}, {45, 131, 6, 21}, {45, 131, 6, 23}, {45, 131, 6, 24}, {45, 131, 6, 25}, {45, 131, 6, 26}, {45, 131, 6, 28}}}, + {Region: models.CyberghostRegion("Saudi Arabia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 6, 7}, {45, 131, 6, 9}, {45, 131, 6, 14}, {45, 131, 6, 15}, {45, 131, 6, 18}, {45, 131, 6, 19}, {45, 131, 6, 22}, {45, 131, 6, 24}, {45, 131, 6, 28}, {45, 131, 6, 29}}}, + {Region: models.CyberghostRegion("Serbia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 193, 179}, {37, 120, 193, 181}, {37, 120, 193, 182}, {37, 120, 193, 183}, {37, 120, 193, 184}, {37, 120, 193, 186}, {37, 120, 193, 190}, {141, 98, 103, 37}, {141, 98, 103, 43}, {141, 98, 103, 46}}}, + {Region: models.CyberghostRegion("Serbia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 193, 179}, {37, 120, 193, 182}, {37, 120, 193, 183}, {37, 120, 193, 188}, {37, 120, 193, 189}, {37, 120, 193, 190}, {141, 98, 103, 35}, {141, 98, 103, 40}, {141, 98, 103, 42}, {141, 98, 103, 46}}}, + {Region: models.CyberghostRegion("Singapore"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{37, 120, 151, 55}, {37, 120, 151, 60}, {37, 120, 151, 131}, {37, 120, 151, 139}, {84, 17, 39, 168}, {84, 17, 39, 175}, {84, 17, 39, 176}, {84, 17, 39, 179}, {84, 17, 39, 182}, {84, 17, 39, 185}}}, + {Region: models.CyberghostRegion("Singapore"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{37, 120, 151, 51}, {37, 120, 151, 57}, {37, 120, 151, 131}, {37, 120, 151, 132}, {37, 120, 151, 140}, {37, 120, 151, 141}, {84, 17, 39, 165}, {84, 17, 39, 169}, {84, 17, 39, 171}, {84, 17, 39, 180}}}, + {Region: models.CyberghostRegion("Slovakia"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Slovakia"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Slovenia"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{146, 247, 25, 79}, {146, 247, 25, 80}, {146, 247, 25, 81}, {146, 247, 25, 83}, {146, 247, 25, 84}, {146, 247, 25, 85}, {146, 247, 25, 86}, {146, 247, 25, 87}, {146, 247, 25, 88}, {146, 247, 25, 90}}}, + {Region: models.CyberghostRegion("Slovenia"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{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, 87}, {146, 247, 25, 88}, {146, 247, 25, 89}}}, + {Region: models.CyberghostRegion("South Africa"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{165, 73, 248, 211}, {165, 73, 248, 214}, {165, 73, 248, 222}, {165, 73, 248, 227}, {165, 73, 248, 229}, {165, 73, 248, 230}, {165, 73, 248, 231}, {165, 73, 248, 234}, {165, 73, 248, 236}, {165, 73, 248, 237}}}, + {Region: models.CyberghostRegion("South Africa"), Group: models.CyberghostGroup("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: models.CyberghostRegion("South Africa"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{165, 73, 248, 212}, {165, 73, 248, 215}, {165, 73, 248, 217}, {165, 73, 248, 218}, {165, 73, 248, 219}, {165, 73, 248, 222}, {165, 73, 248, 227}, {165, 73, 248, 230}, {165, 73, 248, 234}, {165, 73, 248, 237}}}, + {Region: models.CyberghostRegion("South Africa"), Group: models.CyberghostGroup("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: models.CyberghostRegion("Spain"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 142, 163}, {37, 120, 142, 166}, {37, 120, 142, 167}, {84, 17, 62, 138}, {84, 17, 62, 141}, {84, 17, 62, 145}, {84, 17, 62, 147}, {84, 17, 62, 152}, {185, 93, 3, 113}, {185, 93, 182, 139}}}, + {Region: models.CyberghostRegion("Spain"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 142, 150}, {37, 120, 142, 157}, {37, 120, 142, 165}, {84, 17, 62, 139}, {84, 17, 62, 142}, {185, 93, 3, 109}, {185, 93, 3, 111}, {185, 93, 3, 113}, {185, 93, 182, 136}, {185, 93, 182, 138}}}, + {Region: models.CyberghostRegion("Sri Lanka"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 132, 136, 6}, {45, 132, 136, 7}, {45, 132, 136, 8}, {45, 132, 136, 12}, {45, 132, 136, 13}, {45, 132, 136, 17}, {45, 132, 136, 21}, {45, 132, 136, 22}, {45, 132, 136, 26}, {45, 132, 136, 27}}}, + {Region: models.CyberghostRegion("Sri Lanka"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 132, 136, 7}, {45, 132, 136, 9}, {45, 132, 136, 10}, {45, 132, 136, 11}, {45, 132, 136, 12}, {45, 132, 136, 15}, {45, 132, 136, 20}, {45, 132, 136, 21}, {45, 132, 136, 27}, {45, 132, 136, 29}}}, + {Region: models.CyberghostRegion("Sweden"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{46, 246, 65, 151}, {46, 246, 65, 156}, {46, 246, 65, 157}, {46, 246, 65, 167}, {46, 246, 65, 203}, {46, 246, 65, 221}, {91, 132, 138, 51}, {188, 126, 64, 101}, {188, 126, 66, 3}, {188, 126, 66, 8}}}, + {Region: models.CyberghostRegion("Sweden"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{46, 246, 65, 167}, {46, 246, 65, 170}, {46, 246, 65, 172}, {46, 246, 65, 181}, {46, 246, 65, 214}, {46, 246, 65, 215}, {91, 132, 138, 57}, {188, 126, 66, 8}, {188, 126, 66, 24}, {188, 126, 66, 29}}}, + {Region: models.CyberghostRegion("Switzerland"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{84, 17, 52, 14}, {84, 17, 52, 39}, {84, 17, 52, 68}, {84, 17, 52, 73}, {84, 17, 52, 84}, {89, 187, 165, 131}, {185, 32, 222, 8}, {185, 32, 222, 105}, {195, 225, 118, 38}, {195, 225, 118, 56}}}, + {Region: models.CyberghostRegion("Switzerland"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{84, 17, 52, 15}, {84, 17, 52, 20}, {84, 17, 52, 36}, {84, 17, 52, 52}, {84, 17, 52, 62}, {84, 17, 52, 75}, {91, 132, 136, 174}, {91, 132, 136, 205}, {91, 132, 136, 206}, {185, 32, 222, 113}}}, + {Region: models.CyberghostRegion("Taiwan"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 133, 181, 102}, {45, 133, 181, 105}, {45, 133, 181, 106}, {45, 133, 181, 108}, {45, 133, 181, 110}, {45, 133, 181, 112}, {45, 133, 181, 114}, {45, 133, 181, 117}, {45, 133, 181, 120}, {45, 133, 181, 124}}}, + {Region: models.CyberghostRegion("Taiwan"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 133, 181, 102}, {45, 133, 181, 103}, {45, 133, 181, 110}, {45, 133, 181, 111}, {45, 133, 181, 112}, {45, 133, 181, 114}, {45, 133, 181, 118}, {45, 133, 181, 120}, {45, 133, 181, 125}, {45, 133, 181, 126}}}, + {Region: models.CyberghostRegion("Thailand"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{119, 59, 98, 238}, {119, 59, 98, 239}, {119, 59, 98, 243}, {119, 59, 98, 244}, {119, 59, 98, 248}, {119, 59, 98, 249}, {119, 59, 121, 165}, {119, 59, 121, 166}, {119, 59, 121, 171}, {119, 59, 121, 173}}}, + {Region: models.CyberghostRegion("Thailand"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{119, 59, 98, 214}, {119, 59, 98, 238}, {119, 59, 98, 244}, {119, 59, 98, 247}, {119, 59, 121, 163}, {119, 59, 121, 165}, {119, 59, 121, 166}, {119, 59, 121, 167}, {119, 59, 121, 173}, {119, 59, 121, 175}}}, + {Region: models.CyberghostRegion("Turkey"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{188, 213, 34, 9}, {188, 213, 34, 22}, {188, 213, 34, 24}, {188, 213, 34, 27}, {188, 213, 34, 28}, {188, 213, 34, 35}, {188, 213, 34, 41}, {188, 213, 34, 44}, {188, 213, 34, 45}, {188, 213, 34, 46}}}, + {Region: models.CyberghostRegion("Turkey"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{188, 213, 34, 3}, {188, 213, 34, 13}, {188, 213, 34, 18}, {188, 213, 34, 25}, {188, 213, 34, 27}, {188, 213, 34, 30}, {188, 213, 34, 35}, {188, 213, 34, 37}, {188, 213, 34, 38}, {188, 213, 34, 44}}}, + {Region: models.CyberghostRegion("Ukraine"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{31, 28, 161, 21}, {31, 28, 163, 34}, {31, 28, 163, 35}, {31, 28, 163, 38}, {31, 28, 163, 50}, {62, 149, 7, 164}, {62, 149, 7, 167}, {62, 149, 29, 50}, {62, 149, 29, 53}, {62, 149, 29, 56}}}, + {Region: models.CyberghostRegion("Ukraine"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{31, 28, 161, 20}, {31, 28, 161, 28}, {31, 28, 161, 30}, {31, 28, 163, 37}, {31, 28, 163, 45}, {31, 28, 163, 53}, {31, 28, 163, 56}, {31, 28, 163, 59}, {62, 149, 7, 168}, {62, 149, 29, 56}}}, + {Region: models.CyberghostRegion("United Arab Emirates"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 131, 5, 6}, {45, 131, 5, 9}, {45, 131, 5, 12}, {45, 131, 5, 14}, {45, 131, 5, 16}, {45, 131, 5, 17}, {45, 131, 5, 18}, {45, 131, 5, 27}, {45, 131, 5, 28}, {45, 131, 5, 29}}}, + {Region: models.CyberghostRegion("United Arab Emirates"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 131, 5, 8}, {45, 131, 5, 14}, {45, 131, 5, 15}, {45, 131, 5, 20}, {45, 131, 5, 22}, {45, 131, 5, 23}, {45, 131, 5, 24}, {45, 131, 5, 26}, {45, 131, 5, 28}, {45, 131, 5, 29}}}, + {Region: models.CyberghostRegion("United Kingdom"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{37, 120, 133, 134}, {37, 120, 133, 140}, {84, 17, 51, 32}, {84, 17, 51, 75}, {89, 238, 138, 243}, {89, 238, 183, 230}, {95, 154, 200, 144}, {95, 154, 200, 186}, {141, 98, 100, 56}, {141, 98, 100, 61}}}, + {Region: models.CyberghostRegion("United Kingdom"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{37, 120, 133, 134}, {37, 120, 159, 35}, {81, 92, 206, 172}, {84, 17, 51, 34}, {84, 17, 51, 110}, {84, 17, 51, 115}, {89, 238, 135, 59}, {95, 154, 200, 147}, {95, 154, 200, 149}, {141, 98, 100, 58}}}, + {Region: models.CyberghostRegion("United States"), Group: models.CyberghostGroup("Premium TCP USA"), IPs: []net.IP{{23, 105, 160, 184}, {38, 131, 126, 150}, {84, 17, 35, 32}, {89, 187, 182, 7}, {89, 187, 182, 31}, {176, 113, 72, 153}, {176, 113, 72, 167}, {192, 96, 203, 150}, {199, 115, 119, 238}, {212, 102, 41, 4}}}, + {Region: models.CyberghostRegion("United States"), Group: models.CyberghostGroup("Premium UDP USA"), IPs: []net.IP{{23, 19, 68, 56}, {23, 82, 78, 29}, {23, 105, 191, 36}, {23, 105, 191, 51}, {84, 17, 35, 8}, {89, 187, 171, 138}, {108, 62, 96, 33}, {176, 113, 72, 151}, {192, 96, 203, 154}, {199, 115, 117, 70}}}, + {Region: models.CyberghostRegion("Venezuela"), Group: models.CyberghostGroup("Premium TCP Europe"), IPs: []net.IP{{45, 133, 89, 6}, {45, 133, 89, 9}, {45, 133, 89, 11}, {45, 133, 89, 15}, {45, 133, 89, 17}, {45, 133, 89, 18}, {45, 133, 89, 22}, {45, 133, 89, 24}, {45, 133, 89, 26}, {45, 133, 89, 29}}}, + {Region: models.CyberghostRegion("Venezuela"), Group: models.CyberghostGroup("Premium UDP Europe"), IPs: []net.IP{{45, 133, 89, 8}, {45, 133, 89, 9}, {45, 133, 89, 15}, {45, 133, 89, 17}, {45, 133, 89, 21}, {45, 133, 89, 22}, {45, 133, 89, 25}, {45, 133, 89, 26}, {45, 133, 89, 27}, {45, 133, 89, 29}}}, + {Region: models.CyberghostRegion("Vietnam"), Group: models.CyberghostGroup("Premium TCP Asia"), IPs: []net.IP{{45, 117, 79, 118}, {45, 117, 79, 123}, {45, 117, 79, 124}, {45, 117, 79, 125}, {103, 238, 214, 131}, {103, 238, 214, 134}, {103, 238, 214, 135}, {103, 238, 214, 136}, {103, 238, 214, 137}, {103, 238, 214, 140}}}, + {Region: models.CyberghostRegion("Vietnam"), Group: models.CyberghostGroup("Premium UDP Asia"), IPs: []net.IP{{45, 117, 79, 114}, {45, 117, 79, 116}, {45, 117, 79, 117}, {45, 117, 79, 118}, {45, 117, 79, 123}, {103, 238, 214, 134}, {103, 238, 214, 135}, {103, 238, 214, 136}, {103, 238, 214, 137}, {103, 238, 214, 140}}}, + } +} diff --git a/internal/constants/vpn.go b/internal/constants/vpn.go index aa661e2d..3fe5582d 100644 --- a/internal/constants/vpn.go +++ b/internal/constants/vpn.go @@ -13,6 +13,8 @@ const ( Windscribe models.VPNProvider = "windscribe" // Surfshark is a VPN provider Surfshark models.VPNProvider = "surfshark" + // Cyberghost is a VPN provider + Cyberghost models.VPNProvider = "cyberghost" ) const ( diff --git a/internal/cyberghost/conf.go b/internal/cyberghost/conf.go new file mode 100644 index 00000000..8c45d738 --- /dev/null +++ b/internal/cyberghost/conf.go @@ -0,0 +1,114 @@ +package cyberghost + +import ( + "fmt" + "net" + "strings" + + "github.com/qdm12/golibs/files" + "github.com/qdm12/private-internet-access-docker/internal/constants" + "github.com/qdm12/private-internet-access-docker/internal/models" +) + +func (c *configurator) GetOpenVPNConnections(group models.CyberghostGroup, region models.CyberghostRegion, protocol models.NetworkProtocol, targetIP net.IP) (connections []models.OpenVPNConnection, err error) { + var IPs []net.IP + for _, server := range constants.CyberghostServers() { + if strings.EqualFold(string(server.Region), string(region)) && strings.EqualFold(string(server.Group), string(group)) { + IPs = server.IPs + } + } + if len(IPs) == 0 { + return nil, fmt.Errorf("no IP found for group %q and region %q", group, region) + } + if targetIP != nil { + found := false + for i := range IPs { + if IPs[i].Equal(targetIP) { + found = true + break + } + } + if !found { + return nil, fmt.Errorf("target IP address %q not found in IP addresses", targetIP) + } + IPs = []net.IP{targetIP} + } + for _, IP := range IPs { + connections = append(connections, models.OpenVPNConnection{IP: IP, Port: 1443, Protocol: protocol}) + } + return connections, nil +} + +func (c *configurator) BuildConf(connections []models.OpenVPNConnection, clientKey string, verbosity, uid, gid int, root bool, cipher, auth string) (err error) { + if len(cipher) == 0 { + cipher = "AES-256-CBC" + } + if len(auth) == 0 { + auth = "SHA256" + } + lines := []string{ + "client", + "dev tun", + "nobind", + "persist-key", + "persist-tun", + "remote-cert-tls server", + + // Cyberghost specific + "resolv-retry infinite", + "redirect-gateway def1", + "ncp-disable", + "ping 5", + "ping-exit 60", + "ping-timer-rem", + "script-security 2", + "route-delay 5", + + // Added constant values + "auth-nocache", + "mute-replay-warnings", + "pull-filter ignore \"auth-token\"", // prevent auth failed loops + "auth-retry nointeract", + "remote-random", + "suppress-timestamps", + + // Modified variables + fmt.Sprintf("verb %d", verbosity), + fmt.Sprintf("auth-user-pass %s", constants.OpenVPNAuthConf), + fmt.Sprintf("proto %s", string(connections[0].Protocol)), + fmt.Sprintf("cipher %s", cipher), + fmt.Sprintf("auth %s", auth), + } + if strings.HasSuffix(cipher, "-gcm") { + lines = append(lines, "ncp-ciphers AES-256-GCM:AES-256-CBC:AES-128-GCM") + } + if !root { + lines = append(lines, "user nonrootuser") + } + for _, connection := range connections { + lines = append(lines, fmt.Sprintf("remote %s %d", connection.IP.String(), connection.Port)) + } + lines = append(lines, []string{ + "", + "-----BEGIN CERTIFICATE-----", + constants.CyberghostCertificate, + "-----END CERTIFICATE-----", + "", + }...) + lines = append(lines, []string{ + "", + "-----BEGIN CERTIFICATE-----", + constants.CyberghostClientCertificate, + "-----END CERTIFICATE-----", + "", + }...) + lines = append(lines, []string{ + "", + "-----BEGIN PRIVATE KEY-----", + clientKey, + "-----END PRIVATE KEY-----", + "", + "", + }...) + return c.fileManager.WriteLinesToFile(string(constants.OpenVPNConf), lines, files.Ownership(uid, gid), files.Permissions(0400)) +} diff --git a/internal/cyberghost/cyberghost.go b/internal/cyberghost/cyberghost.go new file mode 100644 index 00000000..f638e4e1 --- /dev/null +++ b/internal/cyberghost/cyberghost.go @@ -0,0 +1,23 @@ +package cyberghost + +import ( + "net" + + "github.com/qdm12/golibs/files" + "github.com/qdm12/private-internet-access-docker/internal/models" +) + +// Configurator contains methods to read and modify the openvpn configuration to connect as a client +type Configurator interface { + GetOpenVPNConnections(group models.CyberghostGroup, region models.CyberghostRegion, protocol models.NetworkProtocol, targetIP net.IP) (connections []models.OpenVPNConnection, err error) + BuildConf(connections []models.OpenVPNConnection, clientKey string, verbosity, uid, gid int, root bool, cipher, auth string) (err error) +} + +type configurator struct { + fileManager files.FileManager +} + +// NewConfigurator returns a new Configurator object +func NewConfigurator(fileManager files.FileManager) Configurator { + return &configurator{fileManager: fileManager} +} diff --git a/internal/models/alias.go b/internal/models/alias.go index fd833500..1e233492 100644 --- a/internal/models/alias.go +++ b/internal/models/alias.go @@ -21,6 +21,10 @@ type ( WindscribeRegion string // SurfsharkRegion is used as the region for a Surfshark server SurfsharkRegion string + // CyberghostRegion is the country name for a Cyberghost server + CyberghostRegion string + // CyberghostGroup is the server group for a Cyberghost server + CyberghostGroup string // URL is an HTTP(s) URL address URL string // Filepath is a local filesytem file path diff --git a/internal/models/cyberghost.go b/internal/models/cyberghost.go new file mode 100644 index 00000000..caa698cb --- /dev/null +++ b/internal/models/cyberghost.go @@ -0,0 +1,9 @@ +package models + +import "net" + +type CyberghostServer struct { + Region CyberghostRegion + Group CyberghostGroup + IPs []net.IP +} diff --git a/internal/params/cyberghost.go b/internal/params/cyberghost.go new file mode 100644 index 00000000..961895ef --- /dev/null +++ b/internal/params/cyberghost.go @@ -0,0 +1,29 @@ +package params + +import ( + "strings" + + libparams "github.com/qdm12/golibs/params" + "github.com/qdm12/private-internet-access-docker/internal/constants" + "github.com/qdm12/private-internet-access-docker/internal/models" +) + +// GetCyberghostGroup obtains the server group for the Cyberghost server from the +// environment variable CYBERGHOST_GROUP +func (p *reader) GetCyberghostGroup() (region models.CyberghostGroup, err error) { + s, err := p.envParams.GetValueIfInside("CYBERGHOST_GROUP", constants.CyberghostGroupChoices()) + return models.CyberghostGroup(strings.ToLower(s)), err +} + +// GetCyberghostRegion obtains the country name for the Cyberghost server from the +// environment variable REGION +func (p *reader) GetCyberghostRegion() (region models.CyberghostRegion, err error) { + s, err := p.envParams.GetValueIfInside("REGION", constants.CyberghostRegionChoices()) + return models.CyberghostRegion(strings.ToLower(s)), err +} + +// GetCyberghostClientKey obtains the one line client key to use for openvpn from the +// environment variable CLIENT_KEY +func (p *reader) GetCyberghostClientKey() (clientKey string, err error) { + return p.envParams.GetEnv("CLIENT_KEY", libparams.Compulsory(), libparams.CaseSensitiveValue()) +} diff --git a/internal/params/params.go b/internal/params/params.go index a4b10514..dee148db 100644 --- a/internal/params/params.go +++ b/internal/params/params.go @@ -69,6 +69,11 @@ type Reader interface { // Surfshark getters GetSurfsharkRegion() (country models.SurfsharkRegion, err error) + // Cyberghost getters + GetCyberghostGroup() (region models.CyberghostGroup, err error) + GetCyberghostRegion() (region models.CyberghostRegion, err error) + GetCyberghostClientKey() (clientKey string, err error) + // Shadowsocks getters GetShadowSocks() (activated bool, err error) GetShadowSocksLog() (activated bool, err error) @@ -109,7 +114,7 @@ func NewReader(logger logging.Logger) Reader { // GetVPNSP obtains the VPN service provider to use from the environment variable VPNSP func (r *reader) GetVPNSP() (vpnServiceProvider models.VPNProvider, err error) { - s, err := r.envParams.GetValueIfInside("VPNSP", []string{"pia", "private internet access", "mullvad", "windscribe", "surfshark"}) + s, err := r.envParams.GetValueIfInside("VPNSP", []string{"pia", "private internet access", "mullvad", "windscribe", "surfshark", "cyberghost"}) if s == "pia" { s = "private internet access" } diff --git a/internal/settings/cyberghost.go b/internal/settings/cyberghost.go new file mode 100644 index 00000000..87ca9053 --- /dev/null +++ b/internal/settings/cyberghost.go @@ -0,0 +1,54 @@ +package settings + +import ( + "strings" + + "github.com/qdm12/private-internet-access-docker/internal/models" + "github.com/qdm12/private-internet-access-docker/internal/params" +) + +// Windscribe contains the settings to connect to a Windscribe server +type Cyberghost struct { + User string + Password string + ClientKey string + Group models.CyberghostGroup + Region models.CyberghostRegion +} + +func (c *Cyberghost) String() string { + settingsList := []string{ + "Cyberghost settings:", + "User: [redacted]", + "Password: [redacted]", + "ClientKey: [redacted]", + "Group: " + string(c.Group), + "Region: " + string(c.Region), + } + return strings.Join(settingsList, "\n |--") +} + +// GetCyberghostSettings obtains Cyberghost settings from environment variables using the params package. +func GetCyberghostSettings(paramsReader params.Reader) (settings Cyberghost, err error) { + settings.User, err = paramsReader.GetUser() + if err != nil { + return settings, err + } + settings.Password, err = paramsReader.GetPassword() + if err != nil { + return settings, err + } + settings.ClientKey, err = paramsReader.GetCyberghostClientKey() + if err != nil { + return settings, err + } + settings.Group, err = paramsReader.GetCyberghostGroup() + if err != nil { + return settings, err + } + settings.Region, err = paramsReader.GetCyberghostRegion() + if err != nil { + return settings, err + } + return settings, nil +} diff --git a/internal/settings/settings.go b/internal/settings/settings.go index a2b4e6c6..a2271a75 100644 --- a/internal/settings/settings.go +++ b/internal/settings/settings.go @@ -17,6 +17,7 @@ type Settings struct { Mullvad Mullvad Windscribe Windscribe Surfshark Surfshark + Cyberghost Cyberghost System System DNS DNS Firewall Firewall @@ -35,6 +36,8 @@ func (s *Settings) String() string { vpnServiceProviderSettings = s.Windscribe.String() case constants.Surfshark: vpnServiceProviderSettings = s.Surfshark.String() + case constants.Cyberghost: + vpnServiceProviderSettings = s.Cyberghost.String() } return strings.Join([]string{ "Settings summary below:", @@ -69,6 +72,8 @@ func GetAllSettings(paramsReader params.Reader) (settings Settings, err error) { settings.Windscribe, err = GetWindscribeSettings(paramsReader, settings.OpenVPN.NetworkProtocol) case constants.Surfshark: settings.Surfshark, err = GetSurfsharkSettings(paramsReader) + case constants.Cyberghost: + settings.Cyberghost, err = GetCyberghostSettings(paramsReader) default: err = fmt.Errorf("VPN service provider %q is not valid", settings.VPNSP) }