diff --git a/README.md b/README.md index 0a84ba2e..22155932 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ Lightweight swiss-knife-like VPN client to multiple VPN service providers - Supports: **AirVPN**, **Cyberghost**, **ExpressVPN**, **FastestVPN**, **HideMyAss**, **IPVanish**, **IVPN**, **Mullvad**, **NordVPN**, **Perfect Privacy**, **Privado**, **Private Internet Access**, **PrivateVPN**, **ProtonVPN**, **PureVPN**, **SlickVPN**, **Surfshark**, **TorGuard**, **VPNSecure.me**, **VPNUnlimited**, **Vyprvpn**, **WeVPN**, **Windscribe** servers - Supports OpenVPN for all providers listed - Supports Wireguard both kernelspace and userspace - - For **AirVPN**, **Ivpn**, **Mullvad**, **NordVPN**, **Perfect privacy**, **Surfshark** and **Windscribe** + - For **AirVPN**, **FastestVPN**, **Ivpn**, **Mullvad**, **NordVPN**, **Perfect privacy**, **Surfshark** and **Windscribe** - For **ProtonVPN**, **PureVPN**, **Torguard**, **VPN Unlimited** and **WeVPN** using [the custom provider](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/custom.md) - For custom Wireguard configurations using [the custom provider](https://github.com/qdm12/gluetun-wiki/blob/main/setup/providers/custom.md) - More in progress, see [#134](https://github.com/qdm12/gluetun/issues/134) diff --git a/internal/configuration/settings/provider.go b/internal/configuration/settings/provider.go index 41f5430d..b2fb9a7a 100644 --- a/internal/configuration/settings/provider.go +++ b/internal/configuration/settings/provider.go @@ -35,6 +35,7 @@ func (p *Provider) validate(vpnType string, storage Storage) (err error) { validNames = []string{ providers.Airvpn, providers.Custom, + providers.Fastestvpn, providers.Ivpn, providers.Mullvad, providers.Nordvpn, diff --git a/internal/configuration/settings/wireguard.go b/internal/configuration/settings/wireguard.go index d27fc042..240db9be 100644 --- a/internal/configuration/settings/wireguard.go +++ b/internal/configuration/settings/wireguard.go @@ -58,6 +58,7 @@ func (w Wireguard) validate(vpnProvider string, ipv6Supported bool) (err error) if !helpers.IsOneOf(vpnProvider, providers.Airvpn, providers.Custom, + providers.Fastestvpn, providers.Ivpn, providers.Mullvad, providers.Nordvpn, diff --git a/internal/configuration/settings/wireguardselection.go b/internal/configuration/settings/wireguardselection.go index b2c42239..db17ced7 100644 --- a/internal/configuration/settings/wireguardselection.go +++ b/internal/configuration/settings/wireguardselection.go @@ -38,8 +38,9 @@ type WireguardSelection struct { func (w WireguardSelection) validate(vpnProvider string) (err error) { // Validate EndpointIP switch vpnProvider { - case providers.Airvpn, providers.Ivpn, providers.Mullvad, - providers.Nordvpn, providers.Surfshark, providers.Windscribe: + case providers.Airvpn, providers.Fastestvpn, providers.Ivpn, + providers.Mullvad, providers.Nordvpn, providers.Surfshark, + providers.Windscribe: // endpoint IP addresses are baked in case providers.Custom: if !w.EndpointIP.IsValid() || w.EndpointIP.IsUnspecified() { @@ -56,7 +57,7 @@ func (w WireguardSelection) validate(vpnProvider string) (err error) { return fmt.Errorf("%w", ErrWireguardEndpointPortNotSet) } // EndpointPort cannot be set - case providers.Surfshark, providers.Nordvpn: + case providers.Fastestvpn, providers.Surfshark, providers.Nordvpn: if *w.EndpointPort != 0 { return fmt.Errorf("%w", ErrWireguardEndpointPortSet) } @@ -89,7 +90,7 @@ func (w WireguardSelection) validate(vpnProvider string) (err error) { // Validate PublicKey switch vpnProvider { - case providers.Ivpn, providers.Mullvad, + case providers.Fastestvpn, providers.Ivpn, providers.Mullvad, providers.Surfshark, providers.Windscribe: // public keys are baked in case providers.Custom: diff --git a/internal/models/markdown.go b/internal/models/markdown.go index b2c49137..5cce6131 100644 --- a/internal/models/markdown.go +++ b/internal/models/markdown.go @@ -113,7 +113,7 @@ func getMarkdownHeaders(vpnProvider string) (headers []string) { case providers.Expressvpn: return []string{countryHeader, cityHeader, hostnameHeader, tcpHeader, udpHeader} case providers.Fastestvpn: - return []string{countryHeader, hostnameHeader, tcpHeader, udpHeader} + return []string{countryHeader, hostnameHeader, vpnHeader, tcpHeader, udpHeader} case providers.HideMyAss: return []string{countryHeader, regionHeader, cityHeader, hostnameHeader, tcpHeader, udpHeader} case providers.Ipvanish: diff --git a/internal/models/markdown_test.go b/internal/models/markdown_test.go index 7f4a9b15..764e5da2 100644 --- a/internal/models/markdown_test.go +++ b/internal/models/markdown_test.go @@ -4,6 +4,7 @@ import ( "testing" "github.com/qdm12/gluetun/internal/constants/providers" + "github.com/qdm12/gluetun/internal/constants/vpn" "github.com/stretchr/testify/assert" ) @@ -32,14 +33,14 @@ func Test_Servers_ToMarkdown(t *testing.T) { provider: providers.Fastestvpn, servers: Servers{ Servers: []Server{ - {Country: "a", Hostname: "xa", TCP: true}, - {Country: "b", Hostname: "xb", UDP: true}, + {Country: "a", Hostname: "xa", VPN: vpn.OpenVPN, TCP: true}, + {Country: "b", Hostname: "xb", VPN: vpn.OpenVPN, UDP: true}, }, }, - expectedMarkdown: "| Country | Hostname | TCP | UDP |\n" + - "| --- | --- | --- | --- |\n" + - "| a | `xa` | ✅ | ❌ |\n" + - "| b | `xb` | ❌ | ✅ |\n", + expectedMarkdown: "| Country | Hostname | VPN | TCP | UDP |\n" + + "| --- | --- | --- | --- | --- |\n" + + "| a | `xa` | openvpn | ✅ | ❌ |\n" + + "| b | `xb` | openvpn | ❌ | ✅ |\n", }, } diff --git a/internal/provider/fastestvpn/connection.go b/internal/provider/fastestvpn/connection.go index b525b2f2..3dd36cc8 100644 --- a/internal/provider/fastestvpn/connection.go +++ b/internal/provider/fastestvpn/connection.go @@ -8,7 +8,7 @@ import ( func (p *Provider) GetConnection(selection settings.ServerSelection, ipv6Supported bool) ( connection models.Connection, err error) { - defaults := utils.NewConnectionDefaults(4443, 4443, 0) //nolint:gomnd + defaults := utils.NewConnectionDefaults(4443, 4443, 51820) //nolint:gomnd return utils.GetConnection(p.Name(), p.storage, selection, defaults, ipv6Supported, p.randSource) } diff --git a/internal/provider/fastestvpn/updater/hosttoserver.go b/internal/provider/fastestvpn/updater/hosttoserver.go index 3f87b27c..3510f1f8 100644 --- a/internal/provider/fastestvpn/updater/hosttoserver.go +++ b/internal/provider/fastestvpn/updater/hosttoserver.go @@ -7,32 +7,45 @@ import ( "github.com/qdm12/gluetun/internal/models" ) -type hostToServer map[string]models.Server +type hostToServerData map[string]serverData -func (hts hostToServer) add(host, country, city string, tcp, udp bool) { - server, ok := hts[host] - if !ok { - server.VPN = vpn.OpenVPN - server.Hostname = host - server.Country = country - server.City = city +type serverData struct { + openvpn bool + wireguard bool + country string + city string + openvpnUDP bool + openvpnTCP bool + ips []netip.Addr +} + +func (hts hostToServerData) add(host, vpnType, country, city string, tcp, udp bool) { + serverData, ok := hts[host] + switch vpnType { + case vpn.OpenVPN: + serverData.openvpn = true + serverData.openvpnTCP = serverData.openvpnTCP || tcp + serverData.openvpnUDP = serverData.openvpnUDP || udp + case vpn.Wireguard: + serverData.wireguard = true + default: + panic("protocol not supported") } - if city != "" { + + if !ok { + serverData.country = country + serverData.city = city + } else if city != "" { // some servers are listed without the city although // they are also listed with the city described, so update // the city field. - server.City = city + serverData.city = city } - if tcp { - server.TCP = true - } - if udp { - server.UDP = true - } - hts[host] = server + + hts[host] = serverData } -func (hts hostToServer) toHostsSlice() (hosts []string) { +func (hts hostToServerData) toHostsSlice() (hosts []string) { hosts = make([]string, 0, len(hts)) for host := range hts { hosts = append(hosts, host) @@ -40,23 +53,41 @@ func (hts hostToServer) toHostsSlice() (hosts []string) { return hosts } -func (hts hostToServer) adaptWithIPs(hostToIPs map[string][]netip.Addr) { - for host, IPs := range hostToIPs { - server := hts[host] - server.IPs = IPs - hts[host] = server - } - for host, server := range hts { - if len(server.IPs) == 0 { +func (hts hostToServerData) adaptWithIPs(hostToIPs map[string][]netip.Addr) { + for host, serverData := range hts { + ips := hostToIPs[host] + if len(ips) == 0 { delete(hts, host) + continue } + serverData.ips = ips + hts[host] = serverData } } -func (hts hostToServer) toServersSlice() (servers []models.Server) { - servers = make([]models.Server, 0, len(hts)) - for _, server := range hts { - servers = append(servers, server) +func (hts hostToServerData) toServersSlice() (servers []models.Server) { + servers = make([]models.Server, 0, 2*len(hts)) //nolint:gomnd + for hostname, serverData := range hts { + baseServer := models.Server{ + Hostname: hostname, + Country: serverData.country, + City: serverData.city, + IPs: serverData.ips, + } + if serverData.openvpn { + openvpnServer := baseServer + openvpnServer.VPN = vpn.OpenVPN + openvpnServer.TCP = serverData.openvpnTCP + openvpnServer.UDP = serverData.openvpnUDP + servers = append(servers, openvpnServer) + } + if serverData.wireguard { + wireguardServer := baseServer + wireguardServer.VPN = vpn.Wireguard + const wireguardPublicKey = "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=" + wireguardServer.WgPubKey = wireguardPublicKey + servers = append(servers, wireguardServer) + } } return servers } diff --git a/internal/provider/fastestvpn/updater/servers.go b/internal/provider/fastestvpn/updater/servers.go index bdbff7b8..b6f9d04f 100644 --- a/internal/provider/fastestvpn/updater/servers.go +++ b/internal/provider/fastestvpn/updater/servers.go @@ -5,14 +5,15 @@ import ( "fmt" "sort" + "github.com/qdm12/gluetun/internal/constants/vpn" "github.com/qdm12/gluetun/internal/models" "github.com/qdm12/gluetun/internal/provider/common" ) func (u *Updater) FetchServers(ctx context.Context, minServers int) ( servers []models.Server, err error) { - protocols := []string{"tcp", "udp"} - hts := make(hostToServer) + protocols := []string{"ikev2", "tcp", "udp"} + hts := make(hostToServerData) for _, protocol := range protocols { apiServers, err := fetchAPIServers(ctx, u.client, protocol) @@ -20,17 +21,20 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( return nil, fmt.Errorf("fetching %s servers from API: %w", protocol, err) } for _, apiServer := range apiServers { + // all hostnames from the protocols TCP, UDP and IKEV2 support Wireguard + // per https://github.com/qdm12/gluetun-wiki/issues/76#issuecomment-2125420536 + const wgTCP, wgUDP = false, false // ignored + hts.add(apiServer.hostname, vpn.Wireguard, apiServer.country, apiServer.city, wgTCP, wgUDP) + tcp := protocol == "tcp" udp := protocol == "udp" - hts.add(apiServer.hostname, apiServer.country, apiServer.city, tcp, udp) + if !tcp && !udp { // not an OpenVPN protocol, for example ikev2 + continue + } + hts.add(apiServer.hostname, vpn.OpenVPN, apiServer.country, apiServer.city, tcp, udp) } } - if len(hts) < minServers { - return nil, fmt.Errorf("%w: %d and expected at least %d", - common.ErrNotEnoughServers, len(hts), minServers) - } - hosts := hts.toHostsSlice() resolveSettings := parallelResolverSettings(hosts) hostToIPs, warnings, err := u.parallelResolver.Resolve(ctx, resolveSettings) @@ -41,15 +45,15 @@ func (u *Updater) FetchServers(ctx context.Context, minServers int) ( return nil, err } - if len(hostToIPs) < minServers { - return nil, fmt.Errorf("%w: %d and expected at least %d", - common.ErrNotEnoughServers, len(servers), minServers) - } - hts.adaptWithIPs(hostToIPs) servers = hts.toServersSlice() + if len(servers) < minServers { + return nil, fmt.Errorf("%w: %d and expected at least %d", + common.ErrNotEnoughServers, len(servers), minServers) + } + sort.Sort(models.SortableServers(servers)) return servers, nil diff --git a/internal/storage/servers.json b/internal/storage/servers.json index d531ecb1..f26d8381 100644 --- a/internal/storage/servers.json +++ b/internal/storage/servers.json @@ -23712,7 +23712,7 @@ }, "fastestvpn": { "version": 2, - "timestamp": 1722350820, + "timestamp": 1722367358, "servers": [ { "vpn": "openvpn", @@ -23725,6 +23725,16 @@ "146.70.141.59" ] }, + { + "vpn": "wireguard", + "country": "Australia", + "city": "Sydney", + "hostname": "au-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.141.59" + ] + }, { "vpn": "openvpn", "country": "Australia", @@ -23736,6 +23746,16 @@ "146.70.141.60" ] }, + { + "vpn": "wireguard", + "country": "Australia", + "city": "Sydney", + "hostname": "au-02.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.141.60" + ] + }, { "vpn": "openvpn", "country": "Australia", @@ -23747,6 +23767,16 @@ "146.70.141.62" ] }, + { + "vpn": "wireguard", + "country": "Australia", + "city": "Sydney", + "hostname": "au-stream.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.141.62" + ] + }, { "vpn": "openvpn", "country": "Austria", @@ -23758,6 +23788,16 @@ "146.70.146.50" ] }, + { + "vpn": "wireguard", + "country": "Austria", + "city": "Vienna", + "hostname": "at-stream.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.146.50" + ] + }, { "vpn": "openvpn", "country": "Austria", @@ -23769,6 +23809,16 @@ "146.70.146.50" ] }, + { + "vpn": "wireguard", + "country": "Austria", + "city": "Wien", + "hostname": "at-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.146.50" + ] + }, { "vpn": "openvpn", "country": "Belgium", @@ -23780,6 +23830,16 @@ "193.9.114.210" ] }, + { + "vpn": "wireguard", + "country": "Belgium", + "city": "Brussel", + "hostname": "bel-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "193.9.114.210" + ] + }, { "vpn": "openvpn", "country": "Belgium", @@ -23791,6 +23851,16 @@ "193.9.114.210" ] }, + { + "vpn": "wireguard", + "country": "Belgium", + "city": "Brussels", + "hostname": "bel-stream.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "193.9.114.210" + ] + }, { "vpn": "openvpn", "country": "Brazil", @@ -23804,6 +23874,18 @@ "185.192.124.131" ] }, + { + "vpn": "wireguard", + "country": "Brazil", + "hostname": "br-cf.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "185.192.124.75", + "185.192.124.77", + "185.192.124.104", + "185.192.124.131" + ] + }, { "vpn": "openvpn", "country": "Bulgaria", @@ -23815,6 +23897,16 @@ "217.138.221.130" ] }, + { + "vpn": "wireguard", + "country": "Bulgaria", + "city": "Sofia", + "hostname": "bg-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "217.138.221.130" + ] + }, { "vpn": "openvpn", "country": "Canada", @@ -23826,6 +23918,16 @@ "5.181.233.122" ] }, + { + "vpn": "wireguard", + "country": "Canada", + "city": "Montreal", + "hostname": "ca-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "5.181.233.122" + ] + }, { "vpn": "openvpn", "country": "Canada", @@ -23837,6 +23939,16 @@ "5.181.233.123" ] }, + { + "vpn": "wireguard", + "country": "Canada", + "city": "Montreal", + "hostname": "ca-stream.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "5.181.233.123" + ] + }, { "vpn": "openvpn", "country": "Canada", @@ -23847,6 +23959,16 @@ "193.239.86.4" ] }, + { + "vpn": "wireguard", + "country": "Canada", + "city": "Montreal", + "hostname": "hk-dbl.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "193.239.86.4" + ] + }, { "vpn": "openvpn", "country": "Colombia", @@ -23858,6 +23980,16 @@ "146.70.136.11" ] }, + { + "vpn": "wireguard", + "country": "Colombia", + "city": "Bogota", + "hostname": "clmb.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.136.11" + ] + }, { "vpn": "openvpn", "country": "Czech Republic", @@ -23869,6 +24001,16 @@ "45.84.122.154" ] }, + { + "vpn": "wireguard", + "country": "Czech Republic", + "city": "Prague", + "hostname": "cz-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "45.84.122.154" + ] + }, { "vpn": "openvpn", "country": "Denmark", @@ -23879,6 +24021,15 @@ "146.70.92.82" ] }, + { + "vpn": "wireguard", + "country": "Denmark", + "hostname": "dk-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.92.82" + ] + }, { "vpn": "openvpn", "country": "Finland", @@ -23890,6 +24041,16 @@ "37.143.129.237" ] }, + { + "vpn": "wireguard", + "country": "Finland", + "city": "Helsinki", + "hostname": "fi-p2p.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "37.143.129.237" + ] + }, { "vpn": "openvpn", "country": "Finland", @@ -23901,6 +24062,16 @@ "37.143.129.237" ] }, + { + "vpn": "wireguard", + "country": "Finland", + "city": "Helsinki", + "hostname": "fi2.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "37.143.129.237" + ] + }, { "vpn": "openvpn", "country": "France", @@ -23912,6 +24083,16 @@ "146.70.40.99" ] }, + { + "vpn": "wireguard", + "country": "France", + "city": "Paris", + "hostname": "fr.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.40.99" + ] + }, { "vpn": "openvpn", "country": "France", @@ -23923,6 +24104,16 @@ "195.191.219.69" ] }, + { + "vpn": "wireguard", + "country": "France", + "city": "Paris", + "hostname": "uk-dbl.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "195.191.219.69" + ] + }, { "vpn": "openvpn", "country": "Germany", @@ -23934,6 +24125,16 @@ "89.163.157.7" ] }, + { + "vpn": "wireguard", + "country": "Germany", + "city": "Dusseldorf", + "hostname": "de-dus1.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "89.163.157.7" + ] + }, { "vpn": "openvpn", "country": "Germany", @@ -23945,6 +24146,16 @@ "213.202.218.2" ] }, + { + "vpn": "wireguard", + "country": "Germany", + "city": "Dusseldorf", + "hostname": "de-dus2.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "213.202.218.2" + ] + }, { "vpn": "openvpn", "country": "Germany", @@ -23956,6 +24167,16 @@ "146.70.139.154" ] }, + { + "vpn": "wireguard", + "country": "Germany", + "city": "Frankfurt", + "hostname": "de-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.139.154" + ] + }, { "vpn": "openvpn", "country": "Greece", @@ -23967,6 +24188,16 @@ "45.92.33.82" ] }, + { + "vpn": "wireguard", + "country": "Greece", + "city": "Athina", + "hostname": "grc.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "45.92.33.82" + ] + }, { "vpn": "openvpn", "country": "Hong Kong", @@ -23978,6 +24209,16 @@ "193.239.86.3" ] }, + { + "vpn": "wireguard", + "country": "Hong Kong", + "city": "HK", + "hostname": "hk.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "193.239.86.3" + ] + }, { "vpn": "openvpn", "country": "Hungary", @@ -23989,6 +24230,16 @@ "37.120.144.165" ] }, + { + "vpn": "wireguard", + "country": "Hungary", + "city": "Budapest", + "hostname": "hng.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "37.120.144.165" + ] + }, { "vpn": "openvpn", "country": "India", @@ -24000,6 +24251,16 @@ "45.84.241.2" ] }, + { + "vpn": "wireguard", + "country": "India", + "city": "Mumbai", + "hostname": "in-vr.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "45.84.241.2" + ] + }, { "vpn": "openvpn", "country": "Ireland", @@ -24011,6 +24272,16 @@ "146.70.130.218" ] }, + { + "vpn": "wireguard", + "country": "Ireland", + "city": "Dublin", + "hostname": "ie-stream.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.130.218" + ] + }, { "vpn": "openvpn", "country": "Ireland", @@ -24022,6 +24293,16 @@ "146.70.130.218" ] }, + { + "vpn": "wireguard", + "country": "Ireland", + "city": "Dublin", + "hostname": "ir.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.130.218" + ] + }, { "vpn": "openvpn", "country": "Italy", @@ -24033,6 +24314,16 @@ "95.174.64.123" ] }, + { + "vpn": "wireguard", + "country": "Italy", + "city": "Assago", + "hostname": "it-stream.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "95.174.64.123" + ] + }, { "vpn": "openvpn", "country": "Italy", @@ -24044,6 +24335,16 @@ "95.174.64.122" ] }, + { + "vpn": "wireguard", + "country": "Italy", + "city": "milan", + "hostname": "it-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "95.174.64.122" + ] + }, { "vpn": "openvpn", "country": "Japan", @@ -24055,6 +24356,16 @@ "146.70.138.107" ] }, + { + "vpn": "wireguard", + "country": "Japan", + "city": "Tokyo", + "hostname": "jp-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.138.107" + ] + }, { "vpn": "openvpn", "country": "Japan", @@ -24066,6 +24377,16 @@ "146.70.138.110" ] }, + { + "vpn": "wireguard", + "country": "Japan", + "city": "Tokyo", + "hostname": "jp-stream.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.138.110" + ] + }, { "vpn": "openvpn", "country": "Luxembourg", @@ -24076,6 +24397,15 @@ "5.253.204.43" ] }, + { + "vpn": "wireguard", + "country": "Luxembourg", + "hostname": "lux1.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "5.253.204.43" + ] + }, { "vpn": "openvpn", "country": "Malaysia", @@ -24088,6 +24418,17 @@ "103.75.116.180" ] }, + { + "vpn": "wireguard", + "country": "Malaysia", + "hostname": "my-cf.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "103.75.116.27", + "103.75.116.141", + "103.75.116.180" + ] + }, { "vpn": "openvpn", "country": "Mexico", @@ -24098,6 +24439,15 @@ "147.78.1.112" ] }, + { + "vpn": "wireguard", + "country": "Mexico", + "hostname": "mx-cf.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "147.78.1.112" + ] + }, { "vpn": "openvpn", "country": "Netherlands", @@ -24108,6 +24458,15 @@ "108.181.123.74" ] }, + { + "vpn": "wireguard", + "country": "Netherlands", + "hostname": "nl-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "108.181.123.74" + ] + }, { "vpn": "openvpn", "country": "Netherlands", @@ -24118,6 +24477,15 @@ "108.181.123.75" ] }, + { + "vpn": "wireguard", + "country": "Netherlands", + "hostname": "nl-02.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "108.181.123.75" + ] + }, { "vpn": "openvpn", "country": "Norway", @@ -24129,6 +24497,16 @@ "91.219.215.34" ] }, + { + "vpn": "wireguard", + "country": "Norway", + "city": "Oslo", + "hostname": "nr-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "91.219.215.34" + ] + }, { "vpn": "openvpn", "country": "Poland", @@ -24140,6 +24518,16 @@ "37.120.211.234" ] }, + { + "vpn": "wireguard", + "country": "Poland", + "city": "Gdansk", + "hostname": "pl.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "37.120.211.234" + ] + }, { "vpn": "openvpn", "country": "Portugal", @@ -24151,6 +24539,16 @@ "185.90.57.146" ] }, + { + "vpn": "wireguard", + "country": "Portugal", + "city": "Lisbon", + "hostname": "pt.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "185.90.57.146" + ] + }, { "vpn": "openvpn", "country": "Romania", @@ -24162,6 +24560,16 @@ "146.70.66.130" ] }, + { + "vpn": "wireguard", + "country": "Romania", + "city": "Bucharest", + "hostname": "ro-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.66.130" + ] + }, { "vpn": "openvpn", "country": "Romania", @@ -24173,6 +24581,16 @@ "91.207.173.101" ] }, + { + "vpn": "wireguard", + "country": "Romania", + "city": "Bucharest", + "hostname": "sg-dvpn.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "91.207.173.101" + ] + }, { "vpn": "openvpn", "country": "Russia", @@ -24184,6 +24602,16 @@ "91.226.58.5" ] }, + { + "vpn": "wireguard", + "country": "Russia", + "city": "Moscow", + "hostname": "ru-vr.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "91.226.58.5" + ] + }, { "vpn": "openvpn", "country": "Serbia", @@ -24195,6 +24623,16 @@ "146.70.138.108" ] }, + { + "vpn": "wireguard", + "country": "Serbia", + "city": "Belgrade", + "hostname": "jp-dvpn.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.138.108" + ] + }, { "vpn": "openvpn", "country": "Serbia", @@ -24206,6 +24644,16 @@ "37.120.193.138" ] }, + { + "vpn": "wireguard", + "country": "Serbia", + "city": "Belgrade", + "hostname": "rs-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "37.120.193.138" + ] + }, { "vpn": "openvpn", "country": "Singapore", @@ -24217,6 +24665,16 @@ "91.207.173.99" ] }, + { + "vpn": "wireguard", + "country": "Singapore", + "city": "Singapore", + "hostname": "sg-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "91.207.173.99" + ] + }, { "vpn": "openvpn", "country": "Slovakia", @@ -24228,6 +24686,16 @@ "146.70.114.74" ] }, + { + "vpn": "wireguard", + "country": "Slovakia", + "city": "Bratislava", + "hostname": "svk.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.114.74" + ] + }, { "vpn": "openvpn", "country": "South Africa", @@ -24239,6 +24707,16 @@ "129.232.176.170" ] }, + { + "vpn": "wireguard", + "country": "South Africa", + "city": "Johannesburg", + "hostname": "sa-jn.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "129.232.176.170" + ] + }, { "vpn": "openvpn", "country": "South Korea", @@ -24250,6 +24728,16 @@ "103.249.31.36" ] }, + { + "vpn": "wireguard", + "country": "South Korea", + "city": "Seoul", + "hostname": "kr.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "103.249.31.36" + ] + }, { "vpn": "openvpn", "country": "Spain", @@ -24261,6 +24749,16 @@ "108.181.71.242" ] }, + { + "vpn": "wireguard", + "country": "Spain", + "city": "Barcelona", + "hostname": "es-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "108.181.71.242" + ] + }, { "vpn": "openvpn", "country": "Sweden", @@ -24272,6 +24770,16 @@ "146.70.16.234" ] }, + { + "vpn": "wireguard", + "country": "Sweden", + "city": "Stockholm", + "hostname": "se-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "146.70.16.234" + ] + }, { "vpn": "openvpn", "country": "Switzerland", @@ -24283,6 +24791,16 @@ "37.120.213.10" ] }, + { + "vpn": "wireguard", + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "37.120.213.10" + ] + }, { "vpn": "openvpn", "country": "Turkey", @@ -24294,6 +24812,16 @@ "185.123.101.43" ] }, + { + "vpn": "wireguard", + "country": "Turkey", + "city": "Izmir", + "hostname": "tr.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "185.123.101.43" + ] + }, { "vpn": "openvpn", "country": "UAE", @@ -24305,6 +24833,16 @@ "45.9.249.110" ] }, + { + "vpn": "wireguard", + "country": "UAE", + "city": "Dubai", + "hostname": "uae.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "45.9.249.110" + ] + }, { "vpn": "openvpn", "country": "UK", @@ -24316,6 +24854,16 @@ "195.191.219.67" ] }, + { + "vpn": "wireguard", + "country": "UK", + "city": "London", + "hostname": "uk-01.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "195.191.219.67" + ] + }, { "vpn": "openvpn", "country": "UK", @@ -24328,13 +24876,13 @@ ] }, { - "vpn": "openvpn", - "country": "USA", - "hostname": "us-mia.jumptoserver.com", - "tcp": true, - "udp": true, + "vpn": "wireguard", + "country": "UK", + "city": "London", + "hostname": "uk-02.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", "ips": [ - "37.120.157.250" + "195.191.219.68" ] }, { @@ -24347,6 +24895,15 @@ "23.105.160.221" ] }, + { + "vpn": "wireguard", + "country": "USA", + "hostname": "us-wt1.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "23.105.160.221" + ] + }, { "vpn": "openvpn", "country": "USA", @@ -24358,6 +24915,16 @@ "108.181.123.76" ] }, + { + "vpn": "wireguard", + "country": "USA", + "city": "Anchorage", + "hostname": "nl-dbl.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "108.181.123.76" + ] + }, { "vpn": "openvpn", "country": "USA", @@ -24369,6 +24936,16 @@ "108.181.56.98" ] }, + { + "vpn": "wireguard", + "country": "USA", + "city": "Ashburn", + "hostname": "us-ash.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "108.181.56.98" + ] + }, { "vpn": "openvpn", "country": "USA", @@ -24380,6 +24957,16 @@ "167.160.88.250" ] }, + { + "vpn": "wireguard", + "country": "USA", + "city": "Atlanta", + "hostname": "us-at.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "167.160.88.250" + ] + }, { "vpn": "openvpn", "country": "USA", @@ -24390,6 +24977,16 @@ "88.216.97.2" ] }, + { + "vpn": "wireguard", + "country": "USA", + "city": "Chicago", + "hostname": "us-ch.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "88.216.97.2" + ] + }, { "vpn": "openvpn", "country": "USA", @@ -24401,6 +24998,16 @@ "108.181.92.50" ] }, + { + "vpn": "wireguard", + "country": "USA", + "city": "Dallas", + "hostname": "us-dl.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "108.181.92.50" + ] + }, { "vpn": "openvpn", "country": "USA", @@ -24412,6 +25019,16 @@ "139.28.179.82" ] }, + { + "vpn": "wireguard", + "country": "USA", + "city": "Denver", + "hostname": "us-dv1.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "139.28.179.82" + ] + }, { "vpn": "openvpn", "country": "USA", @@ -24423,6 +25040,37 @@ "108.181.56.100" ] }, + { + "vpn": "wireguard", + "country": "USA", + "city": "Fargo", + "hostname": "us-ash-stream.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "108.181.56.100" + ] + }, + { + "vpn": "openvpn", + "country": "USA", + "city": "Miami", + "hostname": "us-mia.jumptoserver.com", + "tcp": true, + "udp": true, + "ips": [ + "37.120.157.250" + ] + }, + { + "vpn": "wireguard", + "country": "USA", + "city": "Miami", + "hostname": "us-mia.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "37.120.157.250" + ] + }, { "vpn": "openvpn", "country": "USA", @@ -24434,6 +25082,16 @@ "173.208.96.145" ] }, + { + "vpn": "wireguard", + "country": "USA", + "city": "New York", + "hostname": "us-ny.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "173.208.96.145" + ] + }, { "vpn": "openvpn", "country": "USA", @@ -24445,6 +25103,16 @@ "64.42.176.74" ] }, + { + "vpn": "wireguard", + "country": "USA", + "city": "Seattle", + "hostname": "us-se.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "64.42.176.74" + ] + }, { "vpn": "openvpn", "country": "Ukraine", @@ -24456,6 +25124,16 @@ "176.103.54.79" ] }, + { + "vpn": "wireguard", + "country": "Ukraine", + "city": "Kyyiv", + "hostname": "ur-kv.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "176.103.54.79" + ] + }, { "vpn": "openvpn", "country": "United Kingdom", @@ -24467,6 +25145,16 @@ "195.191.219.70" ] }, + { + "vpn": "wireguard", + "country": "United Kingdom", + "city": "London", + "hostname": "uk-streaming.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "195.191.219.70" + ] + }, { "vpn": "openvpn", "country": "United Kingdom", @@ -24477,6 +25165,16 @@ "ips": [ "139.28.179.83" ] + }, + { + "vpn": "wireguard", + "country": "United Kingdom", + "city": "London", + "hostname": "us-dbl1.jumptoserver.com", + "wgpubkey": "658QxufMbjOTmB61Z7f+c7Rjg7oqWLnepTalqBERjF0=", + "ips": [ + "139.28.179.83" + ] } ] },