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)
- 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)
}