diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 9d3c502d..8eae9d54 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -1 +1,2 @@ FROM qmcgaw/godevcontainer +RUN apk add wireguard-tools diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index feb7cd92..d9856287 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -4,6 +4,8 @@ services: vscode: build: . image: godevcontainer + devices: + - /dev/net/tun:/dev/net/tun volumes: - ../:/workspace # Docker socket to access Docker server @@ -23,7 +25,8 @@ services: - TZ= cap_add: # For debugging with dlv - - SYS_PTRACE + # - SYS_PTRACE + - NET_ADMIN security_opt: # For debugging with dlv - seccomp:unconfined diff --git a/.github/labels.yml b/.github/labels.yml index 27996015..0f9a8ce2 100644 --- a/.github/labels.yml +++ b/.github/labels.yml @@ -70,6 +70,9 @@ - name: "Openvpn" color: "ffc7ea" description: "" +- name: "Wireguard" + color: "ffc7ea" + description: "" - name: "Unbound (DNS over TLS)" color: "ffc7ea" description: "" diff --git a/Dockerfile b/Dockerfile index b2b6897e..c266a7a0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -68,6 +68,7 @@ LABEL \ org.opencontainers.image.description="VPN swiss-knife like client to tunnel to multiple VPN servers using OpenVPN, IPtables, DNS over TLS, Shadowsocks, an HTTP proxy and Alpine Linux" ENV VPNSP=pia \ VERSION_INFORMATION=on \ + VPN_TYPE=openvpn \ PROTOCOL=udp \ OPENVPN_VERSION=2.5 \ OPENVPN_VERBOSITY=1 \ @@ -77,6 +78,11 @@ ENV VPNSP=pia \ OPENVPN_IPV6=off \ OPENVPN_CUSTOM_CONFIG= \ OPENVPN_INTERFACE=tun0 \ + WIREGUARD_PRIVATE_KEY= \ + WIREGUARD_PRESHARED_KEY= \ + WIREGUARD_ADDRESS= \ + WIREGUARD_PORT= \ + WIREGUARD_INTERFACE=wg0 \ TZ= \ PUID= \ PGID= \ diff --git a/README.md b/README.md index cc482225..9c32693b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ HideMyAss, IPVanish, IVPN, Mullvad, NordVPN, Privado, Private Internet Access, P ProtonVPN, PureVPN, Surfshark, TorGuard, VPNUnlimited, VyprVPN and Windscribe VPN servers using Go, OpenVPN, iptables, DNS over TLS, ShadowSocks and an HTTP proxy* -**ANNOUNCEMENT**: You can try Wireguard, see #565 +**ANNOUNCEMENT**: Wireguard is now supported for all providers supporting it! ![Title image](https://raw.githubusercontent.com/qdm12/gluetun/master/title.svg) @@ -55,9 +55,10 @@ using Go, OpenVPN, iptables, DNS over TLS, ShadowSocks and an HTTP proxy* ## Features -- Based on Alpine 3.14 for a small Docker image of 30MB +- Based on Alpine 3.14 for a small Docker image of 31MB - Supports: **Cyberghost**, **FastestVPN**, **HideMyAss**, **IPVanish**, **IVPN**, **Mullvad**, **NordVPN**, **Privado**, **Private Internet Access**, **PrivateVPN**, **ProtonVPN**, **PureVPN**, **Surfshark**, **TorGuard**, **VPNUnlimited**, **Vyprvpn**, **Windscribe** servers -- Supports OpenVPN and Wireguard (the latter in progress, see PR #565 and issue #134) +- Supports OpenVPN +- Supports Wireguard for **Mullvad** and **Windscribe** (more in progress, see #134) - 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` @@ -110,6 +111,7 @@ The following points are all optional but should give you insights on all the po - [Test your setup](https://github.com/qdm12/gluetun/wiki/Test-your-setup) - [How to connect other containers and devices to Gluetun](https://github.com/qdm12/gluetun/wiki/Connect-to-gluetun) +- [How to use Wireguard](https://github.com/qdm12/gluetun/wiki/Wireguard) - [VPN server side port forwarding](https://github.com/qdm12/gluetun/wiki/Port-forwarding) - [HTTP control server](https://github.com/qdm12/gluetun/wiki/HTTP-Control-server) to automate things, restart Openvpn etc. - Update the image with `docker pull qmcgaw/gluetun:latest`. See this [Wiki document](https://github.com/qdm12/gluetun/wiki/Docker-image-tags) for Docker tags available. diff --git a/cmd/gluetun/main.go b/cmd/gluetun/main.go index bc03536e..fa4e0e4c 100644 --- a/cmd/gluetun/main.go +++ b/cmd/gluetun/main.go @@ -22,6 +22,7 @@ import ( "github.com/qdm12/gluetun/internal/healthcheck" "github.com/qdm12/gluetun/internal/httpproxy" "github.com/qdm12/gluetun/internal/models" + "github.com/qdm12/gluetun/internal/netlink" "github.com/qdm12/gluetun/internal/openvpn" "github.com/qdm12/gluetun/internal/portforward" "github.com/qdm12/gluetun/internal/publicip" @@ -69,13 +70,14 @@ func main() { args := os.Args tun := tun.New() + netLinker := netlink.New() cli := cli.New() env := params.NewEnv() cmder := command.NewCmder() errorCh := make(chan error) go func() { - errorCh <- _main(ctx, buildInfo, args, logger, env, tun, cmder, cli) + errorCh <- _main(ctx, buildInfo, args, logger, env, tun, netLinker, cmder, cli) }() select { @@ -116,7 +118,8 @@ var ( //nolint:gocognit,gocyclo func _main(ctx context.Context, buildInfo models.BuildInformation, args []string, logger logging.ParentLogger, env params.Env, - tun tun.Interface, cmder command.RunStarter, cli cli.CLIer) error { + tun tun.Interface, netLinker netlink.NetLinker, cmder command.RunStarter, + cli cli.CLIer) error { if len(args) > 1 { // cli operation switch args[1] { case "healthcheck": @@ -153,7 +156,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, dnsConf := unbound.NewConfigurator(nil, cmder, dnsCrypto, "/etc/unbound", "/usr/sbin/unbound", cacertsPath) - announcementExp, err := time.Parse(time.RFC3339, "2021-07-22T00:00:00Z") + announcementExp, err := time.Parse(time.RFC3339, "2021-10-02T00:00:00Z") if err != nil { return err } @@ -164,7 +167,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, Version: buildInfo.Version, Commit: buildInfo.Commit, BuildDate: buildInfo.Created, - Announcement: "", + Announcement: "Wireguard is now supported!", AnnounceExp: announcementExp, // Sponsor information PaypalUser: "qmcgaw", @@ -357,12 +360,12 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, vpnLogger := logger.NewChild(logging.Settings{Prefix: "vpn: "}) vpnLooper := vpn.NewLoop(allSettings.VPN, - allServers, ovpnConf, firewallConf, routingConf, portForwardLooper, + allServers, ovpnConf, netLinker, firewallConf, routingConf, portForwardLooper, cmder, publicIPLooper, unboundLooper, vpnLogger, httpClient, buildInfo, allSettings.VersionInformation) - openvpnHandler, openvpnCtx, openvpnDone := goshutdown.NewGoRoutineHandler( - "openvpn", goshutdown.GoRoutineSettings{Timeout: time.Second}) - go vpnLooper.Run(openvpnCtx, openvpnDone) + vpnHandler, vpnCtx, vpnDone := goshutdown.NewGoRoutineHandler( + "vpn", goshutdown.GoRoutineSettings{Timeout: time.Second}) + go vpnLooper.Run(vpnCtx, vpnDone) updaterLooper := updater.NewLooper(allSettings.Updater, allServers, storage, vpnLooper.SetServers, httpClient, @@ -417,7 +420,7 @@ func _main(ctx context.Context, buildInfo models.BuildInformation, } orderHandler := goshutdown.NewOrder("gluetun", orderSettings) orderHandler.Append(controlGroupHandler, tickersGroupHandler, healthServerHandler, - openvpnHandler, portForwardHandler, otherGroupHandler) + vpnHandler, portForwardHandler, otherGroupHandler) // Start VPN for the first time in a blocking call // until the VPN is launched diff --git a/docker-compose.yml b/docker-compose.yml index 2a18300c..f850165e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,10 +15,11 @@ services: volumes: - /yourpath:/gluetun environment: - # More variables are available, see the readme table + # More variables are available, see the Wiki table - OPENVPN_USER= - OPENVPN_PASSWORD= - VPNSP=private internet access + - VPN_TYPE=openvpn # Timezone for accurate logs times - TZ= restart: always diff --git a/go.mod b/go.mod index 980af6ff..8cbf0d25 100644 --- a/go.mod +++ b/go.mod @@ -14,13 +14,19 @@ require ( github.com/stretchr/testify v1.7.0 github.com/vishvananda/netlink v1.1.0 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c + golang.zx2c4.com/wireguard v0.0.0-20210805125648-3957e9b9dd19 + golang.zx2c4.com/wireguard/wgctrl v0.0.0-20210803171230-4253848d036c inet.af/netaddr v0.0.0-20210718074554-06ca8145d722 ) require ( github.com/davecgh/go-spew v1.1.1 // indirect + github.com/google/go-cmp v0.5.5 // indirect + github.com/josharian/native v0.0.0-20200817173448-b6b71def0850 // indirect github.com/mattn/go-colorable v0.1.8 // indirect github.com/mattn/go-isatty v0.0.12 // indirect + github.com/mdlayher/genetlink v1.0.0 // indirect + github.com/mdlayher/netlink v1.4.0 // indirect github.com/miekg/dns v1.1.40 // indirect github.com/mr-tron/base58 v1.2.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect @@ -29,6 +35,6 @@ require ( go4.org/intern v0.0.0-20210108033219-3eb7198706b2 // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20201222180813-1025295fd063 // indirect golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect - golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 // indirect + golang.org/x/net v0.0.0-20210504132125-bbd867fde50d // indirect gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect ) diff --git a/go.sum b/go.sum index 61d8df8a..23c8b54e 100644 --- a/go.sum +++ b/go.sum @@ -33,11 +33,28 @@ github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3K github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gotify/go-api-client/v2 v2.0.4/go.mod h1:VKiah/UK20bXsr0JObE1eBVLW44zbBouzjuri9iwjFU= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/josharian/native v0.0.0-20200817173448-b6b71def0850 h1:uhL5Gw7BINiiPAo24A2sxkcDI0Jt/sqp1v5xQCniEFA= +github.com/josharian/native v0.0.0-20200817173448-b6b71def0850/go.mod h1:7X/raswPFr05uY3HiLlYeyQntB6OO7E/d2Cu7qoaN2w= +github.com/jsimonetti/rtnetlink v0.0.0-20190606172950-9527aa82566a/go.mod h1:Oz+70psSo5OFh8DBl0Zv2ACw7Esh6pPUphlvZG9x7uw= +github.com/jsimonetti/rtnetlink v0.0.0-20200117123717-f846d4f6c1f4/go.mod h1:WGuG/smIU4J/54PblvSbh+xvCZmpJnFgr3ds6Z55XMQ= +github.com/jsimonetti/rtnetlink v0.0.0-20201009170750-9c6f07d100c1/go.mod h1:hqoO/u39cqLeBLebZ8fWdE96O7FxrAsRYhnVOdgHxok= +github.com/jsimonetti/rtnetlink v0.0.0-20201216134343-bde56ed16391/go.mod h1:cR77jAZG3Y3bsb8hF6fHJbFoyFukLFOkQ98S0pQz3xw= +github.com/jsimonetti/rtnetlink v0.0.0-20201220180245-69540ac93943/go.mod h1:z4c53zj6Eex712ROyh8WI0ihysb5j2ROyV42iNogmAs= +github.com/jsimonetti/rtnetlink v0.0.0-20210122163228-8d122574c736/go.mod h1:ZXpIyOK59ZnN7J0BV99cZUPmsqDRZ3eq5X+st7u/oSA= +github.com/jsimonetti/rtnetlink v0.0.0-20210212075122-66c871082f2b h1:c3NTyLNozICy8B4mlMXemD3z/gXgQzVXZS/HqT+i3do= +github.com/jsimonetti/rtnetlink v0.0.0-20210212075122-66c871082f2b/go.mod h1:8w9Rh8m+aHZIG69YPGGem1i5VzoyRC8nw2kA8B+ik5U= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -51,8 +68,24 @@ github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mdlayher/ethtool v0.0.0-20210210192532-2b88debcdd43 h1:WgyLFv10Ov49JAQI/ZLUkCZ7VJS3r74hwFIGXJsgZlY= +github.com/mdlayher/ethtool v0.0.0-20210210192532-2b88debcdd43/go.mod h1:+t7E0lkKfbBsebllff1xdTmyJt8lH37niI6kwFk9OTo= +github.com/mdlayher/genetlink v1.0.0 h1:OoHN1OdyEIkScEmRgxLEe2M9U8ClMytqA5niynLtfj0= +github.com/mdlayher/genetlink v1.0.0/go.mod h1:0rJ0h4itni50A86M2kHcgS85ttZazNt7a8H2a2cw0Gc= +github.com/mdlayher/netlink v0.0.0-20190409211403-11939a169225/go.mod h1:eQB3mZE4aiYnlUsyGGCOpPETfdQq4Jhsgf1fk3cwQaA= +github.com/mdlayher/netlink v1.0.0/go.mod h1:KxeJAFOFLG6AjpyDkQ/iIhxygIUKD+vcwqcnu43w/+M= +github.com/mdlayher/netlink v1.1.0/go.mod h1:H4WCitaheIsdF9yOYu8CFmCgQthAPIWZmcKp9uZHgmY= +github.com/mdlayher/netlink v1.1.1/go.mod h1:WTYpFb/WTvlRJAyKhZL5/uy69TDDpHHu2VZmb2XgV7o= +github.com/mdlayher/netlink v1.2.0/go.mod h1:kwVW1io0AZy9A1E2YYgaD4Cj+C+GPkU6klXCMzIJ9p8= +github.com/mdlayher/netlink v1.2.1/go.mod h1:bacnNlfhqHqqLo4WsYeXSqfyXkInQ9JneWI68v1KwSU= +github.com/mdlayher/netlink v1.2.2-0.20210123213345-5cc92139ae3e/go.mod h1:bacnNlfhqHqqLo4WsYeXSqfyXkInQ9JneWI68v1KwSU= +github.com/mdlayher/netlink v1.3.0/go.mod h1:xK/BssKuwcRXHrtN04UBkwQ6dY9VviGGuriDdoPSWys= +github.com/mdlayher/netlink v1.4.0 h1:n3ARR+Fm0dDv37dj5wSWZXDKcy+U0zwcXS3zKMnSiT0= +github.com/mdlayher/netlink v1.4.0/go.mod h1:dRJi5IABcZpBD2A3D0Mv/AiX8I9uDEu5oGkAVrekmf8= github.com/miekg/dns v1.1.40 h1:pyyPFfGMnciYUk/mXpKkVmeMQjfXqt3FAJ2hy7tPiLA= github.com/miekg/dns v1.1.40/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721 h1:RlZweED6sbSArvlE924+mUcZuXKLBHA35U7LN621Bws= +github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721/go.mod h1:Ickgr2WtCLZ2MDGd4Gr0geeCH5HybhRJbonOgQpvSxc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= @@ -106,6 +139,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210503195802-e9a32991a82e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -113,38 +148,67 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201216054612-986b41b23924/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210504132125-bbd867fde50d h1:nTDGCTeAu2LhcsHTRzjyIUbZHCJ4QePArsm27Hka0UM= +golang.org/x/net v0.0.0-20210504132125-bbd867fde50d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190411185658-b44545bcd369/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201118182958-a01c418693c7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201218084310-7d0127a74742/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210110051926-789bb1bd4061/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210123111255-9b0068b26619/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210216163648-f7da38b97c65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309040221-94ec62e08169/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -153,7 +217,14 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.zx2c4.com/wireguard v0.0.0-20210427022245-097af6e1351b/go.mod h1:a057zjmoc00UN7gVkaJt2sXVK523kMJcogDTEvPIasg= +golang.zx2c4.com/wireguard v0.0.0-20210805125648-3957e9b9dd19 h1:ab2jcw2W91Rz07eHAb8Lic7sFQKO0NhBftjv6m/gL/0= +golang.zx2c4.com/wireguard v0.0.0-20210805125648-3957e9b9dd19/go.mod h1:laHzsbfMhGSobUmruXWAyMKKHSqvIcrqZJMyHD+/3O8= +golang.zx2c4.com/wireguard/wgctrl v0.0.0-20210803171230-4253848d036c h1:ADNrRDI5NR23/TUCnEmlLZLt4u9DnZ2nwRkPrAcFvto= +golang.zx2c4.com/wireguard/wgctrl v0.0.0-20210803171230-4253848d036c/go.mod h1:+1XihzyZUBJcSc5WO9SwNA7v26puQwOEDwanaxfNXPQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/configuration/mullvad.go b/internal/configuration/mullvad.go index 5a350f88..5f69bbab 100644 --- a/internal/configuration/mullvad.go +++ b/internal/configuration/mullvad.go @@ -49,7 +49,7 @@ func (settings *OpenVPNSelection) readMullvad(env params.Env) (err error) { return err } - settings.CustomPort, err = readCustomPort(env, settings.TCP, + settings.CustomPort, err = readOpenVPNCustomPort(env, settings.TCP, []uint16{80, 443, 1401}, []uint16{53, 1194, 1195, 1196, 1197, 1300, 1301, 1302, 1303, 1400}) if err != nil { return err diff --git a/internal/configuration/provider.go b/internal/configuration/provider.go index fcf24bbf..7d2a430e 100644 --- a/internal/configuration/provider.go +++ b/internal/configuration/provider.go @@ -43,7 +43,7 @@ var ( ) func (settings *Provider) read(r reader, vpnType string) error { - err := settings.readVPNServiceProvider(r) + err := settings.readVPNServiceProvider(r, vpnType) if err != nil { return err } @@ -94,11 +94,17 @@ func (settings *Provider) read(r reader, vpnType string) error { return nil } -func (settings *Provider) readVPNServiceProvider(r reader) (err error) { - allowedVPNServiceProviders := []string{ - "cyberghost", "fastestvpn", "hidemyass", "ipvanish", "ivpn", "mullvad", "nordvpn", - "privado", "pia", "private internet access", "privatevpn", "protonvpn", - "purevpn", "surfshark", "torguard", constants.VPNUnlimited, "vyprvpn", "windscribe"} +func (settings *Provider) readVPNServiceProvider(r reader, vpnType string) (err error) { + var allowedVPNServiceProviders []string + switch vpnType { + case constants.OpenVPN: + allowedVPNServiceProviders = []string{ + "cyberghost", "fastestvpn", "hidemyass", "ipvanish", "ivpn", "mullvad", "nordvpn", + "privado", "pia", "private internet access", "privatevpn", "protonvpn", + "purevpn", "surfshark", "torguard", constants.VPNUnlimited, "vyprvpn", "windscribe"} + case constants.Wireguard: + allowedVPNServiceProviders = []string{constants.Mullvad, constants.Windscribe} + } vpnsp, err := r.env.Inside("VPNSP", allowedVPNServiceProviders, params.Default("private internet access")) @@ -132,7 +138,7 @@ func readTargetIP(env params.Env) (targetIP net.IP, err error) { return targetIP, nil } -func readCustomPort(env params.Env, tcp bool, +func readOpenVPNCustomPort(env params.Env, tcp bool, allowedTCP, allowedUDP []uint16) (port uint16, err error) { port, err = readPortOrZero(env, "PORT") if err != nil { @@ -147,12 +153,42 @@ func readCustomPort(env params.Env, tcp bool, return port, nil } } - return 0, fmt.Errorf("environment variable PORT: %w: port %d for TCP protocol", ErrInvalidPort, port) + return 0, fmt.Errorf( + "environment variable PORT: %w: port %d for TCP protocol, can only be one of %s", + ErrInvalidPort, port, portsToString(allowedTCP)) } for i := range allowedUDP { if allowedUDP[i] == port { return port, nil } } - return 0, fmt.Errorf("environment variable PORT: %w: port %d for UDP protocol", ErrInvalidPort, port) + return 0, fmt.Errorf( + "environment variable PORT: %w: port %d for UDP protocol, can only be one of %s", + ErrInvalidPort, port, portsToString(allowedUDP)) +} + +func readWireguardCustomPort(env params.Env, allowed []uint16) (port uint16, err error) { + port, err = readPortOrZero(env, "WIREGUARD_PORT") + if err != nil { + return 0, fmt.Errorf("environment variable WIREGUARD_PORT: %w", err) + } else if port == 0 { + return 0, nil + } + + for i := range allowed { + if allowed[i] == port { + return port, nil + } + } + return 0, fmt.Errorf( + "environment variable WIREGUARD_PORT: %w: port %d, can only be one of %s", + ErrInvalidPort, port, portsToString(allowed)) +} + +func portsToString(ports []uint16) string { + slice := make([]string, len(ports)) + for i := range ports { + slice[i] = fmt.Sprint(ports[i]) + } + return strings.Join(slice, ", ") } diff --git a/internal/configuration/provider_test.go b/internal/configuration/provider_test.go index 42c8da6d..98ea4d0c 100644 --- a/internal/configuration/provider_test.go +++ b/internal/configuration/provider_test.go @@ -24,6 +24,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Cyberghost, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Groups: []string{"group"}, Regions: []string{"a", "El country"}, }, @@ -40,6 +41,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Fastestvpn, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Hostnames: []string{"a", "b"}, Countries: []string{"c", "d"}, }, @@ -56,6 +58,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.HideMyAss, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Countries: []string{"a", "b"}, Cities: []string{"c", "d"}, Hostnames: []string{"e", "f"}, @@ -74,6 +77,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Ipvanish, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Countries: []string{"a", "b"}, Cities: []string{"c", "d"}, Hostnames: []string{"e", "f"}, @@ -92,6 +96,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Ivpn, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Countries: []string{"a", "b"}, Cities: []string{"c", "d"}, Hostnames: []string{"e", "f"}, @@ -110,6 +115,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Mullvad, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Countries: []string{"a", "b"}, Cities: []string{"c", "d"}, ISPs: []string{"e", "f"}, @@ -132,6 +138,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Nordvpn, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Regions: []string{"a", "b"}, Numbers: []uint16{1, 2}, }, @@ -148,6 +155,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Privado, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Hostnames: []string{"a", "b"}, }, }, @@ -162,6 +170,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Privatevpn, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Hostnames: []string{"a", "b"}, Countries: []string{"c", "d"}, Cities: []string{"e", "f"}, @@ -180,6 +189,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Protonvpn, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Countries: []string{"a", "b"}, Regions: []string{"c", "d"}, Cities: []string{"e", "f"}, @@ -202,6 +212,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.PrivateInternetAccess, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Regions: []string{"a", "b"}, OpenVPN: OpenVPNSelection{ CustomPort: 1, @@ -226,6 +237,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Purevpn, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Regions: []string{"a", "b"}, Countries: []string{"c", "d"}, Cities: []string{"e", "f"}, @@ -244,6 +256,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Surfshark, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Regions: []string{"a", "b"}, }, }, @@ -258,6 +271,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Torguard, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Countries: []string{"a", "b"}, Cities: []string{"c", "d"}, Hostnames: []string{"e"}, @@ -276,6 +290,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.VPNUnlimited, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Countries: []string{"a", "b"}, Cities: []string{"c", "d"}, Hostnames: []string{"e", "f"}, @@ -298,6 +313,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Vyprvpn, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Regions: []string{"a", "b"}, }, }, @@ -312,6 +328,7 @@ func Test_Provider_lines(t *testing.T) { settings: Provider{ Name: constants.Windscribe, ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, Regions: []string{"a", "b"}, Cities: []string{"c", "d"}, Hostnames: []string{"e", "f"}, diff --git a/internal/configuration/reader.go b/internal/configuration/reader.go index 0f0c15c0..d656c985 100644 --- a/internal/configuration/reader.go +++ b/internal/configuration/reader.go @@ -109,12 +109,12 @@ func readIP(env params.Env, key string) (ip net.IP, err error) { } func readPortOrZero(env params.Env, key string) (port uint16, err error) { - s, err := env.Get(key) + s, err := env.Get(key, params.Default("0")) if err != nil { return 0, err } - if s == "" || s == "0" { + if s == "0" { return 0, nil } diff --git a/internal/configuration/selection.go b/internal/configuration/selection.go index 006c6bd2..4f4ecc60 100644 --- a/internal/configuration/selection.go +++ b/internal/configuration/selection.go @@ -4,12 +4,13 @@ import ( "fmt" "net" + "github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/golibs/params" ) type ServerSelection struct { //nolint:maligned // Common - VPN string `json:"vpn"` + VPN string `json:"vpn"` // note: this is required TargetIP net.IP `json:"target_ip,omitempty"` // TODO comments // Cyberghost, PIA, Protonvpn, Surfshark, Windscribe, Vyprvpn, NordVPN @@ -39,7 +40,8 @@ type ServerSelection struct { //nolint:maligned // VPNUnlimited StreamOnly bool `json:"stream_only"` - OpenVPN OpenVPNSelection `json:"openvpn"` + OpenVPN OpenVPNSelection `json:"openvpn"` + Wireguard WireguardSelection `json:"wireguard"` } func (selection ServerSelection) toLines() (lines []string) { @@ -91,7 +93,11 @@ func (selection ServerSelection) toLines() (lines []string) { lines = append(lines, lastIndent+"Numbers: "+commaJoin(numbersString)) } - lines = append(lines, selection.OpenVPN.lines()...) + if selection.VPN == constants.OpenVPN { + lines = append(lines, selection.OpenVPN.lines()...) + } else { // wireguard + lines = append(lines, selection.Wireguard.lines()...) + } return lines } @@ -137,6 +143,20 @@ func (settings *OpenVPNSelection) readProtocolAndPort(env params.Env) (err error return nil } +type WireguardSelection struct { + CustomPort uint16 `json:"custom_port"` // Mullvad +} + +func (settings *WireguardSelection) lines() (lines []string) { + lines = append(lines, lastIndent+"Wireguard selection:") + + if settings.CustomPort != 0 { + lines = append(lines, indent+lastIndent+"Custom port: "+fmt.Sprint(settings.CustomPort)) + } + + return lines +} + // PortForwarding contains settings for port forwarding. type PortForwarding struct { Enabled bool `json:"enabled"` diff --git a/internal/configuration/settings_test.go b/internal/configuration/settings_test.go index 7b101888..eb51f943 100644 --- a/internal/configuration/settings_test.go +++ b/internal/configuration/settings_test.go @@ -20,6 +20,9 @@ func Test_Settings_lines(t *testing.T) { Type: constants.OpenVPN, Provider: Provider{ Name: constants.Mullvad, + ServerSelection: ServerSelection{ + VPN: constants.OpenVPN, + }, }, OpenVPN: OpenVPN{ Version: constants.Openvpn25, diff --git a/internal/configuration/vpn.go b/internal/configuration/vpn.go index 633f3935..1ba3970b 100644 --- a/internal/configuration/vpn.go +++ b/internal/configuration/vpn.go @@ -10,9 +10,10 @@ import ( ) type VPN struct { - Type string `json:"type"` - OpenVPN OpenVPN `json:"openvpn"` - Provider Provider `json:"provider"` + Type string `json:"type"` + OpenVPN OpenVPN `json:"openvpn"` + Wireguard Wireguard `json:"wireguard"` + Provider Provider `json:"provider"` } func (settings *VPN) String() string { @@ -24,7 +25,14 @@ func (settings *VPN) lines() (lines []string) { lines = append(lines, indent+lastIndent+"Type: "+settings.Type) - for _, line := range settings.OpenVPN.lines() { + var vpnLines []string + switch settings.Type { + case constants.OpenVPN: + vpnLines = settings.OpenVPN.lines() + case constants.Wireguard: + vpnLines = settings.Wireguard.lines() + } + for _, line := range vpnLines { lines = append(lines, indent+line) } @@ -36,13 +44,15 @@ func (settings *VPN) lines() (lines []string) { } var ( - errReadProviderSettings = errors.New("cannot read provider settings") - errReadOpenVPNSettings = errors.New("cannot read OpenVPN settings") + errReadProviderSettings = errors.New("cannot read provider settings") + errReadOpenVPNSettings = errors.New("cannot read OpenVPN settings") + errReadWireguardSettings = errors.New("cannot read Wireguard settings") ) func (settings *VPN) read(r reader) (err error) { vpnType, err := r.env.Inside("VPN_TYPE", - []string{constants.OpenVPN}, params.Default(constants.OpenVPN)) + []string{constants.OpenVPN, constants.Wireguard}, + params.Default(constants.OpenVPN)) if err != nil { return fmt.Errorf("environment variable VPN_TYPE: %w", err) } @@ -54,9 +64,17 @@ func (settings *VPN) read(r reader) (err error) { } } - err = settings.OpenVPN.read(r, settings.Provider.Name) - if err != nil { - return fmt.Errorf("%w: %s", errReadOpenVPNSettings, err) + switch settings.Type { + case constants.OpenVPN: + err = settings.OpenVPN.read(r, settings.Provider.Name) + if err != nil { + return fmt.Errorf("%w: %s", errReadOpenVPNSettings, err) + } + case constants.Wireguard: + err = settings.Wireguard.read(r) + if err != nil { + return fmt.Errorf("%w: %s", errReadWireguardSettings, err) + } } return nil diff --git a/internal/configuration/windscribe.go b/internal/configuration/windscribe.go index 7e11901e..3fa909ea 100644 --- a/internal/configuration/windscribe.go +++ b/internal/configuration/windscribe.go @@ -30,7 +30,12 @@ func (settings *Provider) readWindscribe(r reader) (err error) { return fmt.Errorf("environment variable SERVER_HOSTNAME: %w", err) } - return settings.ServerSelection.OpenVPN.readWindscribe(r.env) + err = settings.ServerSelection.OpenVPN.readWindscribe(r.env) + if err != nil { + return err + } + + return settings.ServerSelection.Wireguard.readWindscribe(r.env) } func (settings *OpenVPNSelection) readWindscribe(env params.Env) (err error) { @@ -39,7 +44,7 @@ func (settings *OpenVPNSelection) readWindscribe(env params.Env) (err error) { return err } - settings.CustomPort, err = readCustomPort(env, settings.TCP, + settings.CustomPort, err = readOpenVPNCustomPort(env, settings.TCP, []uint16{21, 22, 80, 123, 143, 443, 587, 1194, 3306, 8080, 54783}, []uint16{53, 80, 123, 443, 1194, 54783}) if err != nil { @@ -48,3 +53,13 @@ func (settings *OpenVPNSelection) readWindscribe(env params.Env) (err error) { return nil } + +func (settings *WireguardSelection) readWindscribe(env params.Env) (err error) { + settings.CustomPort, err = readWireguardCustomPort(env, + []uint16{53, 80, 123, 443, 1194, 65142}) + if err != nil { + return err + } + + return nil +} diff --git a/internal/configuration/wireguard.go b/internal/configuration/wireguard.go new file mode 100644 index 00000000..f18ed6bf --- /dev/null +++ b/internal/configuration/wireguard.go @@ -0,0 +1,73 @@ +package configuration + +import ( + "fmt" + "net" + "strings" + + "github.com/qdm12/golibs/params" +) + +// Wireguard contains settings to configure the Wireguard client. +type Wireguard struct { + PrivateKey string `json:"privatekey"` + PreSharedKey string `json:"presharedkey"` + Address *net.IPNet `json:"address"` + Interface string `json:"interface"` +} + +func (settings *Wireguard) String() string { + return strings.Join(settings.lines(), "\n") +} + +func (settings *Wireguard) lines() (lines []string) { + lines = append(lines, lastIndent+"Wireguard:") + + lines = append(lines, indent+lastIndent+"Network interface: "+settings.Interface) + + if settings.PrivateKey != "" { + lines = append(lines, indent+lastIndent+"Private key is set") + } + + if settings.PreSharedKey != "" { + lines = append(lines, indent+lastIndent+"Pre-shared key is set") + } + + if settings.Address != nil { + lines = append(lines, indent+lastIndent+"Address: "+settings.Address.String()) + } + + return lines +} + +func (settings *Wireguard) read(r reader) (err error) { + settings.PrivateKey, err = r.env.Get("WIREGUARD_PRIVATE_KEY", + params.CaseSensitiveValue(), params.Unset(), params.Compulsory()) + if err != nil { + return fmt.Errorf("environment variable WIREGUARD_PRIVATE_KEY: %w", err) + } + + settings.PreSharedKey, err = r.env.Get("WIREGUARD_PRESHARED_KEY", + params.CaseSensitiveValue(), params.Unset()) + if err != nil { + return fmt.Errorf("environment variable WIREGUARD_PRESHARED_KEY: %w", err) + } + + addressString, err := r.env.Get("WIREGUARD_ADDRESS", params.Compulsory()) + if err != nil { + return fmt.Errorf("environment variable WIREGUARD_ADDRESS: %w", err) + } + ip, ipNet, err := net.ParseCIDR(addressString) + if err != nil { + return fmt.Errorf("environment variable WIREGUARD_ADDRESS: %w", err) + } + ipNet.IP = ip + settings.Address = ipNet + + settings.Interface, err = r.env.Get("WIREGUARD_INTERFACE", params.Default("wg0")) + if err != nil { + return fmt.Errorf("environment variable WIREGUARD_INTERFACE: %w", err) + } + + return nil +} diff --git a/internal/constants/servers.json b/internal/constants/servers.json index 7102e09e..35f94593 100644 --- a/internal/constants/servers.json +++ b/internal/constants/servers.json @@ -26427,10 +26427,11 @@ ] }, "mullvad": { - "version": 2, - "timestamp": 1627008320, + "version": 3, + "timestamp": 1629420682, "servers": [ { + "vpn": "openvpn", "ips": [ "31.171.154.210" ], @@ -26444,6 +26445,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "116.206.231.58" ], @@ -26457,6 +26459,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "43.245.160.162" ], @@ -26470,6 +26473,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "116.206.229.98" ], @@ -26483,6 +26487,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "116.206.228.202" ], @@ -26496,6 +26501,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "116.206.228.242" ], @@ -26509,6 +26515,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "116.206.230.98" ], @@ -26522,6 +26529,37 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "103.231.88.2" + ], + "ipsv6": [ + "2407:a080:3000:12::a03f" + ], + "country": "Australia", + "city": "Melbourne", + "hostname": "au3-wireguard", + "isp": "Intergrid", + "owned": false, + "wgpubkey": "kXXykjh6KqiE/pvtmTV8kCB+jhhkl9kT0Dg+yyDz8hg=" + }, + { + "vpn": "wireguard", + "ips": [ + "103.231.88.18" + ], + "ipsv6": [ + "2407:a080:3000:11::a04f" + ], + "country": "Australia", + "city": "Melbourne", + "hostname": "au4-wireguard", + "isp": "Intergrid", + "owned": false, + "wgpubkey": "D2ltFd7TbpYNq9PejAeGwlaJ2bEFLqOSYywdY9N5xCY=" + }, + { + "vpn": "openvpn", "ips": [ "103.77.235.66" ], @@ -26535,6 +26573,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "43.245.162.130" ], @@ -26548,6 +26587,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "103.77.232.130" ], @@ -26561,6 +26601,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "103.77.232.146" ], @@ -26574,6 +26615,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.44.10.18" ], @@ -26587,6 +26629,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.44.10.50" ], @@ -26600,6 +26643,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.44.10.194" ], @@ -26613,6 +26657,142 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "43.245.162.234" + ], + "ipsv6": [ + "2400:fa80:1:11::a01f" + ], + "country": "Australia", + "city": "Sydney", + "hostname": "au1-wireguard", + "isp": "Intergrid", + "owned": false, + "wgpubkey": "t+WbEMneS26Ukgzie9gjkc6rUyUiRNTgkLRcJ8IgTCk=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.44.10.114" + ], + "ipsv6": [ + "2001:ac8:84:33::a10f" + ], + "country": "Australia", + "city": "Sydney", + "hostname": "au10-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "BJWwDjgE2kmjazqxiKkisE+ZIxEOpvikJXkJYvQdz24=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.44.10.130" + ], + "ipsv6": [ + "2001:ac8:84:34::a11f" + ], + "country": "Australia", + "city": "Sydney", + "hostname": "au11-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "lpNlTCVN/Oru86QtEblGpxKc6R6fEFVmKjm5clumZQQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.44.10.146" + ], + "ipsv6": [ + "2001:ac8:84:35::a12f" + ], + "country": "Australia", + "city": "Sydney", + "hostname": "au12-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "8EVsUWoy+kULNzuxI1pugiAhJ5ffPsfzL94p025rM3I=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.44.10.162" + ], + "ipsv6": [ + "2001:ac8:84:36::a13f" + ], + "country": "Australia", + "city": "Sydney", + "hostname": "au13-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "VNyHFgr0yhjg2+58Tx3sU2wUPcS9+k7GuIPr1htWkjw=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.44.10.178" + ], + "ipsv6": [ + "2001:ac8:84:37::a14f" + ], + "country": "Australia", + "city": "Sydney", + "hostname": "au14-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "GtbNj9H0j+QakhAiaIA6trOu/OK304906ONbqkOonxo=" + }, + { + "vpn": "wireguard", + "ips": [ + "103.77.233.50" + ], + "ipsv6": [ + "2400:fa80:1:31::a02f" + ], + "country": "Australia", + "city": "Sydney", + "hostname": "au2-wireguard", + "isp": "Intergrid", + "owned": false, + "wgpubkey": "26Ad1I9IZJC4gLdSw9sAQrfW5+ahys2Jp9vzRsMMLmE=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.44.10.66" + ], + "ipsv6": [ + "2001:ac8:84:31::a08f" + ], + "country": "Australia", + "city": "Sydney", + "hostname": "au8-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "sHvZqCRnPcm0JKhqu4uZQ3aXR7CO6N/+bR4/mD+qaCM=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.44.10.82" + ], + "ipsv6": [ + "2001:ac8:84:32::a09f" + ], + "country": "Australia", + "city": "Sydney", + "hostname": "au9-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "a9TzidjjemtR2sVxgoDymsGV63vMV7v1+JY80HEYumA=" + }, + { + "vpn": "openvpn", "ips": [ "86.107.21.210" ], @@ -26626,6 +26806,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "5.253.207.34" ], @@ -26639,6 +26820,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "86.107.21.226" ], @@ -26652,6 +26834,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "86.107.21.242" ], @@ -26665,6 +26848,97 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "86.107.21.50" + ], + "ipsv6": [ + "2001:ac8:29:59::a04f" + ], + "country": "Austria", + "city": "Vienna", + "hostname": "at4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "hZpraeYrNU7Vl+UB2NSpXT2vBRM1fZ/a/gt4TTksP14=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.107.21.34" + ], + "ipsv6": [ + "2001:ac8:29:58::a05f" + ], + "country": "Austria", + "city": "Vienna", + "hostname": "at5-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "jJVG/lv7RikDG0FMsV3WJgfot5XecPm9aHDrYvU+NAM=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.107.21.18" + ], + "ipsv6": [ + "2001:ac8:29:57::a06f" + ], + "country": "Austria", + "city": "Vienna", + "hostname": "at6-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "l03RAG49wBmpdWKO6oywtdNO3Ksk8byIx9JCr3r8Mlo=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.107.21.2" + ], + "ipsv6": [ + "2001:ac8:29:56::a07f" + ], + "country": "Austria", + "city": "Vienna", + "hostname": "at7-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "FnyzqDU4TJeFMO5g1AcGEzLGeVcPAcvdvnEXjPFw3Gg=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.107.21.130" + ], + "ipsv6": [ + "2001:ac8:29:55::a08f" + ], + "country": "Austria", + "city": "Vienna", + "hostname": "at8-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "VxDx2tErPqmeDHGPfIhnsDg6nfJ5cnE6u4EfHx5MjBE=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.107.21.114" + ], + "ipsv6": [ + "2001:ac8:29:54::a09f" + ], + "country": "Austria", + "city": "Vienna", + "hostname": "at9-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "f4t0xU1DsADjvHsAeB0pJAOdq+FkYZ5IhHvWom+/dGI=" + }, + { + "vpn": "openvpn", "ips": [ "185.104.186.202" ], @@ -26678,6 +26952,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "91.207.57.50" ], @@ -26691,6 +26966,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "37.120.143.138" ], @@ -26704,6 +26980,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "37.120.218.138" ], @@ -26717,6 +26994,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "37.120.218.146" ], @@ -26730,6 +27008,67 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "193.9.114.2" + ], + "ipsv6": [ + "2001:ac8:27:20::a01f" + ], + "country": "Belgium", + "city": "Brussels", + "hostname": "be1-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "wkEqQQKK3dJDttRanJWONU/5xuxRDR4cLfvnPJKtijE=" + }, + { + "vpn": "wireguard", + "ips": [ + "5.253.205.162" + ], + "ipsv6": [ + "2001:ac8:27:51::a02f" + ], + "country": "Belgium", + "city": "Brussels", + "hostname": "be2-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Djs+FiBl54bMSHt2QsWZgdyu3hU2Vlkm5MRZt8MHe0c=" + }, + { + "vpn": "wireguard", + "ips": [ + "37.120.218.154" + ], + "ipsv6": [ + "2001:ac8:27:56::a03f" + ], + "country": "Belgium", + "city": "Brussels", + "hostname": "be3-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "pW/VljNbNWBg42/heyYGHeiKGVuzDhMw59eiSUQfnjo=" + }, + { + "vpn": "wireguard", + "ips": [ + "37.120.218.162" + ], + "ipsv6": [ + "2001:ac8:27:57::a04f" + ], + "country": "Belgium", + "city": "Brussels", + "hostname": "be4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "zotbXj8reba/gId9QDZ9Az8RsGLyAskCHVVM3HYhGQw=" + }, + { + "vpn": "openvpn", "ips": [ "177.67.80.186" ], @@ -26743,6 +27082,37 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "45.162.228.186" + ], + "ipsv6": [ + "2804:5364:3100:9::a01f" + ], + "country": "Brazil", + "city": "Sao Paulo", + "hostname": "br1-wireguard", + "isp": "Qnax", + "owned": false, + "wgpubkey": "2eYsuY/H7kpeam31OG+eQ7s43BeuyzoVgqwdeGXMd3A=" + }, + { + "vpn": "wireguard", + "ips": [ + "177.54.152.43" + ], + "ipsv6": [ + "2804:391c:12::a03f" + ], + "country": "Brazil", + "city": "Sao Paulo", + "hostname": "br3-wireguard", + "isp": "Maxihost", + "owned": false, + "wgpubkey": "8Yg64o0gEcNOY2ejtrEzMhfN+ol0W3BkJKsOE/P22kw=" + }, + { + "vpn": "openvpn", "ips": [ "37.120.152.114" ], @@ -26756,6 +27126,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "37.120.152.146" ], @@ -26769,6 +27140,67 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "217.138.221.178" + ], + "ipsv6": [ + "2001:ac8:30:28::a04f" + ], + "country": "Bulgaria", + "city": "Sofia", + "hostname": "bg4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "6TNimNeecei/wqpJak2Z8hdD25vg5oF/In9q3l4QQk4=" + }, + { + "vpn": "wireguard", + "ips": [ + "217.138.221.226" + ], + "ipsv6": [ + "2001:ac8:30:29::a05f" + ], + "country": "Bulgaria", + "city": "Sofia", + "hostname": "bg5-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "yXn7ziIFrHRgoZlhWRkxoGFb3maolOxOn6sh+OPLdT8=" + }, + { + "vpn": "wireguard", + "ips": [ + "217.138.221.242" + ], + "ipsv6": [ + "2001:ac8:30:30::a06f" + ], + "country": "Bulgaria", + "city": "Sofia", + "hostname": "bg6-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "lCGzNzh+hxEOyXQFvNo8FZwZcCD3dLgZvAo6XhnmUmk=" + }, + { + "vpn": "wireguard", + "ips": [ + "217.138.202.194" + ], + "ipsv6": [ + "2001:ac8:30:31::a07f" + ], + "country": "Bulgaria", + "city": "Sofia", + "hostname": "bg7-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "U2b1yPEcO/vlQrlpNTsgQJoYQ7oaxtW4OJQx6Cod9yo=" + }, + { + "vpn": "openvpn", "ips": [ "89.36.78.18" ], @@ -26782,6 +27214,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.36.78.34" ], @@ -26795,6 +27228,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.36.78.50" ], @@ -26808,6 +27242,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.36.78.66" ], @@ -26821,6 +27256,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.36.78.82" ], @@ -26834,6 +27270,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.36.78.98" ], @@ -26847,6 +27284,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.36.78.114" ], @@ -26860,6 +27298,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.36.78.130" ], @@ -26873,6 +27312,187 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "89.36.78.146" + ], + "ipsv6": [ + "2a0d:5600:9:bb::a10f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca10-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "pAVh6WJtyF7ktvavez399L4A615TXOAaUHQgpwJ4EHU=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.36.78.162" + ], + "ipsv6": [ + "2a0d:5600:9:bc::a11f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca11-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "hWlbtTvF2lXHx7VYlKguVqC1TAvxU8F/NXW3jcFxBG8=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.36.78.178" + ], + "ipsv6": [ + "2a0d:5600:9:bd::a12f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca12-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Dn8j7lbdBg8vDJcKFPT/JymWdTwVupQCdm0HtF8YikY=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.36.78.194" + ], + "ipsv6": [ + "2a0d:5600:9:be::a13f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca13-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "6JseWScYkcFM5ibBZWGp7DbZQgZ1jQ14mrnXbvnKGnc=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.36.78.210" + ], + "ipsv6": [ + "2a0d:5600:9:bf::a14f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca14-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "hAFhjCWuSgvIlnBplm4J3iQK4GNW1PSxY0WmoiQP63M=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.36.78.226" + ], + "ipsv6": [ + "2a0d:5600:9:c0::a15f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca15-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "dn27fhdet9sxRl3biHeCBvA5edZMC03bh0zZIj3DJzI=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.36.78.242" + ], + "ipsv6": [ + "2a0d:5600:9:c1::a16f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca16-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "eHHmvUwqIR2EQKxUM1i2HtiaNryOwGTjVP6K//HjRiY=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.36.78.2" + ], + "ipsv6": [ + "2a0d:5600:9:c2::a17f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca17-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "uWQn+YxJzgfChFium04RpovvN5KyoSZmnL9lnCHD9gc=" + }, + { + "vpn": "wireguard", + "ips": [ + "37.120.205.98" + ], + "ipsv6": [ + "2a0d:5600:9:43::a18f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca18-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "odeJmnpP19GxfiaAhZEqg9OkG4dgp5YxVVJL34ld1QI=" + }, + { + "vpn": "wireguard", + "ips": [ + "37.120.205.194" + ], + "ipsv6": [ + "2a0d:5600:9:4a::a19f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca19-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "5BBUQJ+/BDvI4G8ybxvJihMCkJN9B54Lrm2JYK5JzmY=" + }, + { + "vpn": "wireguard", + "ips": [ + "37.120.205.210" + ], + "ipsv6": [ + "2a0d:5600:9:4b::a20f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca20-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "9yGUwYAwZ38uo1dNos9AVkRApE/2gloiS3cd/MhJmwg=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.6.2" + ], + "ipsv6": [ + "2a0d:5600:9:ca::a21f" + ], + "country": "Canada", + "city": "Montreal", + "hostname": "ca21-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "ywlUvPueZiLIKXTMT2/UslgGv8yU7cUuKdQOpWi4xiI=" + }, + { + "vpn": "openvpn", "ips": [ "198.54.132.34" ], @@ -26886,6 +27506,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.132.50" ], @@ -26899,6 +27520,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.132.66" ], @@ -26912,6 +27534,97 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "198.54.132.82" + ], + "ipsv6": [ + "2607:9000:6000:15::a22f" + ], + "country": "Canada", + "city": "Toronto", + "hostname": "ca22-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "9PfLtMmfLsdNuh3Rj3eBDMId2bXZ7+yWJO78CZfuLzU=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.132.98" + ], + "ipsv6": [ + "2607:9000:6000:16::a23f" + ], + "country": "Canada", + "city": "Toronto", + "hostname": "ca23-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "iGwKJTbm/aL4kJXwcJkO0JYPEEGGDcYBrRTG7CHIQx0=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.132.114" + ], + "ipsv6": [ + "2607:9000:6000:17::a24f" + ], + "country": "Canada", + "city": "Toronto", + "hostname": "ca24-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "MbusadbeACMR5bv+PPjhldb5CgwjlCbthnTJNrOJnhI=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.132.130" + ], + "ipsv6": [ + "2607:9000:6000:18::a25f" + ], + "country": "Canada", + "city": "Toronto", + "hostname": "ca25-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "y9JT2B69QiWkbEAiXGq5yhtAvg8YNXNkjhHcUiBCiko=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.132.146" + ], + "ipsv6": [ + "2607:9000:6000:19::a26f" + ], + "country": "Canada", + "city": "Toronto", + "hostname": "ca26-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "XE+hufytSkX14TjskwmYL4HL4mbPf+Vd5Jfgwf/5JHc=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.132.162" + ], + "ipsv6": [ + "2607:9000:6000:20::a27f" + ], + "country": "Canada", + "city": "Toronto", + "hostname": "ca27-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "ptnLZbreIzTZrSyPD0XhOAAmN194hcPSG5TI5TTiL08=" + }, + { + "vpn": "openvpn", "ips": [ "172.83.40.38" ], @@ -26925,6 +27638,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "71.19.248.240" ], @@ -26938,6 +27652,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "71.19.249.81" ], @@ -26951,6 +27666,37 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "107.181.189.206" + ], + "ipsv6": [ + "2607:f7a0:d:4::a02f" + ], + "country": "Canada", + "city": "Vancouver", + "hostname": "ca2-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "quPBSdtRAfoUVkbRWvjXF5d5cYwhURobppSVd5Uz3xA=" + }, + { + "vpn": "wireguard", + "ips": [ + "71.19.249.31" + ], + "ipsv6": [ + "2605:80:19:4::a07f" + ], + "country": "Canada", + "city": "Vancouver", + "hostname": "ca7-wireguard", + "isp": "Esecuredata", + "owned": false, + "wgpubkey": "nis4OtPs4PsVh+roaxZx0eYVkcl532WdC3dikQ9YKwQ=" + }, + { + "vpn": "openvpn", "ips": [ "185.156.174.146" ], @@ -26964,6 +27710,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "185.156.174.170" ], @@ -26977,6 +27724,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "185.216.35.242" ], @@ -26990,6 +27738,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "217.138.199.74" ], @@ -27003,6 +27752,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "217.138.199.82" ], @@ -27016,6 +27766,82 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "185.242.6.18" + ], + "ipsv6": [ + "2001:ac8:33:a::a01f" + ], + "country": "Czech Republic", + "city": "Prague", + "hostname": "cz1-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "/LNuMn2Q3PXMjc5c84bAgf5efyXsKTQxPm45ywSK/Gg=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.9.112.114" + ], + "ipsv6": [ + "2001:ac8:33:1a::a02f" + ], + "country": "Czech Republic", + "city": "Prague", + "hostname": "cz2-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "5cnukfXHWIBm3FxF6uJSsG3jPuZM6NtSK05vl2a84Ug=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.242.6.194" + ], + "ipsv6": [ + "2001:ac8:33:23::a03f" + ], + "country": "Czech Republic", + "city": "Prague", + "hostname": "cz3-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "sTYtbdXVJFJgtLKzmlg6WKiOdRZ00DSnu+8mwLQxFQk=" + }, + { + "vpn": "wireguard", + "ips": [ + "217.138.199.90" + ], + "ipsv6": [ + "2001:ac8:33:41::a04f" + ], + "country": "Czech Republic", + "city": "Prague", + "hostname": "cz4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "R4Gs1D1YV6gbdl/QIDAb3o3jdAiZZypiEwc9GzSER04=" + }, + { + "vpn": "wireguard", + "ips": [ + "217.138.199.98" + ], + "ipsv6": [ + "2001:ac8:33:42::a05f" + ], + "country": "Czech Republic", + "city": "Prague", + "hostname": "cz5-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Mb9LGOovvkJPcjt9AzSeHukpjNzCndEM9aH/DadoDj8=" + }, + { + "vpn": "openvpn", "ips": [ "141.98.254.71" ], @@ -27029,6 +27855,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "45.129.56.81" ], @@ -27042,6 +27869,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "89.45.7.130" ], @@ -27055,6 +27883,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.45.7.146" ], @@ -27068,6 +27897,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "134.90.149.138" ], @@ -27081,6 +27911,142 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "45.129.56.67" + ], + "ipsv6": [ + "2a03:1b20:8:f011::a02f" + ], + "country": "Denmark", + "city": "Copenhagen", + "hostname": "dk2-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "egl+0TkpFU39F5O6r6+hIBMPQLOa8/t5CymOZV6CC3Y=" + }, + { + "vpn": "wireguard", + "ips": [ + "45.129.56.68" + ], + "ipsv6": [ + "2a03:1b20:8:f011::a03f" + ], + "country": "Denmark", + "city": "Copenhagen", + "hostname": "dk3-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "R5LUBgM/1UjeAR4lt+L/yA30Gee6/VqVZ9eAB3ZTajs=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.7.178" + ], + "ipsv6": [ + "2001:ac8:37:5d::a05f" + ], + "country": "Denmark", + "city": "Copenhagen", + "hostname": "dk5-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "7eykWQ65FV7saXDJiZazA5htM0Fr/01FrUa5Mgyg4j0=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.7.194" + ], + "ipsv6": [ + "2001:ac8:37:5e::a06f" + ], + "country": "Denmark", + "city": "Copenhagen", + "hostname": "dk6-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "jlhgiPDCNxhrfMUEAEXxU8AyJU+oZ+4TCYrt7o5VsFs=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.7.210" + ], + "ipsv6": [ + "2001:ac8:37:5f::a07f" + ], + "country": "Denmark", + "city": "Copenhagen", + "hostname": "dk7-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "E3XgsLAaDdRhYl5tPbBIO87bdTYQmpF72nqIhFBk3g8=" + }, + { + "vpn": "wireguard", + "ips": [ + "82.103.140.213" + ], + "ipsv6": [ + "2a00:9080:1:98c::1f" + ], + "country": "Denmark", + "city": "Copenhagen", + "hostname": "dk8-wireguard", + "isp": "Asergo", + "owned": false, + "wgpubkey": "H7tZk6jMQps9WHn8opffvYmt6XN3v1614EGpsMZoA3w=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.127.167.67" + ], + "ipsv6": [ + "2a07:d880:2::a01f" + ], + "country": "Estonia", + "city": "Tallinn", + "hostname": "ee1-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "5Gr+2UwVVy/jRJPKJGOIWXTTsqxPGd8mL/VgPlcuZXU=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.127.167.87" + ], + "ipsv6": [ + "2a07:d880:2::a02f" + ], + "country": "Estonia", + "city": "Tallinn", + "hostname": "ee2-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "LH+fpnB3eeHVgxrFIBUtiieXfEqd2sZENyyzGhS5K2o=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.127.167.107" + ], + "ipsv6": [ + "2a07:d880:2::a03f" + ], + "country": "Estonia", + "city": "Tallinn", + "hostname": "ee3-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "BFTDEFHcbU9huaxwpYa98eeaSJZa1iEJsH8OLXHxQjk=" + }, + { + "vpn": "openvpn", "ips": [ "185.204.1.171" ], @@ -27094,6 +28060,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.204.1.172" ], @@ -27107,6 +28074,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.204.1.173" ], @@ -27120,6 +28088,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.204.1.174" ], @@ -27133,6 +28102,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.204.1.175" ], @@ -27146,6 +28116,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.204.1.176" ], @@ -27159,6 +28130,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.212.149.201" ], @@ -27172,6 +28144,52 @@ "owned": true }, { + "vpn": "wireguard", + "ips": [ + "185.204.1.203" + ], + "ipsv6": [ + "2a0c:f040:0:2790::a01f" + ], + "country": "Finland", + "city": "Helsinki", + "hostname": "fi1-wireguard", + "isp": "Creanova", + "owned": true, + "wgpubkey": "lA7gRTmiY9IcSQGXjOEaJjvgtO76BwYJsaaNQqemMWU=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.204.1.211" + ], + "ipsv6": [ + "2a0c:f040:0:2790::a02f" + ], + "country": "Finland", + "city": "Helsinki", + "hostname": "fi2-wireguard", + "isp": "Creanova", + "owned": true, + "wgpubkey": "HjKLtlLs1RRTS8OhxBO7HaDizaWcVVieefKn2gPPTRQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.204.1.219" + ], + "ipsv6": [ + "2a0c:f040:0:2790::a03f" + ], + "country": "Finland", + "city": "Helsinki", + "hostname": "fi3-wireguard", + "isp": "Creanova", + "owned": true, + "wgpubkey": "Jv9FNGbb9T4ZYCXTjn/ib3ozCRvZ1ccYILuiJ1+1IgQ=" + }, + { + "vpn": "openvpn", "ips": [ "193.32.126.81" ], @@ -27185,6 +28203,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.32.126.82" ], @@ -27198,6 +28217,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.32.126.83" ], @@ -27211,6 +28231,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.32.126.84" ], @@ -27224,6 +28245,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "89.44.9.19" ], @@ -27237,6 +28259,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.44.9.35" ], @@ -27250,6 +28273,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "194.110.113.3" ], @@ -27263,6 +28287,202 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "194.110.113.19" + ], + "ipsv6": [ + "2001:ac8:25:d3::a10f" + ], + "country": "France", + "city": "Paris", + "hostname": "fr10-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "vQ0EXd1jWex1neG+W/SeQgByluIM0L5WnqkNa1j75Ek=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.110.113.35" + ], + "ipsv6": [ + "2001:ac8:25:d4::a11f" + ], + "country": "France", + "city": "Paris", + "hostname": "fr11-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "YKHo5jAYWOzvAFzc+9XAjn7rEWqY75MA3fPJmk7D7jU=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.110.113.51" + ], + "ipsv6": [ + "2001:ac8:25:d5::a12f" + ], + "country": "France", + "city": "Paris", + "hostname": "fr12-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "j/1ylCahjyHLiynsaPKykQw8mE5F0M6lQMZfgicJpm8=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.110.113.67" + ], + "ipsv6": [ + "2001:ac8:25:d6::a13f" + ], + "country": "France", + "city": "Paris", + "hostname": "fr13-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "2tuaExmwkXGVjJRnd3D31GsDwKXy2q+eD0Cy2gUbDSU=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.110.113.83" + ], + "ipsv6": [ + "2001:ac8:25:d7::a14f" + ], + "country": "France", + "city": "Paris", + "hostname": "fr14-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "rlKbOMrLiHiNphSB/kMEiLNdAPtgt+f64Rxqa+z991E=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.126.66" + ], + "ipsv6": [ + "2a03:1b20:9:f011::a01f" + ], + "country": "France", + "city": "Paris", + "hostname": "fr4-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "ov323GyDOEHLT0sNRUUPYiE3BkvFDjpmi1a4fzv49hE=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.126.67" + ], + "ipsv6": [ + "2a03:1b20:9:f011::a02f" + ], + "country": "France", + "city": "Paris", + "hostname": "fr5-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "R5Ve+PJD24QjNXi2Dim7szwCiOLnv+6hg+WyTudAYmE=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.126.68" + ], + "ipsv6": [ + "2a03:1b20:9:f011::a03f" + ], + "country": "France", + "city": "Paris", + "hostname": "fr6-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "w4r/o6VImF7l0/De3JpOGnpzjAFv9wcCu8Rop5eZkWc=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.126.69" + ], + "ipsv6": [ + "2a03:1b20:9:f011::a04f" + ], + "country": "France", + "city": "Paris", + "hostname": "fr7-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "E/KjR7nlFouuRXh1pwGDr7iK2TAZ6c4K0LjjmA1A2Tc=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.126.70" + ], + "ipsv6": [ + "2a03:1b20:9:f011::a05f" + ], + "country": "France", + "city": "Paris", + "hostname": "fr8-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "cmqtSjWUa4/0bENQDKxdr0vQqf4nFVDodarHm0Pc0hY=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.254.75.3" + ], + "ipsv6": [ + "2a03:d9c0:3000::a20f" + ], + "country": "Germany", + "city": "Dusseldorf", + "hostname": "de20-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "/pS3lXg1jTJ7I58GD/s/4GNL2B0U8JNbjbH9Ddh0myw=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.254.75.4" + ], + "ipsv6": [ + "2a03:d9c0:3000::a21f" + ], + "country": "Germany", + "city": "Dusseldorf", + "hostname": "de21-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "I6LOIdGsXojaR9GtwJUyFSzLtSnhct/x6IOrxK1W/Qo=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.254.75.5" + ], + "ipsv6": [ + "2a03:d9c0:3000::a22f" + ], + "country": "Germany", + "city": "Dusseldorf", + "hostname": "de22-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "+TpVOeCDHnfnqWMw1MI9MUK+UqleDQJeH4PN7/PyuU0=" + }, + { + "vpn": "openvpn", "ips": [ "185.213.155.131" ], @@ -27276,6 +28496,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.155.132" ], @@ -27289,6 +28510,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.155.133" ], @@ -27302,6 +28524,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.155.134" ], @@ -27315,6 +28538,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.155.135" ], @@ -27328,6 +28552,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.155.136" ], @@ -27341,6 +28566,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.155.137" ], @@ -27354,6 +28580,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.155.138" ], @@ -27367,6 +28594,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.155.139" ], @@ -27380,6 +28608,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.27.14.2" ], @@ -27393,6 +28622,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "193.27.14.18" ], @@ -27406,6 +28636,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "193.27.14.34" ], @@ -27419,6 +28650,232 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "185.209.196.69" + ], + "ipsv6": [ + "2a03:1b20:6:f011::a10f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de10-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "+30LcSQzgNtB01wyCyh4YPjItVyBFX5TP6Fs47AJSnA=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.209.196.70" + ], + "ipsv6": [ + "2a03:1b20:6:f011::a11f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de11-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "uC0C1H4zE6WoDjOq65DByv1dSZt2wAv6gXQ5nYOLiQM=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.14.66" + ], + "ipsv6": [ + "2001:ac8:20:305::a12f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de12-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Ec/wwcosVal9Kjc97ZuTTV7Dy5c0/W5iLet7jrSEm2k=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.14.82" + ], + "ipsv6": [ + "2001:ac8:20:306::a13f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de13-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "gB+j+wTsZ8dZq2TbUQovV6zwmM9O2SMneGQR6NHxOQQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.14.98" + ], + "ipsv6": [ + "2001:ac8:20:307::a14f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de14-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "vtqDtifokiHna0eBshGdJLedj/lzGW+iDvWKx+YjDFs=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.14.114" + ], + "ipsv6": [ + "2001:ac8:20:308::a15f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de15-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "7YN0g5B6gTRAcgb+78RpfGTw1UaNJprciQTSO/tKjyE=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.14.130" + ], + "ipsv6": [ + "2001:ac8:20:308::a16f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de16-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "3bEHVNah9L8nvWZmk7suzNvSQBPTC4EgO7umldY34Ac=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.14.146" + ], + "ipsv6": [ + "2001:ac8:20:309::a17f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de17-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Fp3bDkNLmmTajbN3cSVM9zi0OeSuOZySMGypk7HOO3E=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.36.25.3" + ], + "ipsv6": [ + "2a07:fe00:1::a23f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de23-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "EpiZKShr92zHOHRyMzHpw1fONtbk9uppMkxklU3SxhY=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.36.25.18" + ], + "ipsv6": [ + "2a07:fe00:1::a24f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de24-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "9hIGjit4ApkNGuEWYBLpahxokEoP0cT9CMZ+ELEygzo=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.36.25.33" + ], + "ipsv6": [ + "2a07:fe00:1::a25f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de25-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "Rc+VTdcBPg7i7dy7MAp6TOhwJP3g1/TilK+IaE7Aojc=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.213.155.130" + ], + "ipsv6": [ + "2a03:1b20:6:f011::a01f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de4-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "XTdlx3YmLb1vg1NsruXYmfzP6FZKmZR90Vr3u9kJ7S0=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.213.155.222" + ], + "ipsv6": [ + "2a03:1b20:6:f011::a02f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de5-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "bRcOjl6Yc+2x0dHCO6eSGoo9Y9euv9DljDJEYoLA0ks=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.209.196.66" + ], + "ipsv6": [ + "2a03:1b20:6:f011::a07f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de7-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "+0BEfUZ3D0DEM/fJVPUUhYYDdkkLjqedVerm8dV4bmE=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.209.196.67" + ], + "ipsv6": [ + "2a03:1b20:6:f011::a08f" + ], + "country": "Germany", + "city": "Frankfurt", + "hostname": "de8-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "XIge3HgGEHf52e4Jpzk8iFOrrp6q7trq0udhufFlDVo=" + }, + { + "vpn": "openvpn", "ips": [ "185.226.67.168" ], @@ -27432,6 +28889,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "209.58.184.146" ], @@ -27445,6 +28903,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "209.58.185.53" ], @@ -27458,6 +28917,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "209.58.185.186" ], @@ -27471,6 +28931,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.45.6.50" ], @@ -27484,6 +28945,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.45.6.66" ], @@ -27497,6 +28959,67 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "209.58.188.180" + ], + "ipsv6": [ + "2001:df1:801:a009:10::a01f" + ], + "country": "Hong Kong", + "city": "Hong Kong", + "hostname": "hk1-wireguard", + "isp": "Leaseweb", + "owned": false, + "wgpubkey": "oS4vR1RHoFtpevzl2KLUjqDH9AiLwnh9GHBMiB5FVgM=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.6.82" + ], + "ipsv6": [ + "2001:ac8:92:3::a02f" + ], + "country": "Hong Kong", + "city": "Hong Kong", + "hostname": "hk2-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "+LXNw5k3CFHeUaFGKC3bj7iQMvzGCprtBSraL2IsQWU=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.6.98" + ], + "ipsv6": [ + "2001:ac8:92:4::a03f" + ], + "country": "Hong Kong", + "city": "Hong Kong", + "hostname": "hk3-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "NwJsMjTnkY5Qr95Zmh75N0OfiQroEQdaIpxh58RCIGU=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.6.114" + ], + "ipsv6": [ + "2001:ac8:92:5::a04f" + ], + "country": "Hong Kong", + "city": "Hong Kong", + "hostname": "hk4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "ZTPHtQfr9FOhws6SQ+uQzeUn5atv8m72QOF+7jaBmDM=" + }, + { + "vpn": "openvpn", "ips": [ "86.106.74.34" ], @@ -27510,6 +29033,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "86.106.74.50" ], @@ -27523,6 +29047,52 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "86.106.74.66" + ], + "ipsv6": [ + "2001:ac8:26:ad::a03f" + ], + "country": "Hungary", + "city": "Budapest", + "hostname": "hu3-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "lSsOZ4jUbcbi7pHDqXi7U/8O55sCMKfMwF1GF+1+qgM=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.74.82" + ], + "ipsv6": [ + "2001:ac8:26:ae::a04f" + ], + "country": "Hungary", + "city": "Budapest", + "hostname": "hu4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "VLosXjrnpppwX5yjqW6WaFOYEY76hWQrDPlfe/0dzyY=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.74.98" + ], + "ipsv6": [ + "2001:ac8:26:af::a05f" + ], + "country": "Hungary", + "city": "Budapest", + "hostname": "hu5-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "mZM32UGNrhVXeQrTPCMqjh3jMyH5HvHbk8vwieTWpzM=" + }, + { + "vpn": "openvpn", "ips": [ "217.138.222.82" ], @@ -27536,6 +29106,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "217.138.222.90" ], @@ -27549,6 +29120,37 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "217.138.222.98" + ], + "ipsv6": [ + "2001:ac8:88:5d::a01f" + ], + "country": "Ireland", + "city": "Dublin", + "hostname": "ie1-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "202IWDDdX4GK94YtFlB/DEOPxe6BLpiwFYAviWHiKj8=" + }, + { + "vpn": "wireguard", + "ips": [ + "217.138.222.106" + ], + "ipsv6": [ + "2001:ac8:88:5e::a02f" + ], + "country": "Ireland", + "city": "Dublin", + "hostname": "ie2-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "DOunbHw/O5gnTNo1Ov/6rknpvJck9BlQ1zTMHE4JA38=" + }, + { + "vpn": "openvpn", "ips": [ "185.191.207.210" ], @@ -27562,6 +29164,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.40.182.146" ], @@ -27575,6 +29178,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "192.145.127.98" ], @@ -27588,6 +29192,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "192.145.127.114" ], @@ -27601,6 +29206,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.40.182.210" ], @@ -27614,6 +29220,142 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "91.193.5.2" + ], + "ipsv6": [ + "2001:ac8:24:7a::a04f" + ], + "country": "Italy", + "city": "Milan", + "hostname": "it4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "CJMsEa5/skjmYPc+lvHnmLD1dpSFoRmv/FE815oBbRE=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.5.18" + ], + "ipsv6": [ + "2001:ac8:24:7b::a05f" + ], + "country": "Italy", + "city": "Milan", + "hostname": "it5-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "FetdLS9yyn5FQYWpJQUUdxs17Abjp5AotivoxUiOVHk=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.5.34" + ], + "ipsv6": [ + "2001:ac8:24:7c::a06f" + ], + "country": "Italy", + "city": "Milan", + "hostname": "it6-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "6c25503CIsKKZ5BwFvSnid6dcCKTh5/ftmz4MvGnXzQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "37.120.201.82" + ], + "ipsv6": [ + "2001:ac8:24:50::a07f" + ], + "country": "Italy", + "city": "Milan", + "hostname": "it7-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "F4Scn2i1IIHTsWsCfXesNb2XYyrIu8Wn+vJihvPVk2M=" + }, + { + "vpn": "wireguard", + "ips": [ + "37.120.201.114" + ], + "ipsv6": [ + "2001:ac8:24:49::a08f" + ], + "country": "Italy", + "city": "Milan", + "hostname": "it8-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "hW+QDgH+88xUCgMSZkdMqTIuUossLmopwu6nWqHCsXc=" + }, + { + "vpn": "wireguard", + "ips": [ + "45.8.223.195" + ], + "ipsv6": [ + "2400:ddc0:c000::a01f" + ], + "country": "Japan", + "city": "Osaka", + "hostname": "jp1-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "C2TUHPoZlT08iceLM2coBDTbcfg9tTKrUt7tRBWP0nk=" + }, + { + "vpn": "wireguard", + "ips": [ + "45.8.223.210" + ], + "ipsv6": [ + "2400:ddc0:c000::a02f" + ], + "country": "Japan", + "city": "Osaka", + "hostname": "jp2-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "SKSP2p2pmtAbLF5QsiULdcqVaeiI/IOOvU06gQRNVUs=" + }, + { + "vpn": "wireguard", + "ips": [ + "45.8.223.225" + ], + "ipsv6": [ + "2400:ddc0:c000::a03f" + ], + "country": "Japan", + "city": "Osaka", + "hostname": "jp3-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "oWo/Ljb6SYqJYHHhRd8nKDjFJx9MqfouEYSJvba4XH4=" + }, + { + "vpn": "wireguard", + "ips": [ + "45.8.223.240" + ], + "ipsv6": [ + "2400:ddc0:c000::a04f" + ], + "country": "Japan", + "city": "Osaka", + "hostname": "jp4-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "EDkvP9v1ZX0eCTPStNC6PtbHvFk2t1b8iud+UQNe3Es=" + }, + { + "vpn": "openvpn", "ips": [ "217.138.252.50" ], @@ -27627,6 +29369,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "217.138.252.162" ], @@ -27640,6 +29383,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "217.138.252.178" ], @@ -27653,6 +29397,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "217.138.252.194" ], @@ -27666,6 +29411,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "217.138.252.210" ], @@ -27679,6 +29425,127 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "91.193.7.34" + ], + "ipsv6": [ + "2001:ac8:40:ba::a10f" + ], + "country": "Japan", + "city": "Tokyo", + "hostname": "jp10-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "OR4kf/AOFDn3dCzZdG/hiH92lRHeYPFitKHm40wWTWc=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.7.50" + ], + "ipsv6": [ + "2001:ac8:40:bb::a11f" + ], + "country": "Japan", + "city": "Tokyo", + "hostname": "jp11-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Xmucvp5MtwXQ3LjkI/o7kb3qb6O9QrdBhyhp8AkobDQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.7.66" + ], + "ipsv6": [ + "2001:ac8:40:bc::a12f" + ], + "country": "Japan", + "city": "Tokyo", + "hostname": "jp12-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "pxL/+Kh5nOwHRNkO0FRkSX423+qPssRp2k9+hUxGoR8=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.7.82" + ], + "ipsv6": [ + "2001:ac8:40:bd::a13f" + ], + "country": "Japan", + "city": "Tokyo", + "hostname": "jp13-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "MirGjkQpzD6c6yxgbcvECZlECFvgO0hx5p+QhpOJYRQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "217.138.252.226" + ], + "ipsv6": [ + "2001:ac8:40:b6::a06f" + ], + "country": "Japan", + "city": "Tokyo", + "hostname": "jp6-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "4EhX6bW/gfcu75nPm9nyexX6cRZXN/RCt/TETfXF0jc=" + }, + { + "vpn": "wireguard", + "ips": [ + "217.138.252.242" + ], + "ipsv6": [ + "2001:ac8:40:b7::a07f" + ], + "country": "Japan", + "city": "Tokyo", + "hostname": "jp7-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "JYBVvOwWa3cbZrm3ZUWry3CgG6AxsSlxJv7H2yEsCjk=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.7.2" + ], + "ipsv6": [ + "2001:ac8:40:b8::a08f" + ], + "country": "Japan", + "city": "Tokyo", + "hostname": "jp8-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "ATinKg0uacPxUhrxqjixcgksJ8coK8zP2Y9q0Hz4dnA=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.7.18" + ], + "ipsv6": [ + "2001:ac8:40:b9::a09f" + ], + "country": "Japan", + "city": "Tokyo", + "hostname": "jp9-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "6qBkfoucP2xtTJo5hiXl+1b5pbAHPVMcbng/DIhJEiw=" + }, + { + "vpn": "openvpn", "ips": [ "31.170.22.2" ], @@ -27692,6 +29559,22 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "31.170.22.15" + ], + "ipsv6": [ + "2a00:c68:0:cbd0::a01f" + ], + "country": "Latvia", + "city": "Riga", + "hostname": "lv1-wireguard", + "isp": "Makonix", + "owned": false, + "wgpubkey": "/4WK/eoCp0d2g3Vnd2D+0JVxcUVagZoZm0xg3bZpdgY=" + }, + { + "vpn": "openvpn", "ips": [ "92.223.89.160" ], @@ -27705,6 +29588,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "92.223.89.182" ], @@ -27718,6 +29602,52 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "92.223.89.181" + ], + "ipsv6": [ + "2a03:90c0:83:2953::a01f" + ], + "country": "Luxembourg", + "city": "Luxembourg", + "hostname": "lu1-wireguard", + "isp": "Evoluso", + "owned": false, + "wgpubkey": "nqb90SP3pY5kGjO0UetVv7PdOkZUEOh91Gmcf3LFRXc=" + }, + { + "vpn": "wireguard", + "ips": [ + "92.223.89.165" + ], + "ipsv6": [ + "2a03:90c0:83:2953::a02f" + ], + "country": "Luxembourg", + "city": "Luxembourg", + "hostname": "lu2-wireguard", + "isp": "Evoluso", + "owned": false, + "wgpubkey": "08lMToz0IbJfqNdybOrLJ+bGeyl28DuTaM80paWCrVg=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.225.28.146" + ], + "ipsv6": [ + "2a0d:4500::a01f" + ], + "country": "Macedonia", + "city": "Skopje", + "hostname": "mk1-wireguard", + "isp": "Interspace", + "owned": false, + "wgpubkey": "jJ6XV88Ba0olZqriq44Gga8uMH35FBlMEg/6AzZ02BI=" + }, + { + "vpn": "openvpn", "ips": [ "178.175.142.194" ], @@ -27731,6 +29661,22 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "178.175.131.98" + ], + "ipsv6": [ + "2a00:1dc0:2925:10::a01f" + ], + "country": "Moldova", + "city": "Chisinau", + "hostname": "md1-wireguard", + "isp": "Trabia", + "owned": false, + "wgpubkey": "BQobp2UXHJguYGz06WWJGJV6QytNIZlgMwr6Joufhx8=" + }, + { + "vpn": "openvpn", "ips": [ "185.65.134.131" ], @@ -27744,6 +29690,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.132" ], @@ -27757,6 +29704,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.133" ], @@ -27770,6 +29718,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.134" ], @@ -27783,6 +29732,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.135" ], @@ -27796,6 +29746,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.136" ], @@ -27809,6 +29760,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.139" ], @@ -27822,6 +29774,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.140" ], @@ -27835,6 +29788,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.141" ], @@ -27848,6 +29802,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.142" ], @@ -27861,6 +29816,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.143" ], @@ -27874,6 +29830,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.144" ], @@ -27887,6 +29844,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.145" ], @@ -27900,6 +29858,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.146" ], @@ -27913,6 +29872,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.147" ], @@ -27926,6 +29886,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.134.148" ], @@ -27939,6 +29900,142 @@ "owned": true }, { + "vpn": "wireguard", + "ips": [ + "193.32.249.66" + ], + "ipsv6": [ + "2a03:1b20:3:f011::a01f" + ], + "country": "Netherlands", + "city": "Amsterdam", + "hostname": "nl1-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "UrQiI9ISdPPzd4ARw1NHOPKKvKvxUhjwRjaI0JpJFgM=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.65.134.222" + ], + "ipsv6": [ + "2a03:1b20:3:f011::a02f" + ], + "country": "Netherlands", + "city": "Amsterdam", + "hostname": "nl2-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "P0NpAUCe/gfL4lgs/PH4nDd5kA5zNDtHbUcqfYmSdmg=" + }, + { + "vpn": "wireguard", + "ips": [ + "92.60.40.194" + ], + "ipsv6": [ + "2a0c:59c0:18::a20f" + ], + "country": "Netherlands", + "city": "Amsterdam", + "hostname": "nl20-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "StMPmol1+QQQQCJyAkm7t+l/QYTKe5CzXUhw0I6VX14=" + }, + { + "vpn": "wireguard", + "ips": [ + "92.60.40.209" + ], + "ipsv6": [ + "2a0c:59c0:18::a21f" + ], + "country": "Netherlands", + "city": "Amsterdam", + "hostname": "nl21-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "RodGkT2Xqiumwb7pg4WmiTjkZgJq0hW9okaJUyNBong=" + }, + { + "vpn": "wireguard", + "ips": [ + "92.60.40.224" + ], + "ipsv6": [ + "2a0c:59c0:18::a22f" + ], + "country": "Netherlands", + "city": "Amsterdam", + "hostname": "nl22-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "xwANpTKjog2nflBgA+HWplQfUXgbvh+b4a53P83nmX0=" + }, + { + "vpn": "wireguard", + "ips": [ + "92.60.40.239" + ], + "ipsv6": [ + "2a0c:59c0:18::a23f" + ], + "country": "Netherlands", + "city": "Amsterdam", + "hostname": "nl23-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "PaU5gPqZnj9XQ2csZK2oiyNz/cOUZM3yk6qHm67wbmA=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.65.134.223" + ], + "ipsv6": [ + "2a03:1b20:3:f011::a03f" + ], + "country": "Netherlands", + "city": "Amsterdam", + "hostname": "nl3-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "hnRorSW0YHlHAzGb4Uc/sjOqQIrqDnpJnTQi/n7Rp1c=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.249.69" + ], + "ipsv6": [ + "2a03:1b20:3:f011::a04f" + ], + "country": "Netherlands", + "city": "Amsterdam", + "hostname": "nl4-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "hnRyse6QxPPcZOoSwRsHUtK1W+APWXnIoaDTmH6JsHQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.249.70" + ], + "ipsv6": [ + "2a03:1b20:3:f011::a05f" + ], + "country": "Netherlands", + "city": "Amsterdam", + "hostname": "nl5-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "33BoONMGCm2vknq2eq72eozRsHmHQY6ZHEEZ4851TkY=" + }, + { + "vpn": "openvpn", "ips": [ "103.231.91.114" ], @@ -27952,6 +30049,37 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "103.108.94.34" + ], + "ipsv6": [ + "2400:fa80:4:10::a01f" + ], + "country": "New Zealand", + "city": "Auckland", + "hostname": "nz1-wireguard", + "isp": "Intergrid", + "owned": false, + "wgpubkey": "fz9sSuR61ZqbFlI004lFBksGbw3U4KADy0Kvxhv5JyY=" + }, + { + "vpn": "wireguard", + "ips": [ + "103.231.91.226" + ], + "ipsv6": [ + "2400:fa80:4:11::a02f" + ], + "country": "New Zealand", + "city": "Auckland", + "hostname": "nz2-wireguard", + "isp": "Intergrid", + "owned": false, + "wgpubkey": "kDVDjSME2WSxhEqOV6fkeNetTHv6tYWD8HNqHXCnESw=" + }, + { + "vpn": "openvpn", "ips": [ "91.90.44.11" ], @@ -27965,6 +30093,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "91.90.44.12" ], @@ -27978,6 +30107,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "91.90.44.13" ], @@ -27991,6 +30121,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "91.90.44.14" ], @@ -28004,6 +30135,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "91.90.44.15" ], @@ -28017,6 +30149,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "91.90.44.16" ], @@ -28030,6 +30163,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "91.90.44.17" ], @@ -28043,6 +30177,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "91.90.44.18" ], @@ -28056,6 +30191,67 @@ "owned": true }, { + "vpn": "wireguard", + "ips": [ + "176.125.235.71" + ], + "ipsv6": [ + "2a02:20c8:4124::a01f" + ], + "country": "Norway", + "city": "Oslo", + "hostname": "no1-wireguard", + "isp": "Blix", + "owned": true, + "wgpubkey": "jOUZjMq2PWHDzQxu3jPXktYB7EKeFwBzGZx56cTXXQg=" + }, + { + "vpn": "wireguard", + "ips": [ + "176.125.235.72" + ], + "ipsv6": [ + "2a02:20c8:4124::a02f" + ], + "country": "Norway", + "city": "Oslo", + "hostname": "no2-wireguard", + "isp": "Blix", + "owned": true, + "wgpubkey": "IhhpKphSFWpwja1P4HBctZ367G3Q53EgdeFGZro29Tc=" + }, + { + "vpn": "wireguard", + "ips": [ + "176.125.235.73" + ], + "ipsv6": [ + "2a02:20c8:4124::a03f" + ], + "country": "Norway", + "city": "Oslo", + "hostname": "no3-wireguard", + "isp": "Blix", + "owned": true, + "wgpubkey": "zOBWmQ3BEOZKsYKbj4dC2hQjxCbr3eKa6wGWyEDYbC4=" + }, + { + "vpn": "wireguard", + "ips": [ + "176.125.235.74" + ], + "ipsv6": [ + "2a02:20c8:4124::a04f" + ], + "country": "Norway", + "city": "Oslo", + "hostname": "no4-wireguard", + "isp": "Blix", + "owned": true, + "wgpubkey": "veeEoYS9a2T6K8WMs/MvRCdNJG580XbhnLfbFjp3B0M=" + }, + { + "vpn": "openvpn", "ips": [ "37.120.156.162" ], @@ -28069,6 +30265,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "185.244.214.210" ], @@ -28082,6 +30279,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "185.244.214.215" ], @@ -28095,6 +30293,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "37.120.211.186" ], @@ -28108,6 +30307,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "37.120.211.194" ], @@ -28121,6 +30321,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "37.120.211.202" ], @@ -28134,6 +30335,97 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "185.244.214.58" + ], + "ipsv6": [ + "2a0d:5600:13:9::a01f" + ], + "country": "Poland", + "city": "Warsaw", + "hostname": "pl1-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "p9FqkVuPmFXOta1CFn81m0HRgD+uic5UfLU0fQb3t00=" + }, + { + "vpn": "wireguard", + "ips": [ + "37.120.156.242" + ], + "ipsv6": [ + "2a0d:5600:13:1b::a02f" + ], + "country": "Poland", + "city": "Warsaw", + "hostname": "pl2-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "9v9VK6f98rFS2iZvYxqTvNWeeT34EYn6TRRZqNC2MhU=" + }, + { + "vpn": "wireguard", + "ips": [ + "5.253.206.210" + ], + "ipsv6": [ + "2a0d:5600:13:1c::a03f" + ], + "country": "Poland", + "city": "Warsaw", + "hostname": "pl3-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "VXt/spGVLruJ0m7aSkKWIIc5ktxS6wOg9dlNwDOKw0I=" + }, + { + "vpn": "wireguard", + "ips": [ + "37.120.211.210" + ], + "ipsv6": [ + "2a0d:5600:13:3c::a04f" + ], + "country": "Poland", + "city": "Warsaw", + "hostname": "pl4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "fOEmuT2M++Qnk1riHmce8DCriSlO5G5BQZVmzK7tq2E=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.46.24.33" + ], + "ipsv6": [ + "2a00:1651:0:4000::a01f" + ], + "country": "Portugal", + "city": "Lisbon", + "hostname": "pt1-wireguard", + "isp": "ptisp", + "owned": false, + "wgpubkey": "xL7uaEPI7KV3aNPELKpGjVxBCq0yiAc376iS/MRDo3Y=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.46.24.49" + ], + "ipsv6": [ + "2a00:1651:0:4001::a02f" + ], + "country": "Portugal", + "city": "Lisbon", + "hostname": "pt2-wireguard", + "isp": "ptisp", + "owned": false, + "wgpubkey": "9fS+IEof6FztE6sdxuyq94PzB90obnggin4TuHEpLhY=" + }, + { + "vpn": "openvpn", "ips": [ "185.163.110.66" ], @@ -28147,6 +30439,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "185.163.110.82" ], @@ -28160,6 +30453,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "185.163.110.98" ], @@ -28173,6 +30467,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "185.163.110.114" ], @@ -28186,6 +30481,82 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "185.45.15.194" + ], + "ipsv6": [ + "2a04:9dc0:0:94::a04f" + ], + "country": "Romania", + "city": "Bucharest", + "hostname": "ro4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "+5uSytyBBNzlJSc/Bg+B5fbhz04hGJEtgjYRY9eDFi0=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.45.15.210" + ], + "ipsv6": [ + "2a04:9dc0:0:95::a05f" + ], + "country": "Romania", + "city": "Bucharest", + "hostname": "ro5-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "6hqbJrVJMv5a15d1zvJDw09bB1heRHHupc2GEmUsmGo=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.123.143.194" + ], + "ipsv6": [ + "2a04:9dc0:0:96::a06f" + ], + "country": "Romania", + "city": "Bucharest", + "hostname": "ro6-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "t1D8bGu6LN9Rtscxe5KtDl9Xfa3wFgj+Mpn+89onYD8=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.123.143.210" + ], + "ipsv6": [ + "2a04:9dc0:0:97::a07f" + ], + "country": "Romania", + "city": "Bucharest", + "hostname": "ro7-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "PBkAK/T6eQHrBTAvfeSngjNnwb8FvhwQ2FKXEQp5dgM=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.120.144.98" + ], + "ipsv6": [ + "2a04:9dc0:0:98::a08f" + ], + "country": "Romania", + "city": "Bucharest", + "hostname": "ro8-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "oqfJ+FTSFZjTGzNVU7V8SOskjc0OtOEZ9HbUyHwKuBI=" + }, + { + "vpn": "openvpn", "ips": [ "89.38.224.98" ], @@ -28199,6 +30570,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.38.224.114" ], @@ -28212,6 +30584,37 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "152.89.160.178" + ], + "ipsv6": [ + "2001:ac8:7d:1b::a03f" + ], + "country": "Serbia", + "city": "Belgrade", + "hostname": "rs3-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "9U+3Wxd6DLZ+p9q0OImYd5FeLYjs86DHO7wsEL04M2A=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.38.224.82" + ], + "ipsv6": [ + "2001:ac8:7d:20::a04f" + ], + "country": "Serbia", + "city": "Belgrade", + "hostname": "rs4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "XfYd3s53gcTH4TDL8aCu2sa88TAxuWBD7CcOHtlDmjw=" + }, + { + "vpn": "openvpn", "ips": [ "176.104.107.118" ], @@ -28225,6 +30628,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.38.225.34" ], @@ -28238,6 +30642,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "94.198.43.2" ], @@ -28251,6 +30656,82 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "94.198.43.34" + ], + "ipsv6": [ + "2a0a:b640:1:57::a04f" + ], + "country": "Singapore", + "city": "Singapore", + "hostname": "sg4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "HbD3PLJKJdHPyjof67Tug83HH5x/KyInbiuPQvkOaDI=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.43.50" + ], + "ipsv6": [ + "2a0a:b640:1:58::a05f" + ], + "country": "Singapore", + "city": "Singapore", + "hostname": "sg5-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "+B9zLO2t0vCxoLlrG3fhB8M1OQ/kOSr6VL81eP+AUXU=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.43.66" + ], + "ipsv6": [ + "2a0a:b640:1:59::a06f" + ], + "country": "Singapore", + "city": "Singapore", + "hostname": "sg6-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "FfjGK3hSDhCm8xWixKv2O4SbPcQEH9Vx2ykfEWEY7ho=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.43.82" + ], + "ipsv6": [ + "2a0a:b640:1:5a::a07f" + ], + "country": "Singapore", + "city": "Singapore", + "hostname": "sg7-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "4KtYjALlkYH0xKW6AeUAhyznDAa5GKqDk8WHYso9/D8=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.43.98" + ], + "ipsv6": [ + "2a0a:b640:1:5b::a08f" + ], + "country": "Singapore", + "city": "Singapore", + "hostname": "sg8-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "VxROoDxnI3XS5DBgXEucl+iEd964v//8p7dHGMWGbkE=" + }, + { + "vpn": "openvpn", "ips": [ "89.238.178.34" ], @@ -28264,6 +30745,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.238.178.74" ], @@ -28277,6 +30759,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "195.206.107.146" ], @@ -28290,6 +30773,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "45.152.183.26" ], @@ -28303,6 +30787,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "45.152.183.42" ], @@ -28316,6 +30801,67 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "194.99.104.10" + ], + "ipsv6": [ + "2001:ac8:23:2c::a01f" + ], + "country": "Spain", + "city": "Madrid", + "hostname": "es1-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "hDflDse0Nz7GsZ0q5uylWOJaJQ6woJPCGy8IvTXKjzo=" + }, + { + "vpn": "wireguard", + "ips": [ + "37.120.199.34" + ], + "ipsv6": [ + "2001:ac8:23:4b::a02f" + ], + "country": "Spain", + "city": "Madrid", + "hostname": "es2-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "fMYx8zLs1oBQvXtkdpdCwhy0UUx9QhbF0kaXp1QJJSY=" + }, + { + "vpn": "wireguard", + "ips": [ + "45.152.183.50" + ], + "ipsv6": [ + "2001:ac8:23:5a::a04f" + ], + "country": "Spain", + "city": "Madrid", + "hostname": "es4-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Bnrn99Enx6mxeZO77+DanSMhAXi7EHazFUwGmFL2VCo=" + }, + { + "vpn": "wireguard", + "ips": [ + "45.152.183.58" + ], + "ipsv6": [ + "2001:ac8:23:5b::a05f" + ], + "country": "Spain", + "city": "Madrid", + "hostname": "es5-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "/u0n1ETjberX5jYv0W94zLvX5Qzn+pPL/8umey/iIlE=" + }, + { + "vpn": "openvpn", "ips": [ "185.213.154.131" ], @@ -28329,6 +30875,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.154.132" ], @@ -28342,6 +30889,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.154.133" ], @@ -28355,6 +30903,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.154.134" ], @@ -28368,6 +30917,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.154.135" ], @@ -28381,6 +30931,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.154.136" ], @@ -28394,6 +30945,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.154.137" ], @@ -28407,6 +30959,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.154.138" ], @@ -28420,6 +30973,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.154.139" ], @@ -28433,6 +30987,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.154.140" ], @@ -28446,6 +31001,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.154.141" ], @@ -28459,6 +31015,67 @@ "owned": true }, { + "vpn": "wireguard", + "ips": [ + "185.213.154.69" + ], + "ipsv6": [ + "2a03:1b20:5:f011::a10f" + ], + "country": "Sweden", + "city": "Gothenburg", + "hostname": "se10-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "veGD6/aEY6sMfN3Ls7YWPmNgu3AheO7nQqsFT47YSws=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.213.154.66" + ], + "ipsv6": [ + "2a03:1b20:5:f011:31::a03f" + ], + "country": "Sweden", + "city": "Gothenburg", + "hostname": "se3-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "5JMPeO7gXIbR5CnUa/NPNK4L5GqUnreF0/Bozai4pl4=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.213.154.67" + ], + "ipsv6": [ + "2a03:1b20:5:f011::a05f" + ], + "country": "Sweden", + "city": "Gothenburg", + "hostname": "se5-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "AtvE5KdPeQtOcE2QyXaPt9eQoBV3GBxzimQ2FIuGQ2U=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.213.154.68" + ], + "ipsv6": [ + "2a03:1b20:5:f011::a09f" + ], + "country": "Sweden", + "city": "Gothenburg", + "hostname": "se9-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "BLNHNoGO88LjV/wDBa7CUUwUzPq/fO2UwcGLy56hKy4=" + }, + { + "vpn": "openvpn", "ips": [ "185.213.152.131" ], @@ -28472,6 +31089,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.213.152.132" ], @@ -28485,6 +31103,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.138.218.131" ], @@ -28498,6 +31117,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.138.218.132" ], @@ -28511,6 +31131,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.138.218.133" ], @@ -28524,6 +31145,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.138.218.134" ], @@ -28537,6 +31159,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.138.218.135" ], @@ -28550,6 +31173,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.138.218.136" ], @@ -28563,6 +31187,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.138.218.137" ], @@ -28576,6 +31201,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.255.83" ], @@ -28589,6 +31215,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.255.84" ], @@ -28602,6 +31229,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.255.85" ], @@ -28615,6 +31243,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.255.86" ], @@ -28628,6 +31257,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.255.87" ], @@ -28641,6 +31271,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.255.88" ], @@ -28654,6 +31285,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.255.89" ], @@ -28667,6 +31299,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.255.90" ], @@ -28680,6 +31313,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.255.91" ], @@ -28693,6 +31327,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.255.92" ], @@ -28706,6 +31341,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.255.93" ], @@ -28719,6 +31355,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "45.83.220.87" ], @@ -28732,6 +31369,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "45.83.220.89" ], @@ -28745,6 +31383,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "45.83.220.90" ], @@ -28758,6 +31397,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "45.83.220.91" ], @@ -28771,6 +31411,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "45.83.220.92" ], @@ -28784,6 +31425,127 @@ "owned": true }, { + "vpn": "wireguard", + "ips": [ + "193.138.218.220" + ], + "ipsv6": [ + "2a03:1b20:1:f410::a01f" + ], + "country": "Sweden", + "city": "Malmö", + "hostname": "se1-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "Qn1QaXYTJJSmJSMw18CGdnFiVM0/Gj/15OdkxbXCSG0=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.138.218.80" + ], + "ipsv6": [ + "2a03:1b20:1:f410::a15f" + ], + "country": "Sweden", + "city": "Malmö", + "hostname": "se15-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "5y66WShsFXqM5K7/4CPEGCWfk7PQyNhVBT2ILjbGm2I=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.138.218.82" + ], + "ipsv6": [ + "2a03:1b20:1:f410::a17f" + ], + "country": "Sweden", + "city": "Malmö", + "hostname": "se17-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "dBAObjXtN11hAbyYZxw0m6NQw86ccnkY5O0YKSmq4lI=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.138.218.83" + ], + "ipsv6": [ + "2a03:1b20:1:f410::a18f" + ], + "country": "Sweden", + "city": "Malmö", + "hostname": "se18-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "fZFAcd8vqWOBpRqlXifsjzGf16gMTg2GuwKyZtkG6UU=" + }, + { + "vpn": "wireguard", + "ips": [ + "45.83.220.66" + ], + "ipsv6": [ + "2a03:1b20:1:e011::a19f" + ], + "country": "Sweden", + "city": "Malmö", + "hostname": "se19-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "oaIh0j5LHNtoBWeFKOa+l1QBt+fNu2rHN9ALubSakyg=" + }, + { + "vpn": "wireguard", + "ips": [ + "45.83.220.68" + ], + "ipsv6": [ + "2a03:1b20:1:e011::a21f" + ], + "country": "Sweden", + "city": "Malmö", + "hostname": "se21-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "7ncbaCb+9za3jnXlR95I6dJBkwL1ABB5i4ndFUesYxE=" + }, + { + "vpn": "wireguard", + "ips": [ + "45.83.220.70" + ], + "ipsv6": [ + "2a03:1b20:1:e011::a23f" + ], + "country": "Sweden", + "city": "Malmö", + "hostname": "se23-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "XscA5gebj51nmhAr6o+aUCnMHWGjbS1Gvvd0tuLRiFE=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.138.218.130" + ], + "ipsv6": [ + "2a03:1b20:1:f410:40::a04f" + ], + "country": "Sweden", + "city": "Malmö", + "hostname": "se4-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "m4jnogFbACz7LByjo++8z5+1WV0BuR1T7E1OWA+n8h0=" + }, + { + "vpn": "openvpn", "ips": [ "185.65.135.137" ], @@ -28797,6 +31559,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.138" ], @@ -28810,6 +31573,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.139" ], @@ -28823,6 +31587,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.140" ], @@ -28836,6 +31601,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.141" ], @@ -28849,6 +31615,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.143" ], @@ -28862,6 +31629,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.144" ], @@ -28875,6 +31643,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.145" ], @@ -28888,6 +31657,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.146" ], @@ -28901,6 +31671,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.147" ], @@ -28914,6 +31685,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.148" ], @@ -28927,6 +31699,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.149" ], @@ -28940,6 +31713,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.150" ], @@ -28953,6 +31727,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.151" ], @@ -28966,6 +31741,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.65.135.152" ], @@ -28979,6 +31755,142 @@ "owned": true }, { + "vpn": "wireguard", + "ips": [ + "185.65.135.70" + ], + "ipsv6": [ + "2a03:1b20:4:f011::a13f" + ], + "country": "Sweden", + "city": "Stockholm", + "hostname": "se13-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "615mnBGkvjZnD/vRbyL/6da7YhtctfB+jimN+wfV724=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.65.135.71" + ], + "ipsv6": [ + "2a03:1b20:4:f011::a14f" + ], + "country": "Sweden", + "city": "Stockholm", + "hostname": "se14-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "v02a3f1hdtTFD+bzStbGN6FxwOMAA/4d/yjNKoLTXFI=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.65.135.130" + ], + "ipsv6": [ + "2a03:1b20:4:f011::a02f" + ], + "country": "Sweden", + "city": "Stockholm", + "hostname": "se2-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "BfyxzL1mtigKIfM51OhxD+FBBSk+/SHEUE9UlDJ45W4=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.195.233.66" + ], + "ipsv6": [ + "2a03:1b20:4:f011::a26f" + ], + "country": "Sweden", + "city": "Stockholm", + "hostname": "se26-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "1493vtFUbIfSpQKRBki/1d0YgWIQwMV4AQAvGxjCNVM=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.195.233.67" + ], + "ipsv6": [ + "2a03:1b20:4:f011::a27f" + ], + "country": "Sweden", + "city": "Stockholm", + "hostname": "se27-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "3UPY4O7hJ31aEi9BVWbJTGKK5pjh9lBm++vquG34owo=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.195.233.68" + ], + "ipsv6": [ + "2a03:1b20:4:f011::a28f" + ], + "country": "Sweden", + "city": "Stockholm", + "hostname": "se28-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "V6RHmYEXDDXvCPZENmhwk5VEn6KgSseTFHw/IkXFzGg=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.65.135.222" + ], + "ipsv6": [ + "2a03:1b20:4:f011::a06f" + ], + "country": "Sweden", + "city": "Stockholm", + "hostname": "se6-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "pKcMMeC4jMUxSU5pH1orvp4//GrY8is+y9JRfVP3+BY=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.65.135.223" + ], + "ipsv6": [ + "2a03:1b20:4:f011::a07f" + ], + "country": "Sweden", + "city": "Stockholm", + "hostname": "se7-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "Io+BJ9lxGxi8jhvy95tqwudkzzy5zrvrf8KLxWRGs0w=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.65.135.224" + ], + "ipsv6": [ + "2a03:1b20:4:f011::a08f" + ], + "country": "Sweden", + "city": "Stockholm", + "hostname": "se8-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "CNn6UoRrPYQYUYt19fXJb75MI6a24Mgq/+OKAahfI0I=" + }, + { + "vpn": "openvpn", "ips": [ "193.32.127.81" ], @@ -28992,6 +31904,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.32.127.82" ], @@ -29005,6 +31918,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.32.127.83" ], @@ -29018,6 +31932,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "193.32.127.84" ], @@ -29031,6 +31946,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "179.43.128.170" ], @@ -29044,6 +31960,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "81.17.20.34" ], @@ -29057,6 +31974,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "91.193.4.2" ], @@ -29070,6 +31988,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "91.193.4.18" ], @@ -29083,6 +32002,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "91.193.4.34" ], @@ -29096,6 +32016,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "91.193.4.50" ], @@ -29109,6 +32030,217 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "91.193.4.82" + ], + "ipsv6": [ + "2001:ac8:28:88::a10f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch10-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "rDsfCGsgT2feNo8waMiSF5LiIqYe8GM2XYB0k0o9A2o=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.4.98" + ], + "ipsv6": [ + "2001:ac8:28:89::a11f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch11-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "M160brlgfeqrtrRrDNvUU7E9iytIrdpmLsTPDFBmGSI=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.4.114" + ], + "ipsv6": [ + "2001:ac8:28:90::a12f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch12-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "9lseA1xnIVPzTizHYEkcnfvAt7e9kW2D1k5dX05lak8=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.4.130" + ], + "ipsv6": [ + "2001:ac8:28:91::a13f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch13-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "68OCxVdQLk9wtE2Bcag2+Yo3X8jb+raKXxHdCUamaiM=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.4.146" + ], + "ipsv6": [ + "2001:ac8:28:92::a14f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch14-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "s+gmJDvPmOPJkCYaXE2qydVnnM5vvQsazGLxnVW/GQM=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.4.162" + ], + "ipsv6": [ + "2001:ac8:28:93::a15f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch15-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "jLddqPJjcG0nGagLsJwxGWWkKcS0GwQgiEZL7iX/n0E=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.4.178" + ], + "ipsv6": [ + "2001:ac8:28:94::a16f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch16-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "wGY+iakQnz4nJIPBf8X/ahRqB8qL5/GHxEvCw80Kjkc=" + }, + { + "vpn": "wireguard", + "ips": [ + "91.193.4.194" + ], + "ipsv6": [ + "2001:ac8:28:95::a17f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch17-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "4cr4WJxUbl5EqayrN2EecNROHjiXGkZKEProFeyaPWo=" + }, + { + "vpn": "wireguard", + "ips": [ + "31.7.59.250" + ], + "ipsv6": [ + "2a02:29b8:dc01:1641::a02f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch2-wireguard", + "isp": "PrivateLayer", + "owned": false, + "wgpubkey": "fOQ5qclvv7008dwWmz89B6Sf+Oh4IhTF+R+G+xB6HlM=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.127.66" + ], + "ipsv6": [ + "2a03:1b20:a:f011::a01f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch5-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "/iivwlyqWqxQ0BVWmJRhcXIFdJeo0WbHQ/hZwuXaN3g=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.127.67" + ], + "ipsv6": [ + "2a03:1b20:a:f011::a02f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch6-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "qcvI02LwBnTb7aFrOyZSWvg4kb7zNW9/+rS6alnWyFE=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.127.68" + ], + "ipsv6": [ + "2a03:1b20:a:f011::a03f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch7-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "5Ms10UxGjCSzwImTrvEjcygsWY8AfMIdYyRvgFuTqH8=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.127.69" + ], + "ipsv6": [ + "2a03:1b20:a:f011::a04f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch8-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "C3jAgPirUZG6sNYe4VuAgDEYunENUyG34X42y+SBngQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.32.127.70" + ], + "ipsv6": [ + "2a03:1b20:a:f011::a05f" + ], + "country": "Switzerland", + "city": "Zurich", + "hostname": "ch9-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "dV/aHhwG0fmp0XuvSvrdWjCtdyhPDDFiE/nuv/1xnRM=" + }, + { + "vpn": "openvpn", "ips": [ "141.98.252.131" ], @@ -29122,6 +32254,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.252.132" ], @@ -29135,6 +32268,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.252.133" ], @@ -29148,6 +32282,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.195.232.84" ], @@ -29161,6 +32296,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.195.232.85" ], @@ -29174,6 +32310,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.195.232.86" ], @@ -29187,6 +32324,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.252.138" ], @@ -29200,6 +32338,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "141.98.252.139" ], @@ -29213,6 +32352,7 @@ "owned": true }, { + "vpn": "openvpn", "ips": [ "185.200.118.178" ], @@ -29226,6 +32366,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "45.87.215.50" ], @@ -29239,6 +32380,247 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "185.195.232.66" + ], + "ipsv6": [ + "2a03:1b20:7:f011::a11f" + ], + "country": "UK", + "city": "London", + "hostname": "gb11-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "VZwE8hrpNzg6SMwn9LtEqonXzSWd5dkFk62PrNWFW3Y=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.195.232.67" + ], + "ipsv6": [ + "2a03:1b20:7:f011::a12f" + ], + "country": "UK", + "city": "London", + "hostname": "gb12-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "PLpO9ikFX1garSFaeUpo7XVSMrILrTB8D9ZwQt6Zgwk=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.195.232.68" + ], + "ipsv6": [ + "2a03:1b20:7:f011::a13f" + ], + "country": "UK", + "city": "London", + "hostname": "gb13-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "bG6WulLmMK408n719B8nQJNuTRyRA3Qjm7bsm9d6v2M=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.195.232.69" + ], + "ipsv6": [ + "2a03:1b20:7:f011::a14f" + ], + "country": "UK", + "city": "London", + "hostname": "gb14-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "INRhM0h4T1hi9j28pcC+vRv47bp7DIsNKtagaFZFSBI=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.195.232.70" + ], + "ipsv6": [ + "2a03:1b20:7:f011::a15f" + ], + "country": "UK", + "city": "London", + "hostname": "gb15-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "MVqe9e9aDwfFuvEhEn4Wd/zWV3cmiCX9fZMWetz+23A=" + }, + { + "vpn": "wireguard", + "ips": [ + "141.98.100.146" + ], + "ipsv6": [ + "2001:ac8:31:237::a16f" + ], + "country": "UK", + "city": "London", + "hostname": "gb16-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "OLqqtEra8OCMZ9mvI9attDHly+wFVU+j/g47GvgpDAY=" + }, + { + "vpn": "wireguard", + "ips": [ + "37.120.198.146" + ], + "ipsv6": [ + "2001:ac8:31:238::a17f" + ], + "country": "UK", + "city": "London", + "hostname": "gb17-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "9ERbjhPKAITbf5J8NPXlyrJeeBzAJ7TlxKVAV4Cf+iA=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.238.176.162" + ], + "ipsv6": [ + "2001:ac8:31:239::a18f" + ], + "country": "UK", + "city": "London", + "hostname": "gb18-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "ug9qzYOLA7WRR17XzmGSnYNnt4HficuJpFlXopaWOB8=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.238.176.178" + ], + "ipsv6": [ + "2001:ac8:31:23a::a19f" + ], + "country": "UK", + "city": "London", + "hostname": "gb19-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "rRfIbGqzAgcIivBVAu0oQgZUvCoQTLQDKC3I1l5ZUVA=" + }, + { + "vpn": "wireguard", + "ips": [ + "217.138.254.98" + ], + "ipsv6": [ + "2001:ac8:31:23b::a20f" + ], + "country": "UK", + "city": "London", + "hostname": "gb20-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Kt7nO9EG5CpRJ8ga56gnmcP4K/dr87xtpMOtpj1GtEs=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.248.85.3" + ], + "ipsv6": [ + "2a0b:89c1:3::a33f" + ], + "country": "UK", + "city": "London", + "hostname": "gb33-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "b71Y8V/vVwNRGkL4d1zvApDVL18u7m31dN+x+i5OJVs=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.248.85.18" + ], + "ipsv6": [ + "2a0b:89c1:3::a34f" + ], + "country": "UK", + "city": "London", + "hostname": "gb34-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "+iQWuT3wb2DCy1u2eUKovhJTCB4aUdJUnpxGtONDIVE=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.248.85.33" + ], + "ipsv6": [ + "2a0b:89c1:3::a35f" + ], + "country": "UK", + "city": "London", + "hostname": "gb35-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "G7XDQqevQOw1SVL7Iarn9PM+RvmI6H/CfkmahBYEG0g=" + }, + { + "vpn": "wireguard", + "ips": [ + "185.248.85.48" + ], + "ipsv6": [ + "2a0b:89c1:3::a36f" + ], + "country": "UK", + "city": "London", + "hostname": "gb36-wireguard", + "isp": "xtom", + "owned": false, + "wgpubkey": "tJVHqpfkV2Xgmd4YK60aoErSt6PmJKJjkggHNDfWwiU=" + }, + { + "vpn": "wireguard", + "ips": [ + "141.98.252.130" + ], + "ipsv6": [ + "2a03:1b20:7:f011::a01f" + ], + "country": "UK", + "city": "London", + "hostname": "gb4-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "IJJe0TQtuQOyemL4IZn6oHEsMKSPqOuLfD5HoAWEPTY=" + }, + { + "vpn": "wireguard", + "ips": [ + "141.98.252.222" + ], + "ipsv6": [ + "2a03:1b20:7:f011::a02f" + ], + "country": "UK", + "city": "London", + "hostname": "gb5-wireguard", + "isp": "31173", + "owned": true, + "wgpubkey": "J57ba81Q8bigy9RXBXvl0DgABTrbl81nb37GuX50gnY=" + }, + { + "vpn": "openvpn", "ips": [ "217.151.98.68" ], @@ -29252,6 +32634,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "37.120.159.164" ], @@ -29265,6 +32648,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "194.37.96.180" ], @@ -29278,6 +32662,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.238.132.36" ], @@ -29291,19 +32676,157 @@ "owned": false }, { + "vpn": "wireguard", "ips": [ - "104.129.24.242" + "185.206.227.130" ], "ipsv6": [ - "2607:fcd0:aa80:1300::2f" + "2001:ac8:21:ac::a22f" ], - "country": "USA", - "city": "Atlanta GA", - "hostname": "us-atl-002", - "isp": "Quadranet", - "owned": false + "country": "UK", + "city": "Manchester", + "hostname": "gb22-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "BDTfnJvtHlh15E54kLYHJlZBL5yXkEQlC0AtOyDXNRU=" }, { + "vpn": "wireguard", + "ips": [ + "194.37.96.98" + ], + "ipsv6": [ + "2001:ac8:21:ae::a24f" + ], + "country": "UK", + "city": "Manchester", + "hostname": "gb24-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "vWFuRUwBf6AtDtN8ZqygEgGrfDhoQ7s+FOPKcTwInU8=" + }, + { + "vpn": "wireguard", + "ips": [ + "81.92.205.18" + ], + "ipsv6": [ + "2001:ac8:21:af::a25f" + ], + "country": "UK", + "city": "Manchester", + "hostname": "gb25-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "HAsZqzSSc9sxOTfpV6PQg0ll8rRn0IzRNdyGL/Vq+X0=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.136.210" + ], + "ipsv6": [ + "2001:ac8:21:b5::a26f" + ], + "country": "UK", + "city": "Manchester", + "hostname": "gb26-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "oSsZE1FGG+KbUHCBgT84RkSOhkZfUBKLPcF9SNL9yCY=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.238.130.66" + ], + "ipsv6": [ + "2001:ac8:21:b6::a27f" + ], + "country": "UK", + "city": "Manchester", + "hostname": "gb27-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "MFY3o3SFgAsTRL0EVAfvFU0qxQ2GWLdtE1xTsk87w1U=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.37.96.114" + ], + "ipsv6": [ + "2001:ac8:21:b7::a28f" + ], + "country": "UK", + "city": "Manchester", + "hostname": "gb28-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "6cp7iV7x3DGcvcfL83VohcMu5BYaJOo9b1ffC/4L31Q=" + }, + { + "vpn": "wireguard", + "ips": [ + "81.92.206.2" + ], + "ipsv6": [ + "2001:ac8:21:b8::a29f" + ], + "country": "UK", + "city": "Manchester", + "hostname": "gb29-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "uaBPua4Tnbluy51WbNOahHx77RGJFGRr/MAqWFILJhI=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.37.96.130" + ], + "ipsv6": [ + "2001:ac8:21:b9::a30f" + ], + "country": "UK", + "city": "Manchester", + "hostname": "gb30-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "/XJ5QVlczjYpsYj7acmoXu+17PRkY68NYUx1jk7dvyY=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.238.143.226" + ], + "ipsv6": [ + "2001:ac8:21:ba::a31f" + ], + "country": "UK", + "city": "Manchester", + "hostname": "gb31-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "+tcSmB5oL9s+eIRl33hFKH+qAJVG9t42cfym7WzRMB0=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.37.96.146" + ], + "ipsv6": [ + "2001:ac8:21:bb::a32f" + ], + "country": "UK", + "city": "Manchester", + "hostname": "gb32-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "u/CMY/BfJDTQk6n7WXbhHvM7LUvHIqJRuzGk0V8y/U8=" + }, + { + "vpn": "openvpn", "ips": [ "66.115.180.226" ], @@ -29317,6 +32840,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "66.115.180.227" ], @@ -29330,6 +32854,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "66.115.180.228" ], @@ -29343,6 +32868,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "66.115.180.229" ], @@ -29356,6 +32882,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "66.115.180.230" ], @@ -29369,6 +32896,187 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "66.115.180.231" + ], + "ipsv6": [ + "2607:f7a0:1:d::b67f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us167-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "Qnb4cyMyHnrQlXUZ8YHh6UPYktfFaGeimjznPaZCpBY=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.180.232" + ], + "ipsv6": [ + "2607:f7a0:1:d::b68f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us168-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "pg4kotnWL9a3BahNti+vFBvficl1o4iZ/+t35pbsPgY=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.180.233" + ], + "ipsv6": [ + "2607:f7a0:1:d::b69f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us169-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "clLbW98O5wGCAf8E/H/uAW3n7orhY3bQO+cNxOCedzw=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.180.234" + ], + "ipsv6": [ + "2607:f7a0:1:d::b70f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us170-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "KOenblckGztqhbgUGFCagR8qDDtIX2/RIGRDmEBjxGM=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.180.235" + ], + "ipsv6": [ + "2607:f7a0:1:d::b71f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us171-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "UpNcVbTDbcOYfcGqDT52M2OR9RPI1HcQFrbXUPEIpT4=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.180.236" + ], + "ipsv6": [ + "2607:f7a0:1:d::b72f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us172-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "j2Bac2450sZJyeeBTo8YQkdIFiPwwx8PSPxqkXSDN34=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.180.237" + ], + "ipsv6": [ + "2607:f7a0:1:d::b73f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us173-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "o3YKd2Hn//+R8r0vdE2DMSgnLleARo8DvjMM7XjzFQw=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.180.238" + ], + "ipsv6": [ + "2607:f7a0:1:d::b74f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us174-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "XgXzdXuzqeMBlM3p56j6kogTPkKYXkBfIM5WkmjEXws=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.180.239" + ], + "ipsv6": [ + "2607:f7a0:1:d::b75f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us175-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "dVF4vhm2wGsfNjvX+5CsgTSPp70YjHbtYe+8uhWVzBA=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.180.240" + ], + "ipsv6": [ + "2607:f7a0:1:d::b76f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us176-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "Cx/hhbSGCLO3fwm8vU2c81CRziEU7pF8aEkAcPClG0A=" + }, + { + "vpn": "wireguard", + "ips": [ + "104.129.24.98" + ], + "ipsv6": [ + "2607:fcd0:aa80:1302::b33f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us233-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "yDcjCWN7PhjG8tra/2Y3SmXhwAsPhVa8hsiFBJqpyis=" + }, + { + "vpn": "wireguard", + "ips": [ + "104.129.24.114" + ], + "ipsv6": [ + "2607:fcd0:aa80:1303::b34f" + ], + "country": "USA", + "city": "Atlanta GA", + "hostname": "us234-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "CTObFSK15M3u1de40b2PNxN3em8h1lLtMrZxoS24gH4=" + }, + { + "vpn": "openvpn", "ips": [ "68.235.43.122" ], @@ -29382,6 +33090,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "68.235.43.10" ], @@ -29395,6 +33104,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "68.235.43.18" ], @@ -29408,6 +33118,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "68.235.43.26" ], @@ -29421,6 +33132,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "68.235.43.34" ], @@ -29434,6 +33146,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "68.235.43.42" ], @@ -29447,6 +33160,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "68.235.43.50" ], @@ -29460,6 +33174,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "68.235.43.58" ], @@ -29473,6 +33188,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "68.235.43.66" ], @@ -29486,6 +33202,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "68.235.43.74" ], @@ -29499,32 +33216,187 @@ "owned": false }, { + "vpn": "wireguard", "ips": [ - "104.129.31.26" + "68.235.43.130" ], "ipsv6": [ - "2607:fcd0:bb80:400::1f" + "2607:9000:0:67::b28f" ], "country": "USA", "city": "Chicago IL", - "hostname": "us-chi-101", - "isp": "Quadranet", - "owned": false + "hostname": "us128-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "6S4lS+ShQOI0BHMunSiuM++0gy+o+jtpHx9pbJ5XeFk=" }, { + "vpn": "wireguard", "ips": [ - "96.44.145.18" + "68.235.43.138" ], "ipsv6": [ - "2607:fcd0:da80:1800::8" + "2607:9000:0:68::b29f" ], "country": "USA", - "city": "Dallas TX", - "hostname": "us-dal-001", - "isp": "Quadranet", - "owned": false + "city": "Chicago IL", + "hostname": "us129-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "dr0ORuPoV9TYY6G5cM00cOoO72wfUC7Lmni7+Az9m0Y=" }, { + "vpn": "wireguard", + "ips": [ + "68.235.43.146" + ], + "ipsv6": [ + "2607:9000:0:69::b30f" + ], + "country": "USA", + "city": "Chicago IL", + "hostname": "us130-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "VY5Dos3WeCyI1Jb8Z+KhB4YlEKZmrQeSNcP0WCrzk2I=" + }, + { + "vpn": "wireguard", + "ips": [ + "68.235.43.154" + ], + "ipsv6": [ + "2607:9000:0:70::b31f" + ], + "country": "USA", + "city": "Chicago IL", + "hostname": "us131-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "Na8m5Z3O6kwtLFPsign+JPlLoFm/Q3eBdIMI08psSzg=" + }, + { + "vpn": "wireguard", + "ips": [ + "68.235.43.162" + ], + "ipsv6": [ + "2607:9000:0:71::b32f" + ], + "country": "USA", + "city": "Chicago IL", + "hostname": "us132-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "X50kEMmdPc50SYWFaDFNOAMzUYnCZv3rxzw2Y6BqOyk=" + }, + { + "vpn": "wireguard", + "ips": [ + "68.235.43.170" + ], + "ipsv6": [ + "2607:9000:0:72::b33f" + ], + "country": "USA", + "city": "Chicago IL", + "hostname": "us133-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "01KgzQY+pT7Q+GPUa1ijj0YgdN5owMaK9ViRZO4dIWo=" + }, + { + "vpn": "wireguard", + "ips": [ + "68.235.43.90" + ], + "ipsv6": [ + "2607:9000:0:61::a02f" + ], + "country": "USA", + "city": "Chicago IL", + "hostname": "us18-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "J7kRI51rpEiFy3HMxXS6azAhvdOqAbvLKwiDI8SyKU0=" + }, + { + "vpn": "wireguard", + "ips": [ + "68.235.43.98" + ], + "ipsv6": [ + "2607:9000:0:62::a03f" + ], + "country": "USA", + "city": "Chicago IL", + "hostname": "us22-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "cyFIfgkdN/teublULKmhQj5+dJnhsGcLyRiWxjQscW4=" + }, + { + "vpn": "wireguard", + "ips": [ + "68.235.43.106" + ], + "ipsv6": [ + "2607:9000:0:63::a04f" + ], + "country": "USA", + "city": "Chicago IL", + "hostname": "us23-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "tAThJW853lY/JTNqU6zcBtYk8PxM93P2DqQFWfs1Z3M=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.63.167.98" + ], + "ipsv6": [ + "2607:fcd0:bb80:402::b31f" + ], + "country": "USA", + "city": "Chicago IL", + "hostname": "us231-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "tZzQt3tfqG+yZlvbcqPuUtwM23mKiI7ncNnKV8/+7xM=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.63.167.114" + ], + "ipsv6": [ + "2607:fcd0:bb80:403::b32f" + ], + "country": "USA", + "city": "Chicago IL", + "hostname": "us232-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "Ou6ayqTmV9H8rf2waNbaJKsGCRy4NjcvCZjgJPvtx0Y=" + }, + { + "vpn": "wireguard", + "ips": [ + "68.235.43.82" + ], + "ipsv6": [ + "2607:9000:0:60::a01f" + ], + "country": "USA", + "city": "Chicago IL", + "hostname": "us4-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "9BIWByBn70uCB9qVj9Vf02yzar4RJQjgHyVpo+yLk2c=" + }, + { + "vpn": "openvpn", "ips": [ "174.127.113.4" ], @@ -29538,6 +33410,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "174.127.113.5" ], @@ -29551,6 +33424,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "174.127.113.6" ], @@ -29564,6 +33438,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "174.127.113.7" ], @@ -29577,6 +33452,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "193.27.13.178" ], @@ -29590,6 +33466,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "193.27.13.34" ], @@ -29603,6 +33480,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "193.27.13.50" ], @@ -29616,6 +33494,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "193.27.13.66" ], @@ -29629,6 +33508,397 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "193.27.13.98" + ], + "ipsv6": [ + "2001:ac8:9a:5::b43f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us143-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "ys1/HwvP8ajGFVUooMA4CjE11QGqZUCdcO0uw7pxm3c=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.13.114" + ], + "ipsv6": [ + "2001:ac8:9a:6::b44f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us144-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "oLDrbdUAs51AAA9TjFnSvmmfV85dp2ZWFqr29P2HxzM=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.13.130" + ], + "ipsv6": [ + "2001:ac8:9a:7::b45f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us145-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "MXSRliYAgPs3/BKO0pxLCDz4wTCQ4cafj02J1LriBj4=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.13.146" + ], + "ipsv6": [ + "2001:ac8:9a:8::b46f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us146-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Dp5YVZ7Zxa/PM5fIXa1RA9vdz8hB/IaI5H7cSP7ByFk=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.13.162" + ], + "ipsv6": [ + "2001:ac8:9a:9::b47f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us147-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Q/slQ6Agjqp6iNvfbTGyz7CXv/LgsK4XnJil7UE60ng=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.13.194" + ], + "ipsv6": [ + "2001:ac8:9a:11::b48f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us148-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "yK1wfMTkMbksuR7+rlEbkq6mk5wsdyIJYSD9fB/htnA=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.13.210" + ], + "ipsv6": [ + "2001:ac8:9a:12::b49f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us149-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "vh34NFVrwEKbmX+Rqy5xKyQ81unOWLb0DpYXSGHLxyk=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.13.226" + ], + "ipsv6": [ + "2001:ac8:9a:13::b50f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us150-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "bigXstWXYiY7BznqpvHr40hyhcAXCyDsajLJ+HxRTk8=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.13.242" + ], + "ipsv6": [ + "2001:ac8:9a:14::b51f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us151-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "RRQAnqeXwqxhltKBEFWdg9nwoPraRMvr7LIE91kg+zg=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.110.112.2" + ], + "ipsv6": [ + "2001:ac8:9a:15::b52f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us152-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "fymKfaPctNpWCfC4xGl9UjZQ4bvEXT6GTK1+7DtVYBk=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.110.112.18" + ], + "ipsv6": [ + "2001:ac8:9a:16::b53f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us153-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "GYU0qZ/in7Bw9mxgQw1z5hAuTbXF8Tt8rGyAD7rA0Ho=" + }, + { + "vpn": "wireguard", + "ips": [ + "194.110.112.34" + ], + "ipsv6": [ + "2001:ac8:9a:17::b54f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us154-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "AFmZ9bQhiP4yCbAddJTpxbzF/IWlNgjrzN0OqqCE6A8=" + }, + { + "vpn": "wireguard", + "ips": [ + "50.2.184.146" + ], + "ipsv6": [ + "2607:ff28:800f:10::a02f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us17-wireguard", + "isp": "Serverhub", + "owned": false, + "wgpubkey": "XihrmIgj3/yCGr/NW0wNJm9haS3FQl6p5MvSB8mWdjc=" + }, + { + "vpn": "wireguard", + "ips": [ + "96.44.191.130" + ], + "ipsv6": [ + "2607:fcd0:da80:1803::b35f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us235-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "/eAFrbWF72bLtQC0u0p8q/NXYq6dwrst4ZXuSx9HXHE=" + }, + { + "vpn": "wireguard", + "ips": [ + "96.44.191.146" + ], + "ipsv6": [ + "2607:fcd0:da80:1804::b36f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us236-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "H7CKyeh+CpwMJyeY5s203PUEYqqTiZyp7ukdfczWKj8=" + }, + { + "vpn": "wireguard", + "ips": [ + "96.44.189.98" + ], + "ipsv6": [ + "2607:fcd0:da80:1801::c40f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us240-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "VVf5qgLmmhs+7pLYq1cpKDx4SoaR9/tDK8tIWeFHtXc=" + }, + { + "vpn": "wireguard", + "ips": [ + "174.127.113.8" + ], + "ipsv6": [ + "2606:2e00:8007:1::a30f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us30-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "RW+wwTv4BqRNbHPZFcIwl74f9kuRQlFLxnaocpMyKgw=" + }, + { + "vpn": "wireguard", + "ips": [ + "174.127.113.9" + ], + "ipsv6": [ + "2606:2e00:8007:1::a31f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us31-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "jByGGMuJ53aax6Kvo5CTL7Bz2e9ZglFgHbC6IOoux2o=" + }, + { + "vpn": "wireguard", + "ips": [ + "174.127.113.10" + ], + "ipsv6": [ + "2606:2e00:8007:1::a32f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us32-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "jHxY2OKpxjqAwWH4r1Pb2K6xDUDt087ivxpM1KpE0Ec=" + }, + { + "vpn": "wireguard", + "ips": [ + "174.127.113.11" + ], + "ipsv6": [ + "2606:2e00:8007:1::a33f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us33-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "d0QX/luq22c8W+SEeegfI02NL1gCg7F6HSZFiDZK4k8=" + }, + { + "vpn": "wireguard", + "ips": [ + "174.127.113.12" + ], + "ipsv6": [ + "2606:2e00:8007:1::a34f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us34-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "GCfWfE0241Hj8oSZIDQzk9VsLVC5VQ3MgFAEdhepNyA=" + }, + { + "vpn": "wireguard", + "ips": [ + "174.127.113.13" + ], + "ipsv6": [ + "2606:2e00:8007:1::a35f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us35-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "sUve70TE2F3AaSGRPjN5aYr4um9OlKlIbnDw/2Ab8xg=" + }, + { + "vpn": "wireguard", + "ips": [ + "174.127.113.14" + ], + "ipsv6": [ + "2606:2e00:8007:1::a36f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us36-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "fb9f0n73/qk9wvQQ9ufo7EZmeIH9bxmjETLdetuMyz8=" + }, + { + "vpn": "wireguard", + "ips": [ + "174.127.113.15" + ], + "ipsv6": [ + "2606:2e00:8007:1::a37f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us37-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "smo7KmPLfKStrAlIwU5Vmr2aCD/UNUfR6LrUAraY3jY=" + }, + { + "vpn": "wireguard", + "ips": [ + "174.127.113.16" + ], + "ipsv6": [ + "2606:2e00:8007:1::a38f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us38-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "EWuW/w7GpnxKdl0sr+dfxJ3DTxjMN6JWs/GR6OIzgB4=" + }, + { + "vpn": "wireguard", + "ips": [ + "174.127.113.17" + ], + "ipsv6": [ + "2606:2e00:8007:1::a39f" + ], + "country": "USA", + "city": "Dallas TX", + "hostname": "us39-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "fjO/un6d9DFtxjhwbe8cMohORIgbPFN0WgLw/LdHoRg=" + }, + { + "vpn": "openvpn", "ips": [ "198.54.128.74" ], @@ -29642,6 +33912,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.128.106" ], @@ -29655,6 +33926,112 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "198.54.128.82" + ], + "ipsv6": [ + "2607:9000:2000:19::a10f" + ], + "country": "USA", + "city": "Denver CO", + "hostname": "us10-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "dEtwYUFPV0pF7MWJpzo+AixB2CdEIXxBQcQg1ljQkVo=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.128.90" + ], + "ipsv6": [ + "2607:9000:2000:20::a11f" + ], + "country": "USA", + "city": "Denver CO", + "hostname": "us11-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "/oMM8Z3svzY5wteCZPL111XjfaJvek/8s+PkUmvDIHs=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.128.98" + ], + "ipsv6": [ + "2607:9000:2000:25::a12f" + ], + "country": "USA", + "city": "Denver CO", + "hostname": "us12-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "fBVnH5KCfh1tCYzRlMusbUDLK1IswpE984JCLY3jQCA=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.128.58" + ], + "ipsv6": [ + "2607:9000:2000:16::a44f" + ], + "country": "USA", + "city": "Denver CO", + "hostname": "us44-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "Cbcd0TNfEsI45BFzJO8mK9uF2mjGSiXPfF+EwOQSy0Y=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.128.50" + ], + "ipsv6": [ + "2607:9000:2000:15::a45f" + ], + "country": "USA", + "city": "Denver CO", + "hostname": "us45-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "9xreD+7LFgwE74vlpqDOqJzXg5BCCi7Qk4QiAzAMyXs=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.128.42" + ], + "ipsv6": [ + "2607:9000:2000:14::a46f" + ], + "country": "USA", + "city": "Denver CO", + "hostname": "us46-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "49D0pBK50sOxNXURjkoAQHZYDGmhGXWcSx9y7p7BWyU=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.128.34" + ], + "ipsv6": [ + "2607:9000:2000:13::a47f" + ], + "country": "USA", + "city": "Denver CO", + "hostname": "us47-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "Hp5qr3VmbPdD6vV8N1RPxasaES6RxRkMAnPr30bUdlw=" + }, + { + "vpn": "openvpn", "ips": [ "89.46.114.28" ], @@ -29668,6 +34045,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.41" ], @@ -29681,6 +34059,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.54" ], @@ -29694,6 +34073,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.67" ], @@ -29707,6 +34087,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.80" ], @@ -29720,6 +34101,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.93" ], @@ -29733,6 +34115,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.106" ], @@ -29746,6 +34129,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.119" ], @@ -29759,6 +34143,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.132" ], @@ -29772,6 +34157,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.145" ], @@ -29785,6 +34171,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.158" ], @@ -29798,6 +34185,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.171" ], @@ -29811,6 +34199,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.184" ], @@ -29824,6 +34213,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.114.197" ], @@ -29837,6 +34227,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.129.82" ], @@ -29850,6 +34241,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.129.74" ], @@ -29863,6 +34255,412 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "204.152.216.98" + ], + "ipsv6": [ + "2607:fcd0:100:7c01::b29f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us229-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "7cwtRG3gRwDSxLjqD1XAyE1X4TKHZeaSgS+TU3yg4AE=" + }, + { + "vpn": "wireguard", + "ips": [ + "204.152.216.114" + ], + "ipsv6": [ + "2607:fcd0:100:7c02::b30f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us230-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "1zHPMv8F6LCvud0WcSfsWFqDKGoW5uXxrVMgMftNYmw=" + }, + { + "vpn": "wireguard", + "ips": [ + "204.152.215.242" + ], + "ipsv6": [ + "2607:fcd0:100:7c03::c39f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us239-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "JQm2SMisUZtMvaS9dC9Jfrbs0CUizWPKhHiiykJnsDs=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.129.66" + ], + "ipsv6": [ + "2607:9000:3000:16::a48f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us48-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "MC86xeCKt9p7wmeRVzP5uW1wMHMQQ6C3zcIj0GHRH0U=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.129.58" + ], + "ipsv6": [ + "2607:9000:3000:15::a49f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us49-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "MyHeQad1Ls+uDIo1sQh1wJi0HnkNcB93/UDhCvJgSQY=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.129.50" + ], + "ipsv6": [ + "2607:9000:3000:14::a50f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us50-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "Wamqk6xVi4JyGOoVfupt+yZzwlw+D1AuCqaeJ5BEJA0=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.129.42" + ], + "ipsv6": [ + "2607:9000:3000:13::a51f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us51-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "tuUArWyYDE785bvmkAwjWkxTZYa5ga+33m8GEfsolQU=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.46.114.236" + ], + "ipsv6": [ + "2a0d:5600:8:f::a52f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us52-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "0iaEZviiUACDQ9fijhXPPIgZr7HxgYzwuW/KDg0jZDQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.2" + ], + "ipsv6": [ + "2a0d:5600:8:f::a53f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us53-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "3CkVF922uY4xAZBfgRQq3U1mwr24uJlXxvLc3gsHgwA=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.15" + ], + "ipsv6": [ + "2a0d:5600:8:f::a54f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us54-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "dYmbNr7Dp4m0u5RQMcNAJrzE6nch8LQZYKX+s2dMnjs=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.28" + ], + "ipsv6": [ + "2a0d:5600:8:1e::a55f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us55-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "UdS9GBs0EtvPe+P51SacTRqpj/2PLtiI82510Zz6cTA=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.41" + ], + "ipsv6": [ + "2a0d:5600:8:1e::a56f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us56-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "hbVECYaoa1t5FuiM5S1uTGVaGadYDfre478Oh9Crkyc=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.54" + ], + "ipsv6": [ + "2a0d:5600:8:1e::a57f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us57-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "xUBnJ4rQNo8zrbGlFLnFogi/ZQKKNjXJD3Kz/YPCDD4=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.67" + ], + "ipsv6": [ + "2a0d:5600:8:1f::a58f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us58-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "t5jurRQzlV1JL8y6w0wyLdG4S9p2ice/VQ1YqghE2RY=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.80" + ], + "ipsv6": [ + "2a0d:5600:8:1f::a59f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us59-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "hbZzut9clpSR1ryMFcsX53Flq8vccXqG4FoHFnb3EDQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.93" + ], + "ipsv6": [ + "2a0d:5600:8:21::a60f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us60-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "/NKEAnIB2uTUG7K0bvb+zd6HPqay1tzz0cNrv8nngRQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.106" + ], + "ipsv6": [ + "2a0d:5600:8:21::a61f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us61-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "PEIvhnDtxI7hrvAO/QXoeiO/u2w9SI8s3a0ahZ12CBs=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.119" + ], + "ipsv6": [ + "2a0d:5600:8:21::a62f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us62-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "yuITCrm6C98a6uhpYz9njQr0cqghADkrJvw/Me8dlS4=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.132" + ], + "ipsv6": [ + "2a0d:5600:8:28::a63f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us63-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "eLJO1DIrQ1wI4NCVbsBzAKMi8T0D3I5feYLXjdgRpTc=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.145" + ], + "ipsv6": [ + "2a0d:5600:8:28::a64f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us64-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "J/ho14X87UdfahnH6m+StgazV92je4HiUQ3je6j+W2E=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.158" + ], + "ipsv6": [ + "2a0d:5600:8:28::a65f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us65-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "cHI6R/6RHJlyLZYzRw2HRNJwtgmuBRDRP5Dbwaws3zo=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.171" + ], + "ipsv6": [ + "2a0d:5600:8:29::a66f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us66-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "bGQd5D0DEfTNPkU5yYY7tZ4nr0AgdPX87krGv1cm4yQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.184" + ], + "ipsv6": [ + "2a0d:5600:8:29::a67f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us67-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "jzimocgM4cWW3V+WN5uc8mxO5k97vAwbuGalz4s12U4=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.197" + ], + "ipsv6": [ + "2a0d:5600:8:29::a68f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us68-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "TyZ5tCLvOyHbiNYiySZ4h4Mcyt1BLnGy5MXaaggKvVU=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.210" + ], + "ipsv6": [ + "2a0d:5600:8:3f::a69f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us69-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "bVRtvE1WQQmAjnC1BybSXz2r9VHLp9DKwsEZ3UzELjg=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.223" + ], + "ipsv6": [ + "2a0d:5600:8:3f::a70f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us70-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "mQOWxQ1I5KlZh+f1g3C870r32TmDj3eGAsb5s+K75Gw=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.90.236" + ], + "ipsv6": [ + "2a0d:5600:8:3f::a71f" + ], + "country": "USA", + "city": "Los Angeles CA", + "hostname": "us71-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "my8fkG14VylzBgeyctdppk9eMc+o5gZBpkJHbYmq7RQ=" + }, + { + "vpn": "openvpn", "ips": [ "193.27.12.18" ], @@ -29876,6 +34674,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "193.27.12.2" ], @@ -29889,6 +34688,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "94.198.42.50" ], @@ -29902,6 +34702,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "94.198.42.66" ], @@ -29915,6 +34716,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "94.198.42.82" ], @@ -29928,6 +34730,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "94.198.42.98" ], @@ -29941,6 +34744,217 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "94.198.42.114" + ], + "ipsv6": [ + "2a0d:5600:6:37::b55f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us155-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "c2ifgyT1M41zbFEaSCbeLY033u/RurG5eJKYHZOMrBE=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.42.130" + ], + "ipsv6": [ + "2a0d:5600:6:38::b56f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us156-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "GMBXSH/CBSxkz1TptnYTwQO/ilEXherAicOaD/O/p0c=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.42.146" + ], + "ipsv6": [ + "2a0d:5600:6:39::b57f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us157-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "EhxJ+GqKZq3CCU4cd15A7TelT2ejWvsJuNI8NqCB+io=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.42.162" + ], + "ipsv6": [ + "2a0d:5600:6:40::b58f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us158-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "sMDULNyxlCjepgfB83cw2fYQIYT96jnrs22mtYevfCE=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.42.178" + ], + "ipsv6": [ + "2a0d:5600:6:41::b59f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us159-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Xottq8FZOISCWMfJNapyVEA3dvKpmZ00L6wPeljGOWc=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.42.194" + ], + "ipsv6": [ + "2a0d:5600:6:42::b60f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us160-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "jxKlvTobgX32KYjSuLYb1Fm7gU1skslm3DatfxQCOl4=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.42.210" + ], + "ipsv6": [ + "2a0d:5600:6:43::b61f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us161-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "SYM77EPyWfOIK9CSJyuZ4mnGf17NLmj1i8VhWRbgPCs=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.42.226" + ], + "ipsv6": [ + "2a0d:5600:6:44::b62f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us162-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "VM0nmizpRkwPOKmIzgBGm0fbfZfMkZa6q/YvUtWz8V4=" + }, + { + "vpn": "wireguard", + "ips": [ + "94.198.42.242" + ], + "ipsv6": [ + "2a0d:5600:6:45::b63f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us163-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "CIPpa9aYSN+KdwdLpIOxBP0egzdUFzDGUAmwzGZGoGY=" + }, + { + "vpn": "wireguard", + "ips": [ + "193.27.12.146" + ], + "ipsv6": [ + "2a0d:5600:6:46::b64f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us164-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "iUpEL5CW9iTVR+NPWnd4DUAD5YaT6x1fKJl8uCa/xhE=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.38.227.210" + ], + "ipsv6": [ + "2a0d:5600:6:47::b65f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us165-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "AhxM2YMzknN6/yeIsNluflHQYyGPVHX+RAztHHzwek0=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.38.227.226" + ], + "ipsv6": [ + "2a0d:5600:6:48::b66f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us166-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "6n/1JcWj8udnJkPvrbpbY6sp6v/HPHSXsVNaTxZ3A0E=" + }, + { + "vpn": "wireguard", + "ips": [ + "96.47.237.2" + ], + "ipsv6": [ + "2607:ff48:aa81:2602::b25f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us225-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "6q3NHk1BBbh70HkONto2l4kCVY7z2KPi0Ysgb+ukKTg=" + }, + { + "vpn": "wireguard", + "ips": [ + "96.47.237.18" + ], + "ipsv6": [ + "2607:ff48:aa81:2603::b26f" + ], + "country": "USA", + "city": "Miami FL", + "hostname": "us226-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "ptTRC3Nk3DFXlh6987CMwTGOAQyk00Ki7fs+aPmHFEs=" + }, + { + "vpn": "openvpn", "ips": [ "107.182.226.206" ], @@ -29954,6 +34968,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "107.182.226.218" ], @@ -29967,6 +34982,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.62.15" ], @@ -29980,6 +34996,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.62.28" ], @@ -29993,6 +35010,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.62.41" ], @@ -30006,6 +35024,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.62.54" ], @@ -30019,6 +35038,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.62.67" ], @@ -30032,6 +35052,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.62.80" ], @@ -30045,6 +35066,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.62.93" ], @@ -30058,6 +35080,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.62.106" ], @@ -30071,6 +35094,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "89.46.62.119" ], @@ -30084,6 +35108,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "86.106.121.15" ], @@ -30097,6 +35122,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "86.106.121.28" ], @@ -30110,6 +35136,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "86.106.121.41" ], @@ -30123,6 +35150,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "86.106.121.54" ], @@ -30136,6 +35164,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "86.106.121.67" ], @@ -30149,6 +35178,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "86.106.121.80" ], @@ -30162,6 +35192,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "86.106.121.93" ], @@ -30175,6 +35206,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "86.106.121.106" ], @@ -30188,6 +35220,817 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "86.106.121.158" + ], + "ipsv6": [ + "2a0d:5600:24:aa5::b01f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us101-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "iuFDwOiNNnWfTmtprPCLscUjonu+KKfXu39TL/SSzh4=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.121.171" + ], + "ipsv6": [ + "2a0d:5600:24:aa6::b02f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us102-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "w/wxejfsFw2YFSYohzUB+Avtw0nW9RAkQjQyLExcfB0=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.121.184" + ], + "ipsv6": [ + "2a0d:5600:24:aa7::b03f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us103-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "dl5Xf/oCHVDVnzzb5i1/NyAct191DT5qqRtOAJZpOlw=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.121.197" + ], + "ipsv6": [ + "2a0d:5600:24:aa8::b04f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us104-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "7gzFk0q3W/GOUhBRQ/CVaUfYUw4jnH4o83+Q7mRPRFY=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.121.210" + ], + "ipsv6": [ + "2a0d:5600:24:aa9::b05f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us105-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "f2C9CzsFx3nJii34l7i7pXMdpzp9cHEpkCZ3es+S+V4=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.121.223" + ], + "ipsv6": [ + "2a0d:5600:24:aaa::b06f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us106-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "vyMlF2Un/Fr1hJC3iYYvyaq1oaVMziCNAhZYkSjbylM=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.121.236" + ], + "ipsv6": [ + "2a0d:5600:24:aab::b07f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us107-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "EZGBydcOeP/lS3jXfkVohMG78z9qUx4SqLFQVMONSSM=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.121.249" + ], + "ipsv6": [ + "2a0d:5600:24:aac::b08f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us108-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "Sq5u3QIxgLGvoo9sCv5revDYTNKcGFzmeip4DnKcpCE=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.15" + ], + "ipsv6": [ + "2a0d:5600:24:aae::b10f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us110-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "tT4SYF5SX0U9nVjC/9HWIqrvixReJCgkqawvk2CJiW8=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.28" + ], + "ipsv6": [ + "2a0d:5600:24:aaf::b11f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us111-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "r03nZ+5rVtqatadUs783W1LU6WInJlpbjW3r8E2MPzo=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.41" + ], + "ipsv6": [ + "2a0d:5600:24:ab1::b12f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us112-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "K2chJLdNAgSOLlBXA3aHDwKxxpPaqcgp6XGN8yRYPl8=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.54" + ], + "ipsv6": [ + "2a0d:5600:24:ab2::b13f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us113-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "IJ4cae+w9SuGUmYbkH1jwnTCQ6bbphUG2cM1UpP96Ek=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.67" + ], + "ipsv6": [ + "2a0d:5600:24:ab3::b14f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us114-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "OjMVxFNSRjZC5dwCU+hK6oEGOF9rZBE3GbJ7Y1CkFmM=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.80" + ], + "ipsv6": [ + "2a0d:5600:24:ab4::b15f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us115-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "HfvVMtGke52M9yqqQvuIEwd0NxXAfe0ZqgHLPqT9ShE=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.93" + ], + "ipsv6": [ + "2a0d:5600:24:ab5::b16f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us116-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "sIB3ajbcYSGYby0JJO7l8zjZMm/FbqHZh620Ln4spTQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.106" + ], + "ipsv6": [ + "2a0d:5600:24:ab6::b17f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us117-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "gW5zLgLNCtypRmHfeSIHN5j1SS7ymoUqjt7YBhVWZkg=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.119" + ], + "ipsv6": [ + "2a0d:5600:24:ab7::b18f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us118-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "jaJS7IFuOco51K89tEkrabi80CC4gOdf+1y8NjWFw30=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.132" + ], + "ipsv6": [ + "2a0d:5600:24:ab8::b19f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us119-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "3akIB2iC31EHstfYVYILp6l6kavjnZ8a66xAxujHNF4=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.145" + ], + "ipsv6": [ + "2a0d:5600:24:ab9::b20f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us120-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "WNAKxc1A0oHd2CwxBhsbErLYxIau28YuRp9f3QUtUkA=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.158" + ], + "ipsv6": [ + "2a0d:5600:24:aba::b21f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us121-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "hbLv5Ec+ebWkLfpMkrfQi3yBZt+QtzUM73A21/KsXDk=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.171" + ], + "ipsv6": [ + "2a0d:5600:24:abb::b22f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us122-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "xGN1FCQVDNywOx6124UCdh2Us1iBu/2FzVNhVOjJMj4=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.184" + ], + "ipsv6": [ + "2a0d:5600:24:abc::b23f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us123-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "btzdd6JSFFCnkmCd49zXWrIDEo1wZvxLSfqvF2eilX0=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.197" + ], + "ipsv6": [ + "2a0d:5600:24:abd::b24f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us124-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "PHYy+c8lDKwU1A2LYw6mZKXOuxR2+6DPrBv4hd9auSA=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.210" + ], + "ipsv6": [ + "2a0d:5600:24:abe::b25f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us125-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "J8QaV8tZyFBrb9atVg3mI2Vb3/DtWVJSHFYSrdy6w2w=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.223" + ], + "ipsv6": [ + "2a0d:5600:24:abf::b26f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us126-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "gBNBBb4vgJG4NX0/nCs8bdkVshQGadVA8YTHr+0+aFo=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.45.224.236" + ], + "ipsv6": [ + "2a0d:5600:24:ac1::b27f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us127-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "aUn8FOe9q2LSm41mi9b4VXTIOISaDT4hfUqDnzk4Jk0=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.46.62.145" + ], + "ipsv6": [ + "2a0d:5600:24:a7b::a72f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us72-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "+/HYwELAaww6XTtPmvf3Hr8NqLIr69YNUpAMBvWJiGw=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.46.62.158" + ], + "ipsv6": [ + "2a0d:5600:24:a7c::a73f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us73-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "34rw+ei9qLjTOTOHCoz/3pG4XaMfmuRwYajuG/7Tsyc=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.46.62.171" + ], + "ipsv6": [ + "2a0d:5600:24:a7d::a74f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us74-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "3KoxhZNXXuXnVt0T7Ka4XnSbIRTZnh+DFq+eI05yVHo=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.46.62.184" + ], + "ipsv6": [ + "2a0d:5600:24:a7e::a75f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us75-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "U06dpwDLyRfe+H0p80SjrdlKEVraqEsHFsAVUd/Chls=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.46.62.197" + ], + "ipsv6": [ + "2a0d:5600:24:a7f::a76f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us76-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "cVDIYPzNChIeANp+0jE12kWM5Ga1MbmNErT1Pmaf12A=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.46.62.210" + ], + "ipsv6": [ + "2a0d:5600:24:a80::a77f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us77-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "mqSfg28JSJwUuqvOBKbCwPp2E7zgNi46kuxKj5FzDUY=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.46.62.223" + ], + "ipsv6": [ + "2a0d:5600:24:a81::a78f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us78-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "9BXmWC1UkQMnzS71WXVxfBW5O+AIFTXRCx31SpCvhSg=" + }, + { + "vpn": "wireguard", + "ips": [ + "89.46.62.236" + ], + "ipsv6": [ + "2a0d:5600:24:a82::a79f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us79-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "oofWbWXoLbEzmnsQX6ZYdgYNzSjkBg58zpAdIBUlUAk=" + }, + { + "vpn": "wireguard", + "ips": [ + "83.143.246.98" + ], + "ipsv6": [ + "2a0d:5600:24:a83::a80f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us80-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "t/VsxDKzPfh3H3XG3ckVr1e8sJ3PuuD0YxdfFtyKjRM=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.2" + ], + "ipsv6": [ + "2a0d:5600:24:a84::a81f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us81-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "kxS/gAMkGwpR/F7J4L0JCjZEzR+rq0i2lqK6wWnZLAE=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.15" + ], + "ipsv6": [ + "2a0d:5600:24:a85::a82f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us82-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "qS+FVzRxR0VXljM2aguVXLq494VRuS5sqcE3/DscJRU=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.28" + ], + "ipsv6": [ + "2a0d:5600:24:a86::a83f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us83-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "7TLCd9zMWxlB2geyeaMDVRJsdPtTvXEApADfoCA3zCY=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.41" + ], + "ipsv6": [ + "2a0d:5600:24:a87::a84f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us84-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "rFV47I3lu0zlLqJBfV+0Zq8Kt8ytnFVWA02lOq5IyFw=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.54" + ], + "ipsv6": [ + "2a0d:5600:24:a88::a85f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us85-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "9iNdLMieZ5V2Hv4Dmm4xFqMAbtjnBReEe4iy8A5WRHo=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.67" + ], + "ipsv6": [ + "2a0d:5600:24:a89::a86f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us86-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "5FXy0/tMXj/TYKVj9PHJ42lCpbWP4qLAOpLZa6FnsRw=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.80" + ], + "ipsv6": [ + "2a0d:5600:24:a8a::a87f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us87-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "QRp4cLDKwbJbondYIi0mPlGmBxI8NV5geXBy4EdKhEM=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.93" + ], + "ipsv6": [ + "2a0d:5600:24:a8b::a88f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us88-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "ru9aQRxYBkK5pWvNkdFlCR8VMPSqcEENBPGkIGEN0XU=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.106" + ], + "ipsv6": [ + "2a0d:5600:24:a8c::a89f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us89-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "u5NkFaOlhZX9AtjBVb4hTYqwgmTToernOrCc2D7B7hk=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.119" + ], + "ipsv6": [ + "2a0d:5600:24:a8d::a90f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us90-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "UwNBR7xJgc+R383zl2Eas2HzSC3hOFY5zDsfHRGSlgg=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.132" + ], + "ipsv6": [ + "2a0d:5600:24:a8e::a91f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us91-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "bOOP5lIjqCdDx5t+mP/kEcSbHS4cZqE0rMlBI178lyY=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.145" + ], + "ipsv6": [ + "2a0d:5600:24:a8f::a92f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us92-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "JQo2XN042FQbMrpvRMpEoA+CpqhRESeSWjkNB+k41Ds=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.158" + ], + "ipsv6": [ + "2a0d:5600:24:a90::a93f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us93-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "g7+2YdOdlhe24m7B9lizdUBFCYw+bJ1CWFd9eVt7+XA=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.171" + ], + "ipsv6": [ + "2a0d:5600:24:a91::a94f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us94-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "oKKbNl27XkJvtyQx8ikzH0heoFJ+INjQeg4JzasBWTA=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.184" + ], + "ipsv6": [ + "2a0d:5600:24:a92::a95f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us95-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "GcnYpduxlDZhlzmRiXV6rwXbeJDgBZMn8e7adsMNg3Y=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.197" + ], + "ipsv6": [ + "2a0d:5600:24:a93::a96f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us96-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "CYoBb5hayfNzt+lOgJyMXcsWKitTn4QAXut7kg4relc=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.210" + ], + "ipsv6": [ + "2a0d:5600:24:a94::a97f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us97-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "5fzEFqyRqc6qa1QPngIBK1gmWc0ex1Bpot/f6RqZPmc=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.223" + ], + "ipsv6": [ + "2a0d:5600:24:a95::a98f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us98-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "bo50ppMvVlNG4S6zqgd/J5l1Ce7Og89u+wR10OvJrQ4=" + }, + { + "vpn": "wireguard", + "ips": [ + "86.106.143.236" + ], + "ipsv6": [ + "2a0d:5600:24:a96::a99f" + ], + "country": "USA", + "city": "New York NY", + "hostname": "us99-wireguard", + "isp": "M247", + "owned": false, + "wgpubkey": "EPLh6pVel06dND8cE4Prix9GP4hGLYNhQhn5mSN2yzM=" + }, + { + "vpn": "openvpn", "ips": [ "107.152.99.86" ], @@ -30201,6 +36044,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.133.34" ], @@ -30214,6 +36058,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.133.50" ], @@ -30227,6 +36072,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.133.66" ], @@ -30240,6 +36086,97 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "198.54.133.82" + ], + "ipsv6": [ + "2607:9000:7000:15::b89f" + ], + "country": "USA", + "city": "Phoenix AZ", + "hostname": "us189-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "ctROwSybsU4cHsnGidKtbGYWRB2R17PFMMAqEHpsSm0=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.133.98" + ], + "ipsv6": [ + "2607:9000:7000:16::b90f" + ], + "country": "USA", + "city": "Phoenix AZ", + "hostname": "us190-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "bdxYH3G6foGCwurPSIGPi4oneZfk3S+cpZSd+pUezUc=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.133.114" + ], + "ipsv6": [ + "2607:9000:7000:17::b91f" + ], + "country": "USA", + "city": "Phoenix AZ", + "hostname": "us191-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "D8pVZcwerPfEKUTHW5qZ9AzQl8zPRPp3BVqUmINR+g8=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.133.130" + ], + "ipsv6": [ + "2607:9000:7000:18::b92f" + ], + "country": "USA", + "city": "Phoenix AZ", + "hostname": "us192-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "AxQo/yew9yqQTk/2Z45qI0YZ33ZJ2P+y/K6dFUmvUCQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.133.146" + ], + "ipsv6": [ + "2607:9000:7000:19::b93f" + ], + "country": "USA", + "city": "Phoenix AZ", + "hostname": "us193-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "l5kFrUCMY1ip/rEDAppxRe0GjxDdGTAWNouBdGmTc1Q=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.133.162" + ], + "ipsv6": [ + "2607:9000:7000:20::b94f" + ], + "country": "USA", + "city": "Phoenix AZ", + "hostname": "us194-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "Zs07i3DIinREejSjUA7dXpDZvu00YRVNJakTEgckpVs=" + }, + { + "vpn": "openvpn", "ips": [ "198.54.130.34" ], @@ -30253,6 +36190,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.130.50" ], @@ -30266,6 +36204,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.130.66" ], @@ -30279,6 +36218,82 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "198.54.130.82" + ], + "ipsv6": [ + "2607:9000:4000:15::b83f" + ], + "country": "USA", + "city": "Raleigh NC", + "hostname": "us183-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "Yph7Oo28maPFDw/yJI5Bq+gvGE5qRqsYxt1lJ97vviI=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.130.98" + ], + "ipsv6": [ + "2607:9000:4000:16::b84f" + ], + "country": "USA", + "city": "Raleigh NC", + "hostname": "us184-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "vx+vqAj0vcbMlUZd7XRvvFi1ab5+cqxrBA5t8kti/ik=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.130.114" + ], + "ipsv6": [ + "2607:9000:4000:17::b85f" + ], + "country": "USA", + "city": "Raleigh NC", + "hostname": "us185-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "tnIQb/4YrNqLxN2RzK4N+3fikmEZLBGwAo9hbA7jXAM=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.130.130" + ], + "ipsv6": [ + "2607:9000:4000:18::b86f" + ], + "country": "USA", + "city": "Raleigh NC", + "hostname": "us186-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "IAyoNcOK87VO8e7rjFOQodLY6apnWCh6fTmgInGvnxk=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.130.146" + ], + "ipsv6": [ + "2607:9000:4000:19::b87f" + ], + "country": "USA", + "city": "Raleigh NC", + "hostname": "us187-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "KmsxVTOtLaR3s1nI2wNCA24eISH5Rp7dZIKhEvIaci8=" + }, + { + "vpn": "openvpn", "ips": [ "69.4.234.132" ], @@ -30292,6 +36307,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "69.4.234.133" ], @@ -30305,6 +36321,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "69.4.234.134" ], @@ -30318,6 +36335,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "69.4.234.135" ], @@ -30331,6 +36349,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "69.4.234.136" ], @@ -30344,6 +36363,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "69.4.234.137" ], @@ -30357,6 +36377,142 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "69.4.234.147" + ], + "ipsv6": [ + "2606:2e00:0:b9::b34f" + ], + "country": "USA", + "city": "Salt Lake City UT", + "hostname": "us134-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "H07w0/FzBuD7J1XX7AIPWQWq0KgAsik6NWnCDq+ouWs=" + }, + { + "vpn": "wireguard", + "ips": [ + "69.4.234.138" + ], + "ipsv6": [ + "2606:2e00:0:b9::b35f" + ], + "country": "USA", + "city": "Salt Lake City UT", + "hostname": "us135-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "hILFNRuu7ANGMAXOIwPKI3M/Q9lfzO2C+gYHs+5mQAw=" + }, + { + "vpn": "wireguard", + "ips": [ + "69.4.234.139" + ], + "ipsv6": [ + "2606:2e00:0:b9::b36f" + ], + "country": "USA", + "city": "Salt Lake City UT", + "hostname": "us136-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "CjSHNIrHSOr6me7OjckbfJb4XbfoDcDBvT5VS2jmFVM=" + }, + { + "vpn": "wireguard", + "ips": [ + "69.4.234.140" + ], + "ipsv6": [ + "2606:2e00:0:b9::b37f" + ], + "country": "USA", + "city": "Salt Lake City UT", + "hostname": "us137-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "wrlLOHa2QW+6FzEom2qOEyBvv06BTjwR0w6N0Rnb5jU=" + }, + { + "vpn": "wireguard", + "ips": [ + "69.4.234.141" + ], + "ipsv6": [ + "2606:2e00:0:b9::b38f" + ], + "country": "USA", + "city": "Salt Lake City UT", + "hostname": "us138-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "t7EpO096Y6jrzr/KHHfpMQsUG0Cu2sga0Di8P9f5Jh4=" + }, + { + "vpn": "wireguard", + "ips": [ + "69.4.234.142" + ], + "ipsv6": [ + "2606:2e00:0:b9::b39f" + ], + "country": "USA", + "city": "Salt Lake City UT", + "hostname": "us139-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "9tPpMdtpDweGoB6U5ZEnSTgYVwxD4fOytsl1TXrnHl4=" + }, + { + "vpn": "wireguard", + "ips": [ + "69.4.234.143" + ], + "ipsv6": [ + "2606:2e00:0:b9::b40f" + ], + "country": "USA", + "city": "Salt Lake City UT", + "hostname": "us140-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "/zr7GFpDW+Px3Y3iu8zhv8wzPWNP/OU4IICnb5H2ZXc=" + }, + { + "vpn": "wireguard", + "ips": [ + "69.4.234.144" + ], + "ipsv6": [ + "2606:2e00:0:b9::b41f" + ], + "country": "USA", + "city": "Salt Lake City UT", + "hostname": "us141-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "KpBP2riY4EKvf02tBXWwT7xHG0CMtRg/N6Q/B3Tng0o=" + }, + { + "vpn": "wireguard", + "ips": [ + "69.4.234.145" + ], + "ipsv6": [ + "2606:2e00:0:b9::b42f" + ], + "country": "USA", + "city": "Salt Lake City UT", + "hostname": "us142-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "ipEYDec8mAA89BgZRPezVDeVILmePOT+sL0ybd+O5Ug=" + }, + { + "vpn": "openvpn", "ips": [ "198.54.134.34" ], @@ -30370,6 +36526,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.134.50" ], @@ -30383,6 +36540,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.134.66" ], @@ -30396,6 +36554,217 @@ "owned": false }, { + "vpn": "wireguard", + "ips": [ + "198.54.134.82" + ], + "ipsv6": [ + "2607:9000:8000:15::b95f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us195-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "7PBJv+IH8NbH1WTCbptgzghi8hH7E8WsrqVH/cl0FBY=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.134.98" + ], + "ipsv6": [ + "2607:9000:8000:16::b96f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us196-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "3mQ+bBKGgX+7eunw64OhpWUz+UHL7Is2fcJWXO5UHQY=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.134.114" + ], + "ipsv6": [ + "2607:9000:8000:17::b97f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us197-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "U20kRb33zBR15Gsd6bP9hQccDL0O4HysxMa5QjubxC0=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.134.130" + ], + "ipsv6": [ + "2607:9000:8000:18::b98f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us198-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "e66QrzHRv/dFmGj8dyGEKxaZiC6Vt3MzLiiRcYJqVjQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.134.146" + ], + "ipsv6": [ + "2607:9000:8000:19::b99f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us199-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "FSd0QIqNsLGf+B/IqQzg9wyjKpfVwXiy/P9vt8Zylmg=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.134.162" + ], + "ipsv6": [ + "2607:9000:8000:20::c00f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us200-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "jHaXA+nq2od3uwNPzOUuGeLTuXBTTyXdPsi0lib4pVg=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.165.211" + ], + "ipsv6": [ + "2607:f7a0:16:5::c01f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us201-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "4A5vS/WtSI2038iXnQ0i3jz2GIAJn6PB7l4JrOUubBo=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.165.212" + ], + "ipsv6": [ + "2607:f7a0:16:5::c02f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us202-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "0mc2D++TlTUUn8HToWbbATvrKtM3vCWJ65OzK9j/uDI=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.165.213" + ], + "ipsv6": [ + "2607:f7a0:16:5::c03f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us203-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "XwBEfnMpAqnkqc6mttfOkFacfZgRKrzIX8y7DrTZvxQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.165.214" + ], + "ipsv6": [ + "2607:f7a0:16:5::c04f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us204-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "xyE6GqJaU7ntIh1pQyZxd1KyR9UxO49aQ1c1WYQqCXQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.165.215" + ], + "ipsv6": [ + "2607:f7a0:16:5::c05f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us205-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "Nr//h6Q+LwJeV4nqnmIcXYQYigt8iKJgK8C81KiOdkU=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.165.216" + ], + "ipsv6": [ + "2607:f7a0:16:5::c06f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us206-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "RacjA0eNOBUACA8MvC2MKjt8ZTqxkYoB15kZKQaj3Ts=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.165.217" + ], + "ipsv6": [ + "2607:f7a0:16:5::c07f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us207-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "JTpeoUyC0CA/NiHoGk+nH8oM6hHY/Nawmvy5nYdXByE=" + }, + { + "vpn": "wireguard", + "ips": [ + "66.115.165.218" + ], + "ipsv6": [ + "2607:f7a0:16:5::c08f" + ], + "country": "USA", + "city": "San Jose CA", + "hostname": "us208-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "0N/GPSDWTju1YV8MCCx5n9O4scMKYP7Nh/nnLsje8W4=" + }, + { + "vpn": "openvpn", "ips": [ "198.54.131.34" ], @@ -30409,6 +36778,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.131.50" ], @@ -30422,6 +36792,7 @@ "owned": false }, { + "vpn": "openvpn", "ips": [ "198.54.131.66" ], @@ -30435,32 +36806,262 @@ "owned": false }, { + "vpn": "wireguard", "ips": [ - "23.226.131.130" + "198.54.131.82" ], "ipsv6": [ - "2607:fcd0:ccc0:1d00::1f" + "2607:9000:5000:15::b77f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us177-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "T1fKJp8knv4kqsfy9O04OIy+1nl5b9ypcnIzdmcfyzM=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.131.98" + ], + "ipsv6": [ + "2607:9000:5000:16::b78f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us178-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "+MmbnwQFKC18GJvunTQyAC2uvDwgEi9XXU7aksr9Czo=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.131.114" + ], + "ipsv6": [ + "2607:9000:5000:17::b79f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us179-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "+DIu6EMVk9QEsy6/NppxcDjuLSG6rTJ3TywYN3wXDkQ=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.131.130" + ], + "ipsv6": [ + "2607:9000:5000:18::b80f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us180-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "rgtjtftlhL1m9dC9KoacFbzQ9YVma6GOWIfoLom8TUc=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.131.146" + ], + "ipsv6": [ + "2607:9000:5000:19::b81f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us181-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "+c43g3SchQLZP1ODAMZemGi1fkLf89A0T+pbM4JWqRw=" + }, + { + "vpn": "wireguard", + "ips": [ + "198.54.131.162" + ], + "ipsv6": [ + "2607:9000:5000:20::b82f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us182-wireguard", + "isp": "Tzulo", + "owned": false, + "wgpubkey": "Uqx528kx/O1VKpG8DLKK5Q3Hz6JcxTbosYYwoDR4LgA=" + }, + { + "vpn": "wireguard", + "ips": [ + "199.229.250.52" + ], + "ipsv6": [ + "2607:f7a0:c:4::c09f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us209-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "APxS9ebzK537njzcfB9gh8VXWrFrKvZeC6QQe0ZCUUM=" + }, + { + "vpn": "wireguard", + "ips": [ + "199.229.250.53" + ], + "ipsv6": [ + "2607:f7a0:c:4::c10f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us210-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "92KRwUmhQY/n5cAUKR1R/Z/z17wOmB08GZxuats8cEw=" + }, + { + "vpn": "wireguard", + "ips": [ + "199.229.250.56" + ], + "ipsv6": [ + "2607:f7a0:c:4::c13f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us213-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "7YYXE9f3qJBHtccXrr3H8eFeZL3kPSd+zhX8A6q4GBM=" + }, + { + "vpn": "wireguard", + "ips": [ + "199.229.250.57" + ], + "ipsv6": [ + "2607:f7a0:c:4::c14f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us214-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "xqPiSkNlmz6KgC4UKz8rmey8VcmLHhTxCSYcNk9hAGo=" + }, + { + "vpn": "wireguard", + "ips": [ + "199.229.250.58" + ], + "ipsv6": [ + "2607:f7a0:c:4::c15f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us215-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "H6XbhZN1u6qYDJSfoSNWz4uTnSGuQEpdFR6T0kgrwhU=" + }, + { + "vpn": "wireguard", + "ips": [ + "199.229.250.59" + ], + "ipsv6": [ + "2607:f7a0:c:4::c16f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us216-wireguard", + "isp": "100TB", + "owned": false, + "wgpubkey": "ErdLbpitZKoIURt85r/VYNwq8FcwKOkGAhh6PgknT3U=" + }, + { + "vpn": "wireguard", + "ips": [ + "173.205.92.146" + ], + "ipsv6": [ + "2607:fcd0:cd00:a00::b27f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us227-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "lw4tLTZDxrpvn7cBbT/B6aBJ5GGijrTLsv0remBj5yM=" + }, + { + "vpn": "wireguard", + "ips": [ + "173.205.93.2" + ], + "ipsv6": [ + "2607:fcd0:cd00:a01::b28f" + ], + "country": "USA", + "city": "Seattle WA", + "hostname": "us228-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "ODuPYwpLGkN3MZuRTmXqPCLdC8h0eCUUaK8R/MySoEU=" + }, + { + "vpn": "wireguard", + "ips": [ + "162.218.210.18" + ], + "ipsv6": [ + "2607:fcd0:ccc0:1d02::b37f" ], "country": "USA", "city": "Secaucus NJ", - "hostname": "us-uyk-001", + "hostname": "us237-wireguard", "isp": "Quadranet", - "owned": false + "owned": false, + "wgpubkey": "gIPt84pfJGTKNcfow/S5/7davshqE5YlWvdiC9iUp3M=" }, { + "vpn": "wireguard", "ips": [ - "23.226.131.154" + "204.44.124.226" ], "ipsv6": [ - "2607:fcd0:ccc0:1d01::2f" + "2607:fcd0:ccc0:1d03::b38f" ], "country": "USA", "city": "Secaucus NJ", - "hostname": "us-uyk-002", + "hostname": "us238-wireguard", "isp": "Quadranet", - "owned": false + "owned": false, + "wgpubkey": "g+oSKrX4fbsPtiMwsbmB7/7+AywjFCj0jVYjSlR8wRM=" }, { + "vpn": "wireguard", + "ips": [ + "23.226.135.50" + ], + "ipsv6": [ + "2607:fcd0:ccc0:1d05::c41f" + ], + "country": "USA", + "city": "Secaucus NJ", + "hostname": "us241-wireguard", + "isp": "Quadranet", + "owned": false, + "wgpubkey": "AgaO2dCgD3SNEW8II143+pcMREFsnkoieay25nFLxDs=" + }, + { + "vpn": "openvpn", "ips": [ "45.9.249.34" ], @@ -104405,10 +111006,11 @@ ] }, "windscribe": { - "version": 0, - "timestamp": 1628471904, + "version": 1, + "timestamp": 1629420754, "servers": [ { + "vpn": "openvpn", "region": "Albania", "city": "Tirana", "hostname": "al-002.whiskergalaxy.com", @@ -104419,6 +111021,17 @@ ] }, { + "vpn": "wireguard", + "region": "Albania", + "city": "Tirana", + "hostname": "al-002.whiskergalaxy.com", + "wgpubkey": "/8WvGXPoWTiPmrQsmakiEk7wFhn0ab7FWqN5k13oszQ=", + "ips": [ + "31.171.152.180" + ] + }, + { + "vpn": "openvpn", "region": "Argentina", "city": "Buenos Aires", "hostname": "ar-008.whiskergalaxy.com", @@ -104429,6 +111042,17 @@ ] }, { + "vpn": "wireguard", + "region": "Argentina", + "city": "Buenos Aires", + "hostname": "ar-008.whiskergalaxy.com", + "wgpubkey": "2+O8VAshLkyWM1b6Ye2Cuoa3R/guKZgQ+YLoCsseWCU=", + "ips": [ + "190.103.176.148" + ] + }, + { + "vpn": "openvpn", "region": "Australia", "city": "Adelaide", "hostname": "au-008.whiskergalaxy.com", @@ -104439,6 +111063,17 @@ ] }, { + "vpn": "wireguard", + "region": "Australia", + "city": "Adelaide", + "hostname": "au-008.whiskergalaxy.com", + "wgpubkey": "tEh6Z8bnFmQU2KWHWYOS7yuDFZgwn3LGOZAdR1hN8kU=", + "ips": [ + "116.90.72.244" + ] + }, + { + "vpn": "openvpn", "region": "Australia", "city": "Adelaide ", "hostname": "au-011.whiskergalaxy.com", @@ -104449,6 +111084,17 @@ ] }, { + "vpn": "wireguard", + "region": "Australia", + "city": "Adelaide ", + "hostname": "au-011.whiskergalaxy.com", + "wgpubkey": "Sb5VSMZhhqSo5absckjzPn9HWhT7UrKk1AQv0me0zhI=", + "ips": [ + "103.108.92.84" + ] + }, + { + "vpn": "openvpn", "region": "Australia", "city": "Brisbane", "hostname": "au-007.whiskergalaxy.com", @@ -104459,16 +111105,17 @@ ] }, { + "vpn": "wireguard", "region": "Australia", "city": "Brisbane", - "hostname": "au-014.whiskergalaxy.com", - "x509": "bne-357.windscribe.com", + "hostname": "au-007.whiskergalaxy.com", + "wgpubkey": "KvFr7Te5+RaFATDKJzrNXKf44ws8J6E9WbNVsMPvY1I=", "ips": [ - "43.245.160.34", - "43.245.160.35" + "103.62.50.209" ] }, { + "vpn": "openvpn", "region": "Australia", "city": "Canberra", "hostname": "au-010.whiskergalaxy.com", @@ -104479,6 +111126,17 @@ ] }, { + "vpn": "wireguard", + "region": "Australia", + "city": "Canberra", + "hostname": "au-010.whiskergalaxy.com", + "wgpubkey": "MhJ+u6X13d3beo3DMIANYDsvnZjIqYEpQDGlMUS5fis=", + "ips": [ + "116.206.229.132" + ] + }, + { + "vpn": "openvpn", "region": "Australia", "city": "Melbourne ", "hostname": "au-005.whiskergalaxy.com", @@ -104489,6 +111147,17 @@ ] }, { + "vpn": "wireguard", + "region": "Australia", + "city": "Melbourne ", + "hostname": "au-005.whiskergalaxy.com", + "wgpubkey": "sDDXsvjyVqpB8fecUsjX0/Y8YdZye+oiV1Dy9BfUkwE=", + "ips": [ + "45.121.209.161" + ] + }, + { + "vpn": "openvpn", "region": "Australia", "city": "Melbourne ", "hostname": "au-013.whiskergalaxy.com", @@ -104499,6 +111168,17 @@ ] }, { + "vpn": "wireguard", + "region": "Australia", + "city": "Melbourne ", + "hostname": "au-013.whiskergalaxy.com", + "wgpubkey": "r5BDU0T+VGZU6I+zuF3vlGrdORtgNvLhY08gQxrFRCw=", + "ips": [ + "116.206.228.68" + ] + }, + { + "vpn": "openvpn", "region": "Australia", "city": "Perth", "hostname": "au-004.whiskergalaxy.com", @@ -104509,6 +111189,17 @@ ] }, { + "vpn": "wireguard", + "region": "Australia", + "city": "Perth", + "hostname": "au-004.whiskergalaxy.com", + "wgpubkey": "dqRF96aFvKwZ/UZXC+VuIciE6e2Iy138Vx54D2iHug8=", + "ips": [ + "45.121.208.161" + ] + }, + { + "vpn": "openvpn", "region": "Australia", "city": "Perth", "hostname": "au-012.whiskergalaxy.com", @@ -104519,6 +111210,17 @@ ] }, { + "vpn": "wireguard", + "region": "Australia", + "city": "Perth", + "hostname": "au-012.whiskergalaxy.com", + "wgpubkey": "Jhhq6jvPxABM8OmzaM4/zJbcoRBR5OZalIHrZaFuXAU=", + "ips": [ + "103.77.234.212" + ] + }, + { + "vpn": "openvpn", "region": "Australia", "city": "Sydney", "hostname": "au-009.whiskergalaxy.com", @@ -104529,6 +111231,17 @@ ] }, { + "vpn": "wireguard", + "region": "Australia", + "city": "Sydney", + "hostname": "au-009.whiskergalaxy.com", + "wgpubkey": "eSxX+L8qX+1MdmwjtlZGIDbDivFdURBh5Rm1KfUpYzc=", + "ips": [ + "103.77.233.68" + ] + }, + { + "vpn": "openvpn", "region": "Australia", "city": "Sydney", "hostname": "au-015.whiskergalaxy.com", @@ -104539,6 +111252,17 @@ ] }, { + "vpn": "wireguard", + "region": "Australia", + "city": "Sydney", + "hostname": "au-015.whiskergalaxy.com", + "wgpubkey": "jCi1I5HBTtwCblBbMzOFmOOFNG1GilYOZgst0kyq9gY=", + "ips": [ + "103.1.213.212" + ] + }, + { + "vpn": "openvpn", "region": "Australia", "city": "Sydney", "hostname": "au-016.whiskergalaxy.com", @@ -104549,6 +111273,17 @@ ] }, { + "vpn": "wireguard", + "region": "Australia", + "city": "Sydney", + "hostname": "au-016.whiskergalaxy.com", + "wgpubkey": "jCi1I5HBTtwCblBbMzOFmOOFNG1GilYOZgst0kyq9gY=", + "ips": [ + "103.1.212.244" + ] + }, + { + "vpn": "openvpn", "region": "Austria", "city": "Vienna", "hostname": "at-001.whiskergalaxy.com", @@ -104559,6 +111294,17 @@ ] }, { + "vpn": "wireguard", + "region": "Austria", + "city": "Vienna", + "hostname": "at-001.whiskergalaxy.com", + "wgpubkey": "TPJ0lv9z95UaBKA64lQYcpAsoYmmMxvX4cnMh3nHqgs=", + "ips": [ + "217.64.127.12" + ] + }, + { + "vpn": "openvpn", "region": "Austria", "city": "Vienna", "hostname": "at-002.whiskergalaxy.com", @@ -104569,6 +111315,17 @@ ] }, { + "vpn": "wireguard", + "region": "Austria", + "city": "Vienna", + "hostname": "at-002.whiskergalaxy.com", + "wgpubkey": "KtJIKy9zsCXtKwFMQeGDEZVXtqw+X1+5z10Rh84/N0s=", + "ips": [ + "89.187.168.67" + ] + }, + { + "vpn": "openvpn", "region": "Azerbaijan", "city": "Baku City", "hostname": "az-001.whiskergalaxy.com", @@ -104579,6 +111336,17 @@ ] }, { + "vpn": "wireguard", + "region": "Azerbaijan", + "city": "Baku City", + "hostname": "az-001.whiskergalaxy.com", + "wgpubkey": "3UBRUZsTinXo+7RNpduBmxObJkeeSvQjb7sX1ydvvSw=", + "ips": [ + "62.212.239.60" + ] + }, + { + "vpn": "openvpn", "region": "Belgium", "city": "Brussels", "hostname": "be-001.whiskergalaxy.com", @@ -104589,6 +111357,17 @@ ] }, { + "vpn": "wireguard", + "region": "Belgium", + "city": "Brussels", + "hostname": "be-001.whiskergalaxy.com", + "wgpubkey": "TA+nBx5qMBdyIiug4SHgbw30/GXrRZ2aUAH7MQHJwzc=", + "ips": [ + "194.187.251.148" + ] + }, + { + "vpn": "openvpn", "region": "Belgium", "city": "Brussels", "hostname": "be-002.whiskergalaxy.com", @@ -104599,6 +111378,17 @@ ] }, { + "vpn": "wireguard", + "region": "Belgium", + "city": "Brussels", + "hostname": "be-002.whiskergalaxy.com", + "wgpubkey": "TA+nBx5qMBdyIiug4SHgbw30/GXrRZ2aUAH7MQHJwzc=", + "ips": [ + "185.232.21.132" + ] + }, + { + "vpn": "openvpn", "region": "Bosnia", "city": "Sarajevo", "hostname": "ba-001.whiskergalaxy.com", @@ -104609,6 +111399,17 @@ ] }, { + "vpn": "wireguard", + "region": "Bosnia", + "city": "Sarajevo", + "hostname": "ba-001.whiskergalaxy.com", + "wgpubkey": "6oMHpHHL3pq6Pdr2HoDRYuyjcyQGxfQaSRQR+HPyvgc=", + "ips": [ + "185.99.3.25" + ] + }, + { + "vpn": "openvpn", "region": "Brazil", "city": "Sao Paulo", "hostname": "br-004.whiskergalaxy.com", @@ -104619,6 +111420,17 @@ ] }, { + "vpn": "wireguard", + "region": "Brazil", + "city": "Sao Paulo", + "hostname": "br-004.whiskergalaxy.com", + "wgpubkey": "bfeZeTGkISX5GVgVOkTMRlqvWlTI8obCb7vVdy8XGWk=", + "ips": [ + "177.67.80.60" + ] + }, + { + "vpn": "openvpn", "region": "Brazil", "city": "Sao Paulo", "hostname": "br-005.whiskergalaxy.com", @@ -104629,6 +111441,17 @@ ] }, { + "vpn": "wireguard", + "region": "Brazil", + "city": "Sao Paulo", + "hostname": "br-005.whiskergalaxy.com", + "wgpubkey": "c88CXfzJqasp/RIf7hQyYjrakrSyI4zfZdcTmcTwwxQ=", + "ips": [ + "177.54.157.180" + ] + }, + { + "vpn": "openvpn", "region": "Brazil", "city": "Sao Paulo", "hostname": "br-006.whiskergalaxy.com", @@ -104639,6 +111462,17 @@ ] }, { + "vpn": "wireguard", + "region": "Brazil", + "city": "Sao Paulo", + "hostname": "br-006.whiskergalaxy.com", + "wgpubkey": "c88CXfzJqasp/RIf7hQyYjrakrSyI4zfZdcTmcTwwxQ=", + "ips": [ + "177.54.148.248" + ] + }, + { + "vpn": "openvpn", "region": "Bulgaria", "city": "Sofia", "hostname": "bg-001.whiskergalaxy.com", @@ -104649,6 +111483,17 @@ ] }, { + "vpn": "wireguard", + "region": "Bulgaria", + "city": "Sofia", + "hostname": "bg-001.whiskergalaxy.com", + "wgpubkey": "kDDue7viLOXcxayH/VWzI8EhqeeSHrwOSt3IF9rHIlI=", + "ips": [ + "185.94.192.36" + ] + }, + { + "vpn": "openvpn", "region": "Cambodia", "city": "Phnom Penh", "hostname": "kh-001.whiskergalaxy.com", @@ -104659,6 +111504,17 @@ ] }, { + "vpn": "wireguard", + "region": "Cambodia", + "city": "Phnom Penh", + "hostname": "kh-001.whiskergalaxy.com", + "wgpubkey": "V95mJcGcpBFRAy3rQQJc6pWe5VA/28YoWKTl53slzz4=", + "ips": [ + "195.80.149.244" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Halifax", "hostname": "ca-029.whiskergalaxy.com", @@ -104669,6 +111525,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Halifax", + "hostname": "ca-029.whiskergalaxy.com", + "wgpubkey": "moi+8owLNQ+XRE2cXoHme9uzrvTy5WJSxZduevNpRmU=", + "ips": [ + "199.204.208.159" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Montreal", "hostname": "ca-027.whiskergalaxy.com", @@ -104679,6 +111546,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Montreal", + "hostname": "ca-027.whiskergalaxy.com", + "wgpubkey": "DxBtB3enAlS3OtJ9+jFtrTmuiGs36aV6HyyjKcit71o=", + "ips": [ + "144.168.163.161" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Montreal", "hostname": "ca-028.whiskergalaxy.com", @@ -104689,6 +111567,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Montreal", + "hostname": "ca-028.whiskergalaxy.com", + "wgpubkey": "DxBtB3enAlS3OtJ9+jFtrTmuiGs36aV6HyyjKcit71o=", + "ips": [ + "144.168.163.194" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Montreal", "hostname": "ca-032.whiskergalaxy.com", @@ -104699,6 +111588,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Montreal", + "hostname": "ca-032.whiskergalaxy.com", + "wgpubkey": "DxBtB3enAlS3OtJ9+jFtrTmuiGs36aV6HyyjKcit71o=", + "ips": [ + "104.227.235.130" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Montreal", "hostname": "ca-033.whiskergalaxy.com", @@ -104709,6 +111609,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Montreal", + "hostname": "ca-033.whiskergalaxy.com", + "wgpubkey": "nfFRpFZ0ZXWVoz8C4gP5ti7V1snFT1gV8EcIxTWJtB4=", + "ips": [ + "198.8.85.196" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Montreal", "hostname": "ca-034.whiskergalaxy.com", @@ -104719,6 +111630,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Montreal", + "hostname": "ca-034.whiskergalaxy.com", + "wgpubkey": "nfFRpFZ0ZXWVoz8C4gP5ti7V1snFT1gV8EcIxTWJtB4=", + "ips": [ + "198.8.85.211" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Toronto", "hostname": "ca-002.whiskergalaxy.com", @@ -104729,6 +111651,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Toronto", + "hostname": "ca-002.whiskergalaxy.com", + "wgpubkey": "pKXBuReWe+HfrILovyFzIybA8AVAsFgfDUyo42tLT1g=", + "ips": [ + "104.254.92.12" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Toronto", "hostname": "ca-009.whiskergalaxy.com", @@ -104739,6 +111672,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Toronto", + "hostname": "ca-009.whiskergalaxy.com", + "wgpubkey": "pKXBuReWe+HfrILovyFzIybA8AVAsFgfDUyo42tLT1g=", + "ips": [ + "104.254.92.92" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Toronto", "hostname": "ca-017.whiskergalaxy.com", @@ -104749,6 +111693,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Toronto", + "hostname": "ca-017.whiskergalaxy.com", + "wgpubkey": "pKXBuReWe+HfrILovyFzIybA8AVAsFgfDUyo42tLT1g=", + "ips": [ + "184.75.212.92" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Toronto", "hostname": "ca-025.whiskergalaxy.com", @@ -104759,6 +111714,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Toronto", + "hostname": "ca-025.whiskergalaxy.com", + "wgpubkey": "U5s7Yy/2fCqlaFcI96dFKupqEVCn+BYF04LRLD1zOhg=", + "ips": [ + "91.149.252.98" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Toronto", "hostname": "ca-026.whiskergalaxy.com", @@ -104769,6 +111735,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Toronto", + "hostname": "ca-026.whiskergalaxy.com", + "wgpubkey": "U5s7Yy/2fCqlaFcI96dFKupqEVCn+BYF04LRLD1zOhg=", + "ips": [ + "91.149.252.130" + ] + }, + { + "vpn": "openvpn", "region": "Canada East", "city": "Toronto", "hostname": "ca-030.whiskergalaxy.com", @@ -104779,6 +111756,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada East", + "city": "Toronto", + "hostname": "ca-030.whiskergalaxy.com", + "wgpubkey": "U5s7Yy/2fCqlaFcI96dFKupqEVCn+BYF04LRLD1zOhg=", + "ips": [ + "91.149.252.162" + ] + }, + { + "vpn": "openvpn", "region": "Canada West", "city": "Vancouver", "hostname": "ca-west-005.whiskergalaxy.com", @@ -104789,6 +111777,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada West", + "city": "Vancouver", + "hostname": "ca-west-005.whiskergalaxy.com", + "wgpubkey": "hHmf2yS/Hjkh6ZJ4seoO5Vwv0LwNlYFTnUK3v9lGvEQ=", + "ips": [ + "162.221.207.96" + ] + }, + { + "vpn": "openvpn", "region": "Canada West", "city": "Vancouver", "hostname": "ca-west-006.whiskergalaxy.com", @@ -104799,6 +111798,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada West", + "city": "Vancouver", + "hostname": "ca-west-006.whiskergalaxy.com", + "wgpubkey": "hHmf2yS/Hjkh6ZJ4seoO5Vwv0LwNlYFTnUK3v9lGvEQ=", + "ips": [ + "71.19.251.153" + ] + }, + { + "vpn": "openvpn", "region": "Canada West", "city": "Vancouver", "hostname": "ca-west-011.whiskergalaxy.com", @@ -104809,6 +111819,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada West", + "city": "Vancouver", + "hostname": "ca-west-011.whiskergalaxy.com", + "wgpubkey": "ig1yNm9ck4lesT3MShd4JN7ngvLLDMR+l7Euc88oLzQ=", + "ips": [ + "104.218.61.2" + ] + }, + { + "vpn": "openvpn", "region": "Canada West", "city": "Vancouver", "hostname": "ca-west-012.whiskergalaxy.com", @@ -104819,6 +111840,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada West", + "city": "Vancouver", + "hostname": "ca-west-012.whiskergalaxy.com", + "wgpubkey": "ig1yNm9ck4lesT3MShd4JN7ngvLLDMR+l7Euc88oLzQ=", + "ips": [ + "104.218.61.34" + ] + }, + { + "vpn": "openvpn", "region": "Canada West", "city": "Vancouver", "hostname": "ca-west-017.whiskergalaxy.com", @@ -104829,6 +111861,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada West", + "city": "Vancouver", + "hostname": "ca-west-017.whiskergalaxy.com", + "wgpubkey": "YxWQDjNmU41PJXtoobFek3Y6nhICSLgsqH+QKPO5AQ8=", + "ips": [ + "208.78.41.132" + ] + }, + { + "vpn": "openvpn", "region": "Canada West", "city": "Vancouver", "hostname": "ca-west-019.whiskergalaxy.com", @@ -104839,6 +111882,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada West", + "city": "Vancouver", + "hostname": "ca-west-019.whiskergalaxy.com", + "wgpubkey": "YxWQDjNmU41PJXtoobFek3Y6nhICSLgsqH+QKPO5AQ8=", + "ips": [ + "208.78.41.164" + ] + }, + { + "vpn": "openvpn", "region": "Canada West", "city": "Vancouver", "hostname": "ca-west-020.whiskergalaxy.com", @@ -104849,6 +111903,17 @@ ] }, { + "vpn": "wireguard", + "region": "Canada West", + "city": "Vancouver", + "hostname": "ca-west-020.whiskergalaxy.com", + "wgpubkey": "YxWQDjNmU41PJXtoobFek3Y6nhICSLgsqH+QKPO5AQ8=", + "ips": [ + "198.8.92.100" + ] + }, + { + "vpn": "openvpn", "region": "Chile", "city": "Santiago", "hostname": "cl-001.whiskergalaxy.com", @@ -104859,6 +111924,17 @@ ] }, { + "vpn": "wireguard", + "region": "Chile", + "city": "Santiago", + "hostname": "cl-001.whiskergalaxy.com", + "wgpubkey": "md4drvl8I1VnIAIfUnvEQYd8QRUVk7NC3gLE2+Eu20M=", + "ips": [ + "66.203.113.132" + ] + }, + { + "vpn": "openvpn", "region": "Chile", "city": "Santiago", "hostname": "cl-002.whiskergalaxy.com", @@ -104869,6 +111945,17 @@ ] }, { + "vpn": "wireguard", + "region": "Chile", + "city": "Santiago", + "hostname": "cl-002.whiskergalaxy.com", + "wgpubkey": "md4drvl8I1VnIAIfUnvEQYd8QRUVk7NC3gLE2+Eu20M=", + "ips": [ + "66.203.113.137" + ] + }, + { + "vpn": "openvpn", "region": "Colombia", "city": "Bogota", "hostname": "co-001.whiskergalaxy.com", @@ -104879,6 +111966,17 @@ ] }, { + "vpn": "wireguard", + "region": "Colombia", + "city": "Bogota", + "hostname": "co-001.whiskergalaxy.com", + "wgpubkey": "sIJCZv0xijjMES3AqTrF374YOcdaIS266MBj1Yt7Ng0=", + "ips": [ + "138.121.203.204" + ] + }, + { + "vpn": "openvpn", "region": "Colombia", "city": "Bogota", "hostname": "co-002.whiskergalaxy.com", @@ -104889,6 +111987,17 @@ ] }, { + "vpn": "wireguard", + "region": "Colombia", + "city": "Bogota", + "hostname": "co-002.whiskergalaxy.com", + "wgpubkey": "QpdeoH7VxAatKlFm0sPo8phHjv1tiiHdqQaACmzMJjE=", + "ips": [ + "138.186.141.156" + ] + }, + { + "vpn": "openvpn", "region": "Croatia", "city": "Zagreb", "hostname": "hr-002.whiskergalaxy.com", @@ -104899,6 +112008,17 @@ ] }, { + "vpn": "wireguard", + "region": "Croatia", + "city": "Zagreb", + "hostname": "hr-002.whiskergalaxy.com", + "wgpubkey": "aTyGd+x2cPxFdPzi7FfbKc7SG4Rc5VE0c/Tdyd2MdzA=", + "ips": [ + "85.10.56.130" + ] + }, + { + "vpn": "openvpn", "region": "Cyprus", "city": "Nicosia", "hostname": "cy-001.whiskergalaxy.com", @@ -104909,6 +112029,17 @@ ] }, { + "vpn": "wireguard", + "region": "Cyprus", + "city": "Nicosia", + "hostname": "cy-001.whiskergalaxy.com", + "wgpubkey": "90fjr1sq0Hgv2l+DgMaaGQ009SDw7VxmzJwaYmclaFs=", + "ips": [ + "157.97.132.44" + ] + }, + { + "vpn": "openvpn", "region": "Czech Republic", "city": "Prague", "hostname": "cz-001.whiskergalaxy.com", @@ -104919,6 +112050,17 @@ ] }, { + "vpn": "wireguard", + "region": "Czech Republic", + "city": "Prague", + "hostname": "cz-001.whiskergalaxy.com", + "wgpubkey": "a599bjD8WzXg94xH1DfGBxW8yJ64EXMZq18elEfAwyk=", + "ips": [ + "185.156.174.12" + ] + }, + { + "vpn": "openvpn", "region": "Czech Republic", "city": "Prague ", "hostname": "cz-002.whiskergalaxy.com", @@ -104929,6 +112071,17 @@ ] }, { + "vpn": "wireguard", + "region": "Czech Republic", + "city": "Prague ", + "hostname": "cz-002.whiskergalaxy.com", + "wgpubkey": "dAaOzl6DBAuFWC85UJUY378WwEHUoNqbE5lJMDfNamo=", + "ips": [ + "185.246.210.3" + ] + }, + { + "vpn": "openvpn", "region": "Denmark", "city": "Copenhagen", "hostname": "dk-001.whiskergalaxy.com", @@ -104939,6 +112092,17 @@ ] }, { + "vpn": "wireguard", + "region": "Denmark", + "city": "Copenhagen", + "hostname": "dk-001.whiskergalaxy.com", + "wgpubkey": "QgQ3dPssF5IGZczLNP1KKbkohpIu/GCYBdi6ecuoqwU=", + "ips": [ + "185.206.224.196" + ] + }, + { + "vpn": "openvpn", "region": "Denmark", "city": "Copenhagen", "hostname": "dk-003.whiskergalaxy.com", @@ -104949,6 +112113,17 @@ ] }, { + "vpn": "wireguard", + "region": "Denmark", + "city": "Copenhagen", + "hostname": "dk-003.whiskergalaxy.com", + "wgpubkey": "QgQ3dPssF5IGZczLNP1KKbkohpIu/GCYBdi6ecuoqwU=", + "ips": [ + "185.206.224.36" + ] + }, + { + "vpn": "openvpn", "region": "Estonia", "city": "Tallinn", "hostname": "ee-002.whiskergalaxy.com", @@ -104959,6 +112134,17 @@ ] }, { + "vpn": "wireguard", + "region": "Estonia", + "city": "Tallinn", + "hostname": "ee-002.whiskergalaxy.com", + "wgpubkey": "FoZuoiJqIy/0h7Jv+7Jli4E49KFv0riLg1eVaI7j6X8=", + "ips": [ + "196.196.216.132" + ] + }, + { + "vpn": "openvpn", "region": "Estonia", "city": "Tallinn", "hostname": "ee-003.whiskergalaxy.com", @@ -104969,6 +112155,17 @@ ] }, { + "vpn": "wireguard", + "region": "Estonia", + "city": "Tallinn", + "hostname": "ee-003.whiskergalaxy.com", + "wgpubkey": "FoZuoiJqIy/0h7Jv+7Jli4E49KFv0riLg1eVaI7j6X8=", + "ips": [ + "196.196.216.196" + ] + }, + { + "vpn": "openvpn", "region": "Estonia", "city": "Tallinn", "hostname": "ee-004.whiskergalaxy.com", @@ -104979,6 +112176,17 @@ ] }, { + "vpn": "wireguard", + "region": "Estonia", + "city": "Tallinn", + "hostname": "ee-004.whiskergalaxy.com", + "wgpubkey": "FoZuoiJqIy/0h7Jv+7Jli4E49KFv0riLg1eVaI7j6X8=", + "ips": [ + "196.196.216.228" + ] + }, + { + "vpn": "openvpn", "region": "Fake Antarctica", "city": "Troll", "hostname": "aq-001.whiskergalaxy.com", @@ -104989,6 +112197,17 @@ ] }, { + "vpn": "wireguard", + "region": "Fake Antarctica", + "city": "Troll", + "hostname": "aq-001.whiskergalaxy.com", + "wgpubkey": "vwimooPysZvNdJULeFQVovYfqhsLG5gVdzgoTnfm+iE=", + "ips": [ + "91.149.252.226" + ] + }, + { + "vpn": "openvpn", "region": "Fake Antarctica", "city": "Troll", "hostname": "aq-002.whiskergalaxy.com", @@ -104999,6 +112218,17 @@ ] }, { + "vpn": "wireguard", + "region": "Fake Antarctica", + "city": "Troll", + "hostname": "aq-002.whiskergalaxy.com", + "wgpubkey": "vwimooPysZvNdJULeFQVovYfqhsLG5gVdzgoTnfm+iE=", + "ips": [ + "91.149.252.242" + ] + }, + { + "vpn": "openvpn", "region": "Finland", "city": "Helsinki", "hostname": "fi-002.whiskergalaxy.com", @@ -105009,6 +112239,17 @@ ] }, { + "vpn": "wireguard", + "region": "Finland", + "city": "Helsinki", + "hostname": "fi-002.whiskergalaxy.com", + "wgpubkey": "Z3Nfo50Hl0+A96/RXWGV2HPl5rJGsk2unuD1accZPWQ=", + "ips": [ + "185.112.82.228" + ] + }, + { + "vpn": "openvpn", "region": "Finland", "city": "Helsinki", "hostname": "fi-003.whiskergalaxy.com", @@ -105019,16 +112260,17 @@ ] }, { + "vpn": "wireguard", "region": "Finland", "city": "Helsinki", - "hostname": "fi-004.whiskergalaxy.com", - "x509": "hel-98.windscribe.com", + "hostname": "fi-003.whiskergalaxy.com", + "wgpubkey": "Z3Nfo50Hl0+A96/RXWGV2HPl5rJGsk2unuD1accZPWQ=", "ips": [ - "196.244.192.50", - "196.244.192.51" + "194.34.133.83" ] }, { + "vpn": "openvpn", "region": "France", "city": "Paris", "hostname": "fr-004.whiskergalaxy.com", @@ -105039,6 +112281,17 @@ ] }, { + "vpn": "wireguard", + "region": "France", + "city": "Paris", + "hostname": "fr-004.whiskergalaxy.com", + "wgpubkey": "3si2nD1DKbbkeZkdg3hLMfOYw1gdKbVFtTOj2NOA+nM=", + "ips": [ + "185.156.173.188" + ] + }, + { + "vpn": "openvpn", "region": "France", "city": "Paris", "hostname": "fr-005.whiskergalaxy.com", @@ -105049,6 +112302,17 @@ ] }, { + "vpn": "wireguard", + "region": "France", + "city": "Paris", + "hostname": "fr-005.whiskergalaxy.com", + "wgpubkey": "3si2nD1DKbbkeZkdg3hLMfOYw1gdKbVFtTOj2NOA+nM=", + "ips": [ + "82.102.18.36" + ] + }, + { + "vpn": "openvpn", "region": "France", "city": "Paris", "hostname": "fr-008.whiskergalaxy.com", @@ -105059,6 +112323,17 @@ ] }, { + "vpn": "wireguard", + "region": "France", + "city": "Paris", + "hostname": "fr-008.whiskergalaxy.com", + "wgpubkey": "cmaT8JIehfRf5PWWDkcBRwLWDb3jrIkk/SDbw4JmUAc=", + "ips": [ + "84.17.42.35" + ] + }, + { + "vpn": "openvpn", "region": "France", "city": "Paris", "hostname": "fr-009.whiskergalaxy.com", @@ -105069,6 +112344,17 @@ ] }, { + "vpn": "wireguard", + "region": "France", + "city": "Paris", + "hostname": "fr-009.whiskergalaxy.com", + "wgpubkey": "cmaT8JIehfRf5PWWDkcBRwLWDb3jrIkk/SDbw4JmUAc=", + "ips": [ + "84.17.42.3" + ] + }, + { + "vpn": "openvpn", "region": "France", "city": "Paris", "hostname": "fr-011.whiskergalaxy.com", @@ -105079,6 +112365,17 @@ ] }, { + "vpn": "wireguard", + "region": "France", + "city": "Paris", + "hostname": "fr-011.whiskergalaxy.com", + "wgpubkey": "3si2nD1DKbbkeZkdg3hLMfOYw1gdKbVFtTOj2NOA+nM=", + "ips": [ + "45.89.174.36" + ] + }, + { + "vpn": "openvpn", "region": "Germany", "city": "Frankfurt", "hostname": "de-003.whiskergalaxy.com", @@ -105089,6 +112386,17 @@ ] }, { + "vpn": "wireguard", + "region": "Germany", + "city": "Frankfurt", + "hostname": "de-003.whiskergalaxy.com", + "wgpubkey": "e1kA4Tn1REdBHHo3BZsApwhCybD+VpGQ9FoUxUq4mzY=", + "ips": [ + "89.249.65.20" + ] + }, + { + "vpn": "openvpn", "region": "Germany", "city": "Frankfurt", "hostname": "de-006.whiskergalaxy.com", @@ -105099,6 +112407,17 @@ ] }, { + "vpn": "wireguard", + "region": "Germany", + "city": "Frankfurt", + "hostname": "de-006.whiskergalaxy.com", + "wgpubkey": "e1kA4Tn1REdBHHo3BZsApwhCybD+VpGQ9FoUxUq4mzY=", + "ips": [ + "185.130.184.196" + ] + }, + { + "vpn": "openvpn", "region": "Germany", "city": "Frankfurt", "hostname": "de-009.whiskergalaxy.com", @@ -105109,6 +112428,17 @@ ] }, { + "vpn": "wireguard", + "region": "Germany", + "city": "Frankfurt", + "hostname": "de-009.whiskergalaxy.com", + "wgpubkey": "QgKUjSTh1LGfLqcM1UAzIjTIviacHG+auN3PEXRhZkM=", + "ips": [ + "195.181.170.67" + ] + }, + { + "vpn": "openvpn", "region": "Germany", "city": "Frankfurt", "hostname": "de-010.whiskergalaxy.com", @@ -105119,6 +112449,17 @@ ] }, { + "vpn": "wireguard", + "region": "Germany", + "city": "Frankfurt", + "hostname": "de-010.whiskergalaxy.com", + "wgpubkey": "QgKUjSTh1LGfLqcM1UAzIjTIviacHG+auN3PEXRhZkM=", + "ips": [ + "195.181.175.99" + ] + }, + { + "vpn": "openvpn", "region": "Germany", "city": "Frankfurt", "hostname": "de-011.whiskergalaxy.com", @@ -105129,6 +112470,17 @@ ] }, { + "vpn": "wireguard", + "region": "Germany", + "city": "Frankfurt", + "hostname": "de-011.whiskergalaxy.com", + "wgpubkey": "e1kA4Tn1REdBHHo3BZsApwhCybD+VpGQ9FoUxUq4mzY=", + "ips": [ + "217.138.194.116" + ] + }, + { + "vpn": "openvpn", "region": "Germany", "city": "Frankfurt", "hostname": "de-012.whiskergalaxy.com", @@ -105139,6 +112491,17 @@ ] }, { + "vpn": "wireguard", + "region": "Germany", + "city": "Frankfurt", + "hostname": "de-012.whiskergalaxy.com", + "wgpubkey": "e1kA4Tn1REdBHHo3BZsApwhCybD+VpGQ9FoUxUq4mzY=", + "ips": [ + "45.87.212.52" + ] + }, + { + "vpn": "openvpn", "region": "Germany", "city": "Frankfurt", "hostname": "de-017.whiskergalaxy.com", @@ -105149,6 +112512,17 @@ ] }, { + "vpn": "wireguard", + "region": "Germany", + "city": "Frankfurt", + "hostname": "de-017.whiskergalaxy.com", + "wgpubkey": "e1kA4Tn1REdBHHo3BZsApwhCybD+VpGQ9FoUxUq4mzY=", + "ips": [ + "45.87.212.84" + ] + }, + { + "vpn": "openvpn", "region": "Greece", "city": "Athens", "hostname": "gr-002.whiskergalaxy.com", @@ -105159,6 +112533,17 @@ ] }, { + "vpn": "wireguard", + "region": "Greece", + "city": "Athens", + "hostname": "gr-002.whiskergalaxy.com", + "wgpubkey": "d6yLPOu47tkYjm3Q2+R/oHvj2lgxLGL/sOrLFlkGLX0=", + "ips": [ + "78.108.38.156" + ] + }, + { + "vpn": "openvpn", "region": "Greece", "city": "Athens", "hostname": "gr-004.whiskergalaxy.com", @@ -105169,6 +112554,17 @@ ] }, { + "vpn": "wireguard", + "region": "Greece", + "city": "Athens", + "hostname": "gr-004.whiskergalaxy.com", + "wgpubkey": "abAIyZlBkims+My2pZVgkY2Z83JskM7w4LLUIEjcgmQ=", + "ips": [ + "185.226.64.112" + ] + }, + { + "vpn": "openvpn", "region": "Greece", "city": "Athens", "hostname": "gr-005.whiskergalaxy.com", @@ -105179,6 +112575,17 @@ ] }, { + "vpn": "wireguard", + "region": "Greece", + "city": "Athens", + "hostname": "gr-005.whiskergalaxy.com", + "wgpubkey": "7fY/cxF/ikCcnTyL9JgNuc3pis+YIjPBKB2TRVbzmwA=", + "ips": [ + "188.123.126.147" + ] + }, + { + "vpn": "openvpn", "region": "Hong Kong", "city": "Hong Kong", "hostname": "hk-005.whiskergalaxy.com", @@ -105189,6 +112596,17 @@ ] }, { + "vpn": "wireguard", + "region": "Hong Kong", + "city": "Hong Kong", + "hostname": "hk-005.whiskergalaxy.com", + "wgpubkey": "wfSHdnVIT/SlLwKCz+QWTs0ZIPRtYd2NKpMXDPe7sWk=", + "ips": [ + "103.10.197.100" + ] + }, + { + "vpn": "openvpn", "region": "Hong Kong", "city": "Hong Kong", "hostname": "hk-006.whiskergalaxy.com", @@ -105199,6 +112617,17 @@ ] }, { + "vpn": "wireguard", + "region": "Hong Kong", + "city": "Hong Kong", + "hostname": "hk-006.whiskergalaxy.com", + "wgpubkey": "zi62xnrtbvAbaavB8MLoTF36BX/stxjfnGJ6mIsZYzg=", + "ips": [ + "84.17.57.115" + ] + }, + { + "vpn": "openvpn", "region": "Hong Kong", "city": "Hong Kong", "hostname": "hk-008.whiskergalaxy.com", @@ -105209,6 +112638,17 @@ ] }, { + "vpn": "wireguard", + "region": "Hong Kong", + "city": "Hong Kong", + "hostname": "hk-008.whiskergalaxy.com", + "wgpubkey": "wfSHdnVIT/SlLwKCz+QWTs0ZIPRtYd2NKpMXDPe7sWk=", + "ips": [ + "27.122.12.4" + ] + }, + { + "vpn": "openvpn", "region": "Hungary", "city": "Budapest", "hostname": "hu-001.whiskergalaxy.com", @@ -105219,6 +112659,17 @@ ] }, { + "vpn": "wireguard", + "region": "Hungary", + "city": "Budapest", + "hostname": "hu-001.whiskergalaxy.com", + "wgpubkey": "ENe619amvJuPmyAtuLnGziKl1Yr1n3SoXgHrmosbRhk=", + "ips": [ + "185.104.187.44" + ] + }, + { + "vpn": "openvpn", "region": "Iceland", "city": "Reykjavik", "hostname": "is-001.whiskergalaxy.com", @@ -105229,6 +112680,17 @@ ] }, { + "vpn": "wireguard", + "region": "Iceland", + "city": "Reykjavik", + "hostname": "is-001.whiskergalaxy.com", + "wgpubkey": "8ZGAQUv1E/9pfVmPwasDo4g69PlAHIzlUf5pAmCJ7hk=", + "ips": [ + "82.221.139.39" + ] + }, + { + "vpn": "openvpn", "region": "Iceland", "city": "Reykjavik", "hostname": "is-002.whiskergalaxy.com", @@ -105239,6 +112701,17 @@ ] }, { + "vpn": "wireguard", + "region": "Iceland", + "city": "Reykjavik", + "hostname": "is-002.whiskergalaxy.com", + "wgpubkey": "ua7TUXkcSiiHeTyCok5b3PX9DkJ4l5yVvGlSmJ34WU8=", + "ips": [ + "185.165.170.3" + ] + }, + { + "vpn": "openvpn", "region": "India", "city": "Chennai", "hostname": "in-005.whiskergalaxy.com", @@ -105249,6 +112722,17 @@ ] }, { + "vpn": "wireguard", + "region": "India", + "city": "Chennai", + "hostname": "in-005.whiskergalaxy.com", + "wgpubkey": "M+3/GjKWB8qpmCZUu7sD5o6fOA7a43eraPcQTI6W2mE=", + "ips": [ + "169.38.68.189" + ] + }, + { + "vpn": "openvpn", "region": "India", "city": "Chennai", "hostname": "in-006.whiskergalaxy.com", @@ -105259,6 +112743,17 @@ ] }, { + "vpn": "wireguard", + "region": "India", + "city": "Chennai", + "hostname": "in-006.whiskergalaxy.com", + "wgpubkey": "M+3/GjKWB8qpmCZUu7sD5o6fOA7a43eraPcQTI6W2mE=", + "ips": [ + "169.38.72.15" + ] + }, + { + "vpn": "openvpn", "region": "India", "city": "Chennai", "hostname": "in-007.whiskergalaxy.com", @@ -105269,6 +112764,17 @@ ] }, { + "vpn": "wireguard", + "region": "India", + "city": "Chennai", + "hostname": "in-007.whiskergalaxy.com", + "wgpubkey": "M+3/GjKWB8qpmCZUu7sD5o6fOA7a43eraPcQTI6W2mE=", + "ips": [ + "169.38.72.13" + ] + }, + { + "vpn": "openvpn", "region": "India", "city": "Mumbai", "hostname": "in-009.whiskergalaxy.com", @@ -105279,6 +112785,17 @@ ] }, { + "vpn": "wireguard", + "region": "India", + "city": "Mumbai", + "hostname": "in-009.whiskergalaxy.com", + "wgpubkey": "zyGN4Q1r+3C7OVg7cQEf3Wq1Ts+oXlBVGPPp3r+wnCM=", + "ips": [ + "196.240.60.4" + ] + }, + { + "vpn": "openvpn", "region": "India", "city": "Mumbai", "hostname": "in-010.whiskergalaxy.com", @@ -105289,6 +112806,17 @@ ] }, { + "vpn": "wireguard", + "region": "India", + "city": "Mumbai", + "hostname": "in-010.whiskergalaxy.com", + "wgpubkey": "zyGN4Q1r+3C7OVg7cQEf3Wq1Ts+oXlBVGPPp3r+wnCM=", + "ips": [ + "196.240.60.20" + ] + }, + { + "vpn": "openvpn", "region": "India", "city": "Pune", "hostname": "in-008.whiskergalaxy.com", @@ -105299,6 +112827,17 @@ ] }, { + "vpn": "wireguard", + "region": "India", + "city": "Pune", + "hostname": "in-008.whiskergalaxy.com", + "wgpubkey": "TkdCh95ZjvjxoQGs85jAC9pV+TgLzdOYlZsUF4b/liU=", + "ips": [ + "103.205.140.177" + ] + }, + { + "vpn": "openvpn", "region": "Indonesia", "city": "Jakarta", "hostname": "id-002.whiskergalaxy.com", @@ -105309,6 +112848,17 @@ ] }, { + "vpn": "wireguard", + "region": "Indonesia", + "city": "Jakarta", + "hostname": "id-002.whiskergalaxy.com", + "wgpubkey": "wYAVV6Ngtcnm1DqQptFCi69gcS1v2mvpM27iRb+XWko=", + "ips": [ + "45.127.134.92" + ] + }, + { + "vpn": "openvpn", "region": "Indonesia", "city": "Jakarta", "hostname": "id-003.whiskergalaxy.com", @@ -105319,6 +112869,17 @@ ] }, { + "vpn": "wireguard", + "region": "Indonesia", + "city": "Jakarta", + "hostname": "id-003.whiskergalaxy.com", + "wgpubkey": "wYAVV6Ngtcnm1DqQptFCi69gcS1v2mvpM27iRb+XWko=", + "ips": [ + "103.236.201.72" + ] + }, + { + "vpn": "openvpn", "region": "Indonesia", "city": "Jakarta", "hostname": "id-004.whiskergalaxy.com", @@ -105329,6 +112890,17 @@ ] }, { + "vpn": "wireguard", + "region": "Indonesia", + "city": "Jakarta", + "hostname": "id-004.whiskergalaxy.com", + "wgpubkey": "wYAVV6Ngtcnm1DqQptFCi69gcS1v2mvpM27iRb+XWko=", + "ips": [ + "103.236.201.77" + ] + }, + { + "vpn": "openvpn", "region": "Ireland", "city": "Dublin", "hostname": "ie-001.whiskergalaxy.com", @@ -105339,6 +112911,17 @@ ] }, { + "vpn": "wireguard", + "region": "Ireland", + "city": "Dublin", + "hostname": "ie-001.whiskergalaxy.com", + "wgpubkey": "7V00BhJ4cAxsJmU8mEXbdUU5wljw67fGKs1oDhUYtl8=", + "ips": [ + "185.24.232.147" + ] + }, + { + "vpn": "openvpn", "region": "Ireland", "city": "Dublin", "hostname": "ie-002.whiskergalaxy.com", @@ -105349,6 +112932,17 @@ ] }, { + "vpn": "wireguard", + "region": "Ireland", + "city": "Dublin", + "hostname": "ie-002.whiskergalaxy.com", + "wgpubkey": "7V00BhJ4cAxsJmU8mEXbdUU5wljw67fGKs1oDhUYtl8=", + "ips": [ + "185.104.219.3" + ] + }, + { + "vpn": "openvpn", "region": "Ireland", "city": "Dublin", "hostname": "ie-003.whiskergalaxy.com", @@ -105359,6 +112953,17 @@ ] }, { + "vpn": "wireguard", + "region": "Ireland", + "city": "Dublin", + "hostname": "ie-003.whiskergalaxy.com", + "wgpubkey": "VgzE+XeQUxX54wMZdhRBU4Qxqba95iVpXi197ZbBBgA=", + "ips": [ + "23.92.127.36" + ] + }, + { + "vpn": "openvpn", "region": "Israel", "city": "Ashdod", "hostname": "il-002.whiskergalaxy.com", @@ -105369,6 +112974,17 @@ ] }, { + "vpn": "wireguard", + "region": "Israel", + "city": "Ashdod", + "hostname": "il-002.whiskergalaxy.com", + "wgpubkey": "2tyuu2HcOljr/wndoswy2Vk9gqXgjaP/IRg3vXoqFig=", + "ips": [ + "185.191.205.140" + ] + }, + { + "vpn": "openvpn", "region": "Israel", "city": "Jerusalem", "hostname": "il-001.whiskergalaxy.com", @@ -105379,6 +112995,17 @@ ] }, { + "vpn": "wireguard", + "region": "Israel", + "city": "Jerusalem", + "hostname": "il-001.whiskergalaxy.com", + "wgpubkey": "qlIT9w9NyoQst2kPPigf30U+tQRpYZdNaFE32zzkemE=", + "ips": [ + "160.116.0.28" + ] + }, + { + "vpn": "openvpn", "region": "Italy", "city": "Milan", "hostname": "it-001.whiskergalaxy.com", @@ -105389,6 +113016,17 @@ ] }, { + "vpn": "wireguard", + "region": "Italy", + "city": "Milan", + "hostname": "it-001.whiskergalaxy.com", + "wgpubkey": "PG6oqmH+m3JPVRBjfkbBlI/72noVZ8KrnSRq7GuGink=", + "ips": [ + "37.120.135.84" + ] + }, + { + "vpn": "openvpn", "region": "Italy", "city": "Milan", "hostname": "it-004.whiskergalaxy.com", @@ -105399,6 +113037,17 @@ ] }, { + "vpn": "wireguard", + "region": "Italy", + "city": "Milan", + "hostname": "it-004.whiskergalaxy.com", + "wgpubkey": "QI+u918O4tyAtoV37B6HVdiQeZoEUi0dWXhSsC3LiWQ=", + "ips": [ + "84.17.59.67" + ] + }, + { + "vpn": "openvpn", "region": "Italy", "city": "Milan", "hostname": "it-005.whiskergalaxy.com", @@ -105409,6 +113058,17 @@ ] }, { + "vpn": "wireguard", + "region": "Italy", + "city": "Milan", + "hostname": "it-005.whiskergalaxy.com", + "wgpubkey": "PG6oqmH+m3JPVRBjfkbBlI/72noVZ8KrnSRq7GuGink=", + "ips": [ + "89.40.182.4" + ] + }, + { + "vpn": "openvpn", "region": "Italy", "city": "Rome", "hostname": "it-003.whiskergalaxy.com", @@ -105419,6 +113079,17 @@ ] }, { + "vpn": "wireguard", + "region": "Italy", + "city": "Rome", + "hostname": "it-003.whiskergalaxy.com", + "wgpubkey": "CfcxKJFjdKn/idQ/QadOCGHLpcLOLDXr0H+AtA1EqUg=", + "ips": [ + "87.101.94.196" + ] + }, + { + "vpn": "openvpn", "region": "Italy", "city": "Rome", "hostname": "it-006.whiskergalaxy.com", @@ -105429,6 +113100,17 @@ ] }, { + "vpn": "wireguard", + "region": "Italy", + "city": "Rome", + "hostname": "it-006.whiskergalaxy.com", + "wgpubkey": "CfcxKJFjdKn/idQ/QadOCGHLpcLOLDXr0H+AtA1EqUg=", + "ips": [ + "37.120.207.20" + ] + }, + { + "vpn": "openvpn", "region": "Japan", "city": "Tokyo", "hostname": "jp-004.whiskergalaxy.com", @@ -105439,6 +113121,17 @@ ] }, { + "vpn": "wireguard", + "region": "Japan", + "city": "Tokyo", + "hostname": "jp-004.whiskergalaxy.com", + "wgpubkey": "X6LjCVZ41wLoSbWWZpFET+Ejw0VsGuvJ5utU/l3rKl4=", + "ips": [ + "193.148.16.244" + ] + }, + { + "vpn": "openvpn", "region": "Japan", "city": "Tokyo", "hostname": "jp-006.whiskergalaxy.com", @@ -105449,6 +113142,38 @@ ] }, { + "vpn": "wireguard", + "region": "Japan", + "city": "Tokyo", + "hostname": "jp-006.whiskergalaxy.com", + "wgpubkey": "8n68GM7n6dm6Hj3RIIh5q1q6Un52Cq82LYEXHRAtPg4=", + "ips": [ + "138.199.22.163" + ] + }, + { + "vpn": "openvpn", + "region": "Japan", + "city": "Tokyo", + "hostname": "jp-007.whiskergalaxy.com", + "x509": "hnd-148.windscribe.com", + "ips": [ + "143.244.40.225", + "143.244.40.226" + ] + }, + { + "vpn": "wireguard", + "region": "Japan", + "city": "Tokyo", + "hostname": "jp-007.whiskergalaxy.com", + "wgpubkey": "8n68GM7n6dm6Hj3RIIh5q1q6Un52Cq82LYEXHRAtPg4=", + "ips": [ + "143.244.40.227" + ] + }, + { + "vpn": "openvpn", "region": "Latvia", "city": "Riga", "hostname": "lv-003.whiskergalaxy.com", @@ -105459,6 +113184,38 @@ ] }, { + "vpn": "wireguard", + "region": "Latvia", + "city": "Riga", + "hostname": "lv-003.whiskergalaxy.com", + "wgpubkey": "hcn+JR0QAhhUVVRND5Djq35caGmBEGlcp4MX/xlm6HE=", + "ips": [ + "85.254.72.24" + ] + }, + { + "vpn": "openvpn", + "region": "Latvia", + "city": "Riga", + "hostname": "lv-007.whiskergalaxy.com", + "x509": "rix-254.windscribe.com", + "ips": [ + "80.233.134.32", + "85.254.72.213" + ] + }, + { + "vpn": "wireguard", + "region": "Latvia", + "city": "Riga", + "hostname": "lv-007.whiskergalaxy.com", + "wgpubkey": "hcn+JR0QAhhUVVRND5Djq35caGmBEGlcp4MX/xlm6HE=", + "ips": [ + "85.254.72.214" + ] + }, + { + "vpn": "openvpn", "region": "Latvia", "city": "Riga", "hostname": "lv-008.whiskergalaxy.com", @@ -105469,6 +113226,17 @@ ] }, { + "vpn": "wireguard", + "region": "Latvia", + "city": "Riga", + "hostname": "lv-008.whiskergalaxy.com", + "wgpubkey": "hcn+JR0QAhhUVVRND5Djq35caGmBEGlcp4MX/xlm6HE=", + "ips": [ + "85.254.72.239" + ] + }, + { + "vpn": "openvpn", "region": "Lithuania", "city": "Siauliai", "hostname": "lt-007.whiskergalaxy.com", @@ -105479,6 +113247,17 @@ ] }, { + "vpn": "wireguard", + "region": "Lithuania", + "city": "Siauliai", + "hostname": "lt-007.whiskergalaxy.com", + "wgpubkey": "KEVlEKE4qS5w7sJQ7DY3TgqwAgT/47vbZxazkC/F2EQ=", + "ips": [ + "185.64.104.114" + ] + }, + { + "vpn": "openvpn", "region": "Lithuania", "city": "Vilnius", "hostname": "lt-004.whiskergalaxy.com", @@ -105489,6 +113268,17 @@ ] }, { + "vpn": "wireguard", + "region": "Lithuania", + "city": "Vilnius", + "hostname": "lt-004.whiskergalaxy.com", + "wgpubkey": "0CUpqMsVggxsjvdZewCsBFsw84goCitq0G9nytQhpDw=", + "ips": [ + "37.156.216.148" + ] + }, + { + "vpn": "openvpn", "region": "Lithuania", "city": "Vilnius", "hostname": "lt-005.whiskergalaxy.com", @@ -105499,6 +113289,17 @@ ] }, { + "vpn": "wireguard", + "region": "Lithuania", + "city": "Vilnius", + "hostname": "lt-005.whiskergalaxy.com", + "wgpubkey": "0CUpqMsVggxsjvdZewCsBFsw84goCitq0G9nytQhpDw=", + "ips": [ + "37.156.216.132" + ] + }, + { + "vpn": "openvpn", "region": "Malaysia", "city": "Kuala Lumpur", "hostname": "my-001.whiskergalaxy.com", @@ -105509,6 +113310,17 @@ ] }, { + "vpn": "wireguard", + "region": "Malaysia", + "city": "Kuala Lumpur", + "hostname": "my-001.whiskergalaxy.com", + "wgpubkey": "7r3RICLhFxj54Udb9heUGeBoI814UAuaUJwc65IbMnw=", + "ips": [ + "103.106.250.32" + ] + }, + { + "vpn": "openvpn", "region": "Malaysia", "city": "Kuala Lumpur", "hostname": "my-003.whiskergalaxy.com", @@ -105519,6 +113331,17 @@ ] }, { + "vpn": "wireguard", + "region": "Malaysia", + "city": "Kuala Lumpur", + "hostname": "my-003.whiskergalaxy.com", + "wgpubkey": "7r3RICLhFxj54Udb9heUGeBoI814UAuaUJwc65IbMnw=", + "ips": [ + "103.212.69.233" + ] + }, + { + "vpn": "openvpn", "region": "Mexico", "city": "Guadalajara", "hostname": "mx-007.whiskergalaxy.com", @@ -105529,6 +113352,17 @@ ] }, { + "vpn": "wireguard", + "region": "Mexico", + "city": "Guadalajara", + "hostname": "mx-007.whiskergalaxy.com", + "wgpubkey": "1J3f00cdpBeDNBQmfjzUxN/y/x0KyQSZVubCHubokj4=", + "ips": [ + "201.131.125.108" + ] + }, + { + "vpn": "openvpn", "region": "Mexico", "city": "Guadalajara", "hostname": "mx-008.whiskergalaxy.com", @@ -105539,6 +113373,17 @@ ] }, { + "vpn": "wireguard", + "region": "Mexico", + "city": "Guadalajara", + "hostname": "mx-008.whiskergalaxy.com", + "wgpubkey": "1J3f00cdpBeDNBQmfjzUxN/y/x0KyQSZVubCHubokj4=", + "ips": [ + "143.255.57.68" + ] + }, + { + "vpn": "openvpn", "region": "Mexico", "city": "Mexico City", "hostname": "mx-009.whiskergalaxy.com", @@ -105549,6 +113394,17 @@ ] }, { + "vpn": "wireguard", + "region": "Mexico", + "city": "Mexico City", + "hostname": "mx-009.whiskergalaxy.com", + "wgpubkey": "7ENBA/g5BS80C5Y8zoyk9tOMe/MOkvfKztDjzDgjgVc=", + "ips": [ + "190.103.179.212" + ] + }, + { + "vpn": "openvpn", "region": "Mexico", "city": "Mexico City", "hostname": "mx-010.whiskergalaxy.com", @@ -105559,6 +113415,17 @@ ] }, { + "vpn": "wireguard", + "region": "Mexico", + "city": "Mexico City", + "hostname": "mx-010.whiskergalaxy.com", + "wgpubkey": "7ENBA/g5BS80C5Y8zoyk9tOMe/MOkvfKztDjzDgjgVc=", + "ips": [ + "190.103.179.218" + ] + }, + { + "vpn": "openvpn", "region": "Moldova", "city": "Chisinau", "hostname": "md-002.whiskergalaxy.com", @@ -105569,16 +113436,17 @@ ] }, { + "vpn": "wireguard", "region": "Moldova", "city": "Chisinau", - "hostname": "md-003.whiskergalaxy.com", - "x509": "kiv-210.windscribe.com", + "hostname": "md-002.whiskergalaxy.com", + "wgpubkey": "HHDA7gntK+JWWxilBUsDI1FMgeGZtVFKKhbWVIbwMC0=", "ips": [ - "178.175.134.186", - "178.175.134.187" + "178.175.144.124" ] }, { + "vpn": "openvpn", "region": "Netherlands", "city": "Amsterdam", "hostname": "nl-001.whiskergalaxy.com", @@ -105589,6 +113457,17 @@ ] }, { + "vpn": "wireguard", + "region": "Netherlands", + "city": "Amsterdam", + "hostname": "nl-001.whiskergalaxy.com", + "wgpubkey": "cwzVI0WaEnJHhkSzrRdStijZSjVL/fd/jWNxShL0fTo=", + "ips": [ + "46.166.143.99" + ] + }, + { + "vpn": "openvpn", "region": "Netherlands", "city": "Amsterdam", "hostname": "nl-005.whiskergalaxy.com", @@ -105599,6 +113478,17 @@ ] }, { + "vpn": "wireguard", + "region": "Netherlands", + "city": "Amsterdam", + "hostname": "nl-005.whiskergalaxy.com", + "wgpubkey": "c9QHUQhVUNIYqcp5HQ4gwoSoKzAgK8uSsoiJUrlriDA=", + "ips": [ + "185.212.171.132" + ] + }, + { + "vpn": "openvpn", "region": "Netherlands", "city": "Amsterdam", "hostname": "nl-008.whiskergalaxy.com", @@ -105609,6 +113499,17 @@ ] }, { + "vpn": "wireguard", + "region": "Netherlands", + "city": "Amsterdam", + "hostname": "nl-008.whiskergalaxy.com", + "wgpubkey": "c9QHUQhVUNIYqcp5HQ4gwoSoKzAgK8uSsoiJUrlriDA=", + "ips": [ + "185.253.96.4" + ] + }, + { + "vpn": "openvpn", "region": "Netherlands", "city": "Amsterdam", "hostname": "nl-011.whiskergalaxy.com", @@ -105619,6 +113520,17 @@ ] }, { + "vpn": "wireguard", + "region": "Netherlands", + "city": "Amsterdam", + "hostname": "nl-011.whiskergalaxy.com", + "wgpubkey": "pLzFr9exM2Z5oXw0iuKnXIJZxa4I0UEmyFC85sHtDwk=", + "ips": [ + "84.17.46.3" + ] + }, + { + "vpn": "openvpn", "region": "Netherlands", "city": "Amsterdam", "hostname": "nl-013.whiskergalaxy.com", @@ -105629,6 +113541,17 @@ ] }, { + "vpn": "wireguard", + "region": "Netherlands", + "city": "Amsterdam", + "hostname": "nl-013.whiskergalaxy.com", + "wgpubkey": "EN0anJ12SaB6+aNVh1iRNQ9wEqMlwXTDv4OzAGhm1zw=", + "ips": [ + "72.11.157.68" + ] + }, + { + "vpn": "openvpn", "region": "Netherlands", "city": "Amsterdam", "hostname": "nl-014.whiskergalaxy.com", @@ -105639,6 +113562,17 @@ ] }, { + "vpn": "wireguard", + "region": "Netherlands", + "city": "Amsterdam", + "hostname": "nl-014.whiskergalaxy.com", + "wgpubkey": "EN0anJ12SaB6+aNVh1iRNQ9wEqMlwXTDv4OzAGhm1zw=", + "ips": [ + "72.11.157.36" + ] + }, + { + "vpn": "openvpn", "region": "Netherlands", "city": "Amsterdam", "hostname": "nl-015.whiskergalaxy.com", @@ -105649,6 +113583,17 @@ ] }, { + "vpn": "wireguard", + "region": "Netherlands", + "city": "Amsterdam", + "hostname": "nl-015.whiskergalaxy.com", + "wgpubkey": "cwzVI0WaEnJHhkSzrRdStijZSjVL/fd/jWNxShL0fTo=", + "ips": [ + "109.201.130.3" + ] + }, + { + "vpn": "openvpn", "region": "Netherlands", "city": "Amsterdam", "hostname": "nl-019.whiskergalaxy.com", @@ -105659,6 +113604,17 @@ ] }, { + "vpn": "wireguard", + "region": "Netherlands", + "city": "Amsterdam", + "hostname": "nl-019.whiskergalaxy.com", + "wgpubkey": "c9QHUQhVUNIYqcp5HQ4gwoSoKzAgK8uSsoiJUrlriDA=", + "ips": [ + "185.156.172.164" + ] + }, + { + "vpn": "openvpn", "region": "Netherlands", "city": "Amsterdam", "hostname": "nl-020.whiskergalaxy.com", @@ -105669,6 +113625,17 @@ ] }, { + "vpn": "wireguard", + "region": "Netherlands", + "city": "Amsterdam", + "hostname": "nl-020.whiskergalaxy.com", + "wgpubkey": "pLzFr9exM2Z5oXw0iuKnXIJZxa4I0UEmyFC85sHtDwk=", + "ips": [ + "195.181.172.147" + ] + }, + { + "vpn": "openvpn", "region": "New Zealand", "city": "Auckland", "hostname": "nz-002.whiskergalaxy.com", @@ -105679,6 +113646,17 @@ ] }, { + "vpn": "wireguard", + "region": "New Zealand", + "city": "Auckland", + "hostname": "nz-002.whiskergalaxy.com", + "wgpubkey": "LxvdxRlnn73teVay3m0wY8tP1131yCbfnCAftD+p7VE=", + "ips": [ + "103.62.49.114" + ] + }, + { + "vpn": "openvpn", "region": "New Zealand", "city": "Auckland ", "hostname": "nz-003.whiskergalaxy.com", @@ -105689,6 +113667,17 @@ ] }, { + "vpn": "wireguard", + "region": "New Zealand", + "city": "Auckland ", + "hostname": "nz-003.whiskergalaxy.com", + "wgpubkey": "el0He87GLmmywBmn7ErEiuKd5Bjc6Q4zWciL86rYcxw=", + "ips": [ + "103.108.94.164" + ] + }, + { + "vpn": "openvpn", "region": "North Macedonia", "city": "Skopje", "hostname": "mk-001.whiskergalaxy.com", @@ -105699,6 +113688,17 @@ ] }, { + "vpn": "wireguard", + "region": "North Macedonia", + "city": "Skopje", + "hostname": "mk-001.whiskergalaxy.com", + "wgpubkey": "9J0kA4c4i7N/+6B+3j0zFkDTHocZNsw6eK6+sLZ1qCQ=", + "ips": [ + "185.225.28.52" + ] + }, + { + "vpn": "openvpn", "region": "Norway", "city": "Oslo", "hostname": "no-003.whiskergalaxy.com", @@ -105709,6 +113709,17 @@ ] }, { + "vpn": "wireguard", + "region": "Norway", + "city": "Oslo", + "hostname": "no-003.whiskergalaxy.com", + "wgpubkey": "y+Kvlfz0z8DF17hVvEezMml3SH3OaB2l5l09DPdQNCk=", + "ips": [ + "185.206.225.132" + ] + }, + { + "vpn": "openvpn", "region": "Norway", "city": "Oslo", "hostname": "no-006.whiskergalaxy.com", @@ -105719,6 +113730,17 @@ ] }, { + "vpn": "wireguard", + "region": "Norway", + "city": "Oslo", + "hostname": "no-006.whiskergalaxy.com", + "wgpubkey": "y+Kvlfz0z8DF17hVvEezMml3SH3OaB2l5l09DPdQNCk=", + "ips": [ + "37.120.203.68" + ] + }, + { + "vpn": "openvpn", "region": "Norway", "city": "Oslo", "hostname": "no-008.whiskergalaxy.com", @@ -105729,6 +113751,17 @@ ] }, { + "vpn": "wireguard", + "region": "Norway", + "city": "Oslo", + "hostname": "no-008.whiskergalaxy.com", + "wgpubkey": "y+Kvlfz0z8DF17hVvEezMml3SH3OaB2l5l09DPdQNCk=", + "ips": [ + "37.120.149.52" + ] + }, + { + "vpn": "openvpn", "region": "Panama", "city": "Panama City", "hostname": "pa-001.whiskergalaxy.com", @@ -105739,6 +113772,17 @@ ] }, { + "vpn": "wireguard", + "region": "Panama", + "city": "Panama City", + "hostname": "pa-001.whiskergalaxy.com", + "wgpubkey": "3L8yhe+v7TzBeesOFxSdU2VUa8FG4PTuoiiUoV7DAGY=", + "ips": [ + "138.186.142.204" + ] + }, + { + "vpn": "openvpn", "region": "Peru", "city": "Lima", "hostname": "pe-002.whiskergalaxy.com", @@ -105749,6 +113793,17 @@ ] }, { + "vpn": "wireguard", + "region": "Peru", + "city": "Lima", + "hostname": "pe-002.whiskergalaxy.com", + "wgpubkey": "ZrLVHs2FNXanFBtymCd64gZNNixH7k2K5F9+O+xpt0o=", + "ips": [ + "190.120.229.140" + ] + }, + { + "vpn": "openvpn", "region": "Philippines", "city": "Manila", "hostname": "ph-003.whiskergalaxy.com", @@ -105759,6 +113814,17 @@ ] }, { + "vpn": "wireguard", + "region": "Philippines", + "city": "Manila", + "hostname": "ph-003.whiskergalaxy.com", + "wgpubkey": "J2Cy7FP1gYxd3TDaw4xialgPusIxQUfXUYWzqhv/KWI=", + "ips": [ + "141.98.215.212" + ] + }, + { + "vpn": "openvpn", "region": "Philippines", "city": "San Antonio", "hostname": "ph-002.whiskergalaxy.com", @@ -105769,6 +113835,17 @@ ] }, { + "vpn": "wireguard", + "region": "Philippines", + "city": "San Antonio", + "hostname": "ph-002.whiskergalaxy.com", + "wgpubkey": "B+HaL//JFeATFJ4chW+3m8suAdGCrSg+54b+n+auuis=", + "ips": [ + "103.103.0.119" + ] + }, + { + "vpn": "openvpn", "region": "Poland", "city": "Warsaw", "hostname": "pl-002.whiskergalaxy.com", @@ -105779,6 +113856,17 @@ ] }, { + "vpn": "wireguard", + "region": "Poland", + "city": "Warsaw", + "hostname": "pl-002.whiskergalaxy.com", + "wgpubkey": "aZkVfQ47eZjQXlFXaXR/joai25TTXOH0jk8JU4S+718=", + "ips": [ + "185.244.214.36" + ] + }, + { + "vpn": "openvpn", "region": "Poland", "city": "Warsaw", "hostname": "pl-004.whiskergalaxy.com", @@ -105789,6 +113877,17 @@ ] }, { + "vpn": "wireguard", + "region": "Poland", + "city": "Warsaw", + "hostname": "pl-004.whiskergalaxy.com", + "wgpubkey": "MYoOwWssF5fWZ+bOQINzfitdjwyqiHcJhr607wSAzEY=", + "ips": [ + "84.17.55.99" + ] + }, + { + "vpn": "openvpn", "region": "Poland", "city": "Warsaw", "hostname": "pl-005.whiskergalaxy.com", @@ -105799,6 +113898,17 @@ ] }, { + "vpn": "wireguard", + "region": "Poland", + "city": "Warsaw", + "hostname": "pl-005.whiskergalaxy.com", + "wgpubkey": "4RW2y35hBMICisW6aAEnR4ksT7rjOEmFx2+7pjqKuiA=", + "ips": [ + "5.133.11.117" + ] + }, + { + "vpn": "openvpn", "region": "Portugal", "city": "Lisbon", "hostname": "pt-002.whiskergalaxy.com", @@ -105809,6 +113919,17 @@ ] }, { + "vpn": "wireguard", + "region": "Portugal", + "city": "Lisbon", + "hostname": "pt-002.whiskergalaxy.com", + "wgpubkey": "olUvyUS7X592mAkw3tV1g4drB4XyNl7422F5zo6pd0o=", + "ips": [ + "94.46.13.216" + ] + }, + { + "vpn": "openvpn", "region": "Portugal", "city": "Lisbon", "hostname": "pt-003.whiskergalaxy.com", @@ -105819,6 +113940,17 @@ ] }, { + "vpn": "wireguard", + "region": "Portugal", + "city": "Lisbon", + "hostname": "pt-003.whiskergalaxy.com", + "wgpubkey": "olUvyUS7X592mAkw3tV1g4drB4XyNl7422F5zo6pd0o=", + "ips": [ + "185.15.21.67" + ] + }, + { + "vpn": "openvpn", "region": "Romania", "city": "Bucharest", "hostname": "ro-006.whiskergalaxy.com", @@ -105829,6 +113961,17 @@ ] }, { + "vpn": "wireguard", + "region": "Romania", + "city": "Bucharest", + "hostname": "ro-006.whiskergalaxy.com", + "wgpubkey": "eIYiubmBdTz6WEopGNvlou37zzJ4/wD0LgsQudpiAgA=", + "ips": [ + "89.46.103.148" + ] + }, + { + "vpn": "openvpn", "region": "Romania", "city": "Bucharest", "hostname": "ro-008.whiskergalaxy.com", @@ -105839,6 +113982,17 @@ ] }, { + "vpn": "wireguard", + "region": "Romania", + "city": "Bucharest", + "hostname": "ro-008.whiskergalaxy.com", + "wgpubkey": "eIYiubmBdTz6WEopGNvlou37zzJ4/wD0LgsQudpiAgA=", + "ips": [ + "91.207.102.148" + ] + }, + { + "vpn": "openvpn", "region": "Russia", "city": "Moscow", "hostname": "ru-010.whiskergalaxy.com", @@ -105849,6 +114003,17 @@ ] }, { + "vpn": "wireguard", + "region": "Russia", + "city": "Moscow", + "hostname": "ru-010.whiskergalaxy.com", + "wgpubkey": "A557Tcs9ezMHjMO3QoCox2fgcc9/uR/nOjbw28AKqkg=", + "ips": [ + "95.213.193.228" + ] + }, + { + "vpn": "openvpn", "region": "Russia", "city": "Moscow", "hostname": "ru-011.whiskergalaxy.com", @@ -105859,6 +114024,17 @@ ] }, { + "vpn": "wireguard", + "region": "Russia", + "city": "Moscow", + "hostname": "ru-011.whiskergalaxy.com", + "wgpubkey": "A557Tcs9ezMHjMO3QoCox2fgcc9/uR/nOjbw28AKqkg=", + "ips": [ + "95.213.193.196" + ] + }, + { + "vpn": "openvpn", "region": "Russia", "city": "Saint Petersburg", "hostname": "ru-005.whiskergalaxy.com", @@ -105869,6 +114045,17 @@ ] }, { + "vpn": "wireguard", + "region": "Russia", + "city": "Saint Petersburg", + "hostname": "ru-005.whiskergalaxy.com", + "wgpubkey": "Yom91OWyt0otz1S4hgQMhp1q1y8tpDvUWwVkNXpmpjc=", + "ips": [ + "185.22.175.133" + ] + }, + { + "vpn": "openvpn", "region": "Russia", "city": "Saint Petersburg", "hostname": "ru-008.whiskergalaxy.com", @@ -105879,6 +114066,17 @@ ] }, { + "vpn": "wireguard", + "region": "Russia", + "city": "Saint Petersburg", + "hostname": "ru-008.whiskergalaxy.com", + "wgpubkey": "Yom91OWyt0otz1S4hgQMhp1q1y8tpDvUWwVkNXpmpjc=", + "ips": [ + "94.242.62.20" + ] + }, + { + "vpn": "openvpn", "region": "Russia", "city": "Saint Petersburg", "hostname": "ru-009.whiskergalaxy.com", @@ -105889,6 +114087,17 @@ ] }, { + "vpn": "wireguard", + "region": "Russia", + "city": "Saint Petersburg", + "hostname": "ru-009.whiskergalaxy.com", + "wgpubkey": "Yom91OWyt0otz1S4hgQMhp1q1y8tpDvUWwVkNXpmpjc=", + "ips": [ + "94.242.62.68" + ] + }, + { + "vpn": "openvpn", "region": "Russia", "city": "Saint Petersburg", "hostname": "ru-012.whiskergalaxy.com", @@ -105899,6 +114108,17 @@ ] }, { + "vpn": "wireguard", + "region": "Russia", + "city": "Saint Petersburg", + "hostname": "ru-012.whiskergalaxy.com", + "wgpubkey": "gLPWBcPANL0mgwEkImb6PUJmR2ncz7S9DKIDDYvgJkk=", + "ips": [ + "188.124.42.116" + ] + }, + { + "vpn": "openvpn", "region": "Russia", "city": "Saint Petersburg", "hostname": "ru-013.whiskergalaxy.com", @@ -105909,6 +114129,17 @@ ] }, { + "vpn": "wireguard", + "region": "Russia", + "city": "Saint Petersburg", + "hostname": "ru-013.whiskergalaxy.com", + "wgpubkey": "gLPWBcPANL0mgwEkImb6PUJmR2ncz7S9DKIDDYvgJkk=", + "ips": [ + "188.124.42.100" + ] + }, + { + "vpn": "openvpn", "region": "Serbia", "city": "Belgrade", "hostname": "rs-003.whiskergalaxy.com", @@ -105919,6 +114150,17 @@ ] }, { + "vpn": "wireguard", + "region": "Serbia", + "city": "Belgrade", + "hostname": "rs-003.whiskergalaxy.com", + "wgpubkey": "SZAf6bGig5dmm+dihnqRQMOEr27FK9NG8Vklmj3IQ0o=", + "ips": [ + "141.98.103.20" + ] + }, + { + "vpn": "openvpn", "region": "Singapore", "city": "Singapore", "hostname": "sg-003.whiskergalaxy.com", @@ -105929,6 +114171,17 @@ ] }, { + "vpn": "wireguard", + "region": "Singapore", + "city": "Singapore", + "hostname": "sg-003.whiskergalaxy.com", + "wgpubkey": "ePfazP+V1DkyyzK2VpSKS1JFiChU2TpO6jyYOmjnRAw=", + "ips": [ + "185.200.117.164" + ] + }, + { + "vpn": "openvpn", "region": "Singapore", "city": "Singapore", "hostname": "sg-004.whiskergalaxy.com", @@ -105939,6 +114192,17 @@ ] }, { + "vpn": "wireguard", + "region": "Singapore", + "city": "Singapore", + "hostname": "sg-004.whiskergalaxy.com", + "wgpubkey": "ePfazP+V1DkyyzK2VpSKS1JFiChU2TpO6jyYOmjnRAw=", + "ips": [ + "82.102.25.132" + ] + }, + { + "vpn": "openvpn", "region": "Singapore", "city": "Singapore", "hostname": "sg-005.whiskergalaxy.com", @@ -105949,6 +114213,17 @@ ] }, { + "vpn": "wireguard", + "region": "Singapore", + "city": "Singapore", + "hostname": "sg-005.whiskergalaxy.com", + "wgpubkey": "tJa6iPx6mpOktn5KoalMslWcpg6pRUdVx3bKDi3wtDg=", + "ips": [ + "103.62.48.225" + ] + }, + { + "vpn": "openvpn", "region": "Singapore", "city": "Singapore", "hostname": "sg-006.whiskergalaxy.com", @@ -105959,6 +114234,17 @@ ] }, { + "vpn": "wireguard", + "region": "Singapore", + "city": "Singapore", + "hostname": "sg-006.whiskergalaxy.com", + "wgpubkey": "sv9o+LudivUcZh3f92hEFFu5KGCT/2QISYy3OpPC0h0=", + "ips": [ + "156.146.56.99" + ] + }, + { + "vpn": "openvpn", "region": "Singapore", "city": "Singapore", "hostname": "sg-007.whiskergalaxy.com", @@ -105969,6 +114255,17 @@ ] }, { + "vpn": "wireguard", + "region": "Singapore", + "city": "Singapore", + "hostname": "sg-007.whiskergalaxy.com", + "wgpubkey": "sv9o+LudivUcZh3f92hEFFu5KGCT/2QISYy3OpPC0h0=", + "ips": [ + "156.146.56.112" + ] + }, + { + "vpn": "openvpn", "region": "Singapore", "city": "Singapore", "hostname": "sg-008.whiskergalaxy.com", @@ -105979,6 +114276,17 @@ ] }, { + "vpn": "wireguard", + "region": "Singapore", + "city": "Singapore", + "hostname": "sg-008.whiskergalaxy.com", + "wgpubkey": "tJa6iPx6mpOktn5KoalMslWcpg6pRUdVx3bKDi3wtDg=", + "ips": [ + "103.107.198.228" + ] + }, + { + "vpn": "openvpn", "region": "Slovakia", "city": "Bratislava", "hostname": "sk-001.whiskergalaxy.com", @@ -105989,6 +114297,17 @@ ] }, { + "vpn": "wireguard", + "region": "Slovakia", + "city": "Bratislava", + "hostname": "sk-001.whiskergalaxy.com", + "wgpubkey": "87RdB427Hxehe3ePG8mSpPBsdwGgKWwAkEtbleThckw=", + "ips": [ + "185.245.85.4" + ] + }, + { + "vpn": "openvpn", "region": "South Africa", "city": "Johannesburg", "hostname": "za-001.whiskergalaxy.com", @@ -105999,6 +114318,17 @@ ] }, { + "vpn": "wireguard", + "region": "South Africa", + "city": "Johannesburg", + "hostname": "za-001.whiskergalaxy.com", + "wgpubkey": "Nh5LEJT44xbuvTQnv3OZ0bXi09BFXV4SBB1XVMI12Ec=", + "ips": [ + "197.242.157.255" + ] + }, + { + "vpn": "openvpn", "region": "South Africa", "city": "Johannesburg", "hostname": "za-002.whiskergalaxy.com", @@ -106009,6 +114339,38 @@ ] }, { + "vpn": "wireguard", + "region": "South Africa", + "city": "Johannesburg", + "hostname": "za-002.whiskergalaxy.com", + "wgpubkey": "y0Zob2BVW8kIJwWE1LPlsQuqahLwf/iLGtAddffWKDY=", + "ips": [ + "129.232.167.212" + ] + }, + { + "vpn": "openvpn", + "region": "South Africa", + "city": "Johannesburg", + "hostname": "za-003.whiskergalaxy.com", + "x509": "jnb-164.windscribe.com", + "ips": [ + "197.242.155.197", + "197.242.156.53" + ] + }, + { + "vpn": "wireguard", + "region": "South Africa", + "city": "Johannesburg", + "hostname": "za-003.whiskergalaxy.com", + "wgpubkey": "Nh5LEJT44xbuvTQnv3OZ0bXi09BFXV4SBB1XVMI12Ec=", + "ips": [ + "197.242.156.56" + ] + }, + { + "vpn": "openvpn", "region": "South Africa", "city": "Johannesburg", "hostname": "za-004.whiskergalaxy.com", @@ -106019,6 +114381,38 @@ ] }, { + "vpn": "wireguard", + "region": "South Africa", + "city": "Johannesburg", + "hostname": "za-004.whiskergalaxy.com", + "wgpubkey": "stPvzj5yM1z5Qg9H3gMvAKNPJLU0X3SeUSJPg3wqDR8=", + "ips": [ + "165.73.248.92" + ] + }, + { + "vpn": "openvpn", + "region": "South Africa", + "city": "Johannesburg", + "hostname": "za-005.whiskergalaxy.com", + "x509": "jnb-216.windscribe.com", + "ips": [ + "129.232.131.170", + "129.232.131.171" + ] + }, + { + "vpn": "wireguard", + "region": "South Africa", + "city": "Johannesburg", + "hostname": "za-005.whiskergalaxy.com", + "wgpubkey": "y0Zob2BVW8kIJwWE1LPlsQuqahLwf/iLGtAddffWKDY=", + "ips": [ + "129.232.131.172" + ] + }, + { + "vpn": "openvpn", "region": "South Korea", "city": "Seoul", "hostname": "kr-001.whiskergalaxy.com", @@ -106029,6 +114423,17 @@ ] }, { + "vpn": "wireguard", + "region": "South Korea", + "city": "Seoul", + "hostname": "kr-001.whiskergalaxy.com", + "wgpubkey": "lHYaK5YoHyzvXYUKDbSd6BExb9BSkFfQsYsAn8drbCg=", + "ips": [ + "103.212.223.4" + ] + }, + { + "vpn": "openvpn", "region": "South Korea", "city": "Seoul", "hostname": "kr-002.whiskergalaxy.com", @@ -106039,6 +114444,17 @@ ] }, { + "vpn": "wireguard", + "region": "South Korea", + "city": "Seoul", + "hostname": "kr-002.whiskergalaxy.com", + "wgpubkey": "RVOTg3bu/bDnGE9YYpYv17KejYjGt7/38LeIQW4aLEU=", + "ips": [ + "218.232.76.180" + ] + }, + { + "vpn": "openvpn", "region": "South Korea", "city": "Seoul", "hostname": "kr-006.whiskergalaxy.com", @@ -106049,6 +114465,17 @@ ] }, { + "vpn": "wireguard", + "region": "South Korea", + "city": "Seoul", + "hostname": "kr-006.whiskergalaxy.com", + "wgpubkey": "lHYaK5YoHyzvXYUKDbSd6BExb9BSkFfQsYsAn8drbCg=", + "ips": [ + "27.255.77.243" + ] + }, + { + "vpn": "openvpn", "region": "South Korea", "city": "Seoul", "hostname": "kr-007.whiskergalaxy.com", @@ -106059,6 +114486,17 @@ ] }, { + "vpn": "wireguard", + "region": "South Korea", + "city": "Seoul", + "hostname": "kr-007.whiskergalaxy.com", + "wgpubkey": "RVOTg3bu/bDnGE9YYpYv17KejYjGt7/38LeIQW4aLEU=", + "ips": [ + "218.232.76.138" + ] + }, + { + "vpn": "openvpn", "region": "South Korea", "city": "Seoul", "hostname": "kr-008.whiskergalaxy.com", @@ -106069,6 +114507,17 @@ ] }, { + "vpn": "wireguard", + "region": "South Korea", + "city": "Seoul", + "hostname": "kr-008.whiskergalaxy.com", + "wgpubkey": "rtk1/cMCEyJw9xgs6v0ef0rsk2bwi+sI/zgbo+gLkko=", + "ips": [ + "141.98.213.252" + ] + }, + { + "vpn": "openvpn", "region": "Spain", "city": "Barcelona", "hostname": "es-001.whiskergalaxy.com", @@ -106079,6 +114528,17 @@ ] }, { + "vpn": "wireguard", + "region": "Spain", + "city": "Barcelona", + "hostname": "es-001.whiskergalaxy.com", + "wgpubkey": "IdglMouv0zOaeA+oNqoN5Gk2I8h4zWlmRxH5qwDFBUI=", + "ips": [ + "185.253.99.132" + ] + }, + { + "vpn": "openvpn", "region": "Spain", "city": "Barcelona", "hostname": "es-004.whiskergalaxy.com", @@ -106089,6 +114549,17 @@ ] }, { + "vpn": "wireguard", + "region": "Spain", + "city": "Barcelona", + "hostname": "es-004.whiskergalaxy.com", + "wgpubkey": "IdglMouv0zOaeA+oNqoN5Gk2I8h4zWlmRxH5qwDFBUI=", + "ips": [ + "37.120.142.228" + ] + }, + { + "vpn": "openvpn", "region": "Spain", "city": "Madrid", "hostname": "es-002.whiskergalaxy.com", @@ -106099,6 +114570,17 @@ ] }, { + "vpn": "wireguard", + "region": "Spain", + "city": "Madrid", + "hostname": "es-002.whiskergalaxy.com", + "wgpubkey": "3AuxTNwzilEtwUvEd71zqbjjBuGD/XcnOEPnVLn2gWQ=", + "ips": [ + "89.238.178.44" + ] + }, + { + "vpn": "openvpn", "region": "Spain", "city": "Madrid", "hostname": "es-003.whiskergalaxy.com", @@ -106109,6 +114591,17 @@ ] }, { + "vpn": "wireguard", + "region": "Spain", + "city": "Madrid", + "hostname": "es-003.whiskergalaxy.com", + "wgpubkey": "3AuxTNwzilEtwUvEd71zqbjjBuGD/XcnOEPnVLn2gWQ=", + "ips": [ + "217.138.218.100" + ] + }, + { + "vpn": "openvpn", "region": "Sweden", "city": "Stockholm", "hostname": "se-001.whiskergalaxy.com", @@ -106119,6 +114612,17 @@ ] }, { + "vpn": "wireguard", + "region": "Sweden", + "city": "Stockholm", + "hostname": "se-001.whiskergalaxy.com", + "wgpubkey": "PE9KAfm60yg/rr247eAsZb+gVJxrN4NeQLT6sIdYyDc=", + "ips": [ + "31.13.191.68" + ] + }, + { + "vpn": "openvpn", "region": "Sweden", "city": "Stockholm", "hostname": "se-002.whiskergalaxy.com", @@ -106129,6 +114633,17 @@ ] }, { + "vpn": "wireguard", + "region": "Sweden", + "city": "Stockholm", + "hostname": "se-002.whiskergalaxy.com", + "wgpubkey": "P5X43E/SgvnJtbrKnJwLFxqFoZGsCghW2SxlXvfdzm0=", + "ips": [ + "79.142.76.199" + ] + }, + { + "vpn": "openvpn", "region": "Sweden", "city": "Stockholm", "hostname": "se-003.whiskergalaxy.com", @@ -106139,6 +114654,17 @@ ] }, { + "vpn": "wireguard", + "region": "Sweden", + "city": "Stockholm", + "hostname": "se-003.whiskergalaxy.com", + "wgpubkey": "HENIT1CTAKjPrhG4s64jPJSzEjtEZPRARxA3amm49WU=", + "ips": [ + "195.181.166.130" + ] + }, + { + "vpn": "openvpn", "region": "Sweden", "city": "Stockholm", "hostname": "se-004.whiskergalaxy.com", @@ -106149,6 +114675,17 @@ ] }, { + "vpn": "wireguard", + "region": "Sweden", + "city": "Stockholm", + "hostname": "se-004.whiskergalaxy.com", + "wgpubkey": "PE9KAfm60yg/rr247eAsZb+gVJxrN4NeQLT6sIdYyDc=", + "ips": [ + "146.70.16.244" + ] + }, + { + "vpn": "openvpn", "region": "Switzerland", "city": "Zurich", "hostname": "ch-001.whiskergalaxy.com", @@ -106159,6 +114696,17 @@ ] }, { + "vpn": "wireguard", + "region": "Switzerland", + "city": "Zurich", + "hostname": "ch-001.whiskergalaxy.com", + "wgpubkey": "3+ehrqWHaqA4lC10BRkscYasaewB2eamMSRda+HSkxQ=", + "ips": [ + "31.7.57.243" + ] + }, + { + "vpn": "openvpn", "region": "Switzerland", "city": "Zurich", "hostname": "ch-003.whiskergalaxy.com", @@ -106169,6 +114717,17 @@ ] }, { + "vpn": "wireguard", + "region": "Switzerland", + "city": "Zurich", + "hostname": "ch-003.whiskergalaxy.com", + "wgpubkey": "uFOg97vQhHVCUfZy/HwmGH+dR6/9lpeWZ5tV3PysHRE=", + "ips": [ + "185.156.175.180" + ] + }, + { + "vpn": "openvpn", "region": "Switzerland", "city": "Zurich", "hostname": "ch-005.whiskergalaxy.com", @@ -106179,6 +114738,17 @@ ] }, { + "vpn": "wireguard", + "region": "Switzerland", + "city": "Zurich", + "hostname": "ch-005.whiskergalaxy.com", + "wgpubkey": "G7LkwWk08Ase/Wi9mnOW77brNBC0vTCemvy1IW1nlV4=", + "ips": [ + "89.187.165.99" + ] + }, + { + "vpn": "openvpn", "region": "Switzerland", "city": "Zurich", "hostname": "ch-006.whiskergalaxy.com", @@ -106189,6 +114759,17 @@ ] }, { + "vpn": "wireguard", + "region": "Switzerland", + "city": "Zurich", + "hostname": "ch-006.whiskergalaxy.com", + "wgpubkey": "G7LkwWk08Ase/Wi9mnOW77brNBC0vTCemvy1IW1nlV4=", + "ips": [ + "84.17.53.3" + ] + }, + { + "vpn": "openvpn", "region": "Switzerland", "city": "Zurich", "hostname": "ch-008.whiskergalaxy.com", @@ -106199,6 +114780,17 @@ ] }, { + "vpn": "wireguard", + "region": "Switzerland", + "city": "Zurich", + "hostname": "ch-008.whiskergalaxy.com", + "wgpubkey": "uFOg97vQhHVCUfZy/HwmGH+dR6/9lpeWZ5tV3PysHRE=", + "ips": [ + "37.120.213.164" + ] + }, + { + "vpn": "openvpn", "region": "Taiwan", "city": "Taipei", "hostname": "tw-008.whiskergalaxy.com", @@ -106209,6 +114801,17 @@ ] }, { + "vpn": "wireguard", + "region": "Taiwan", + "city": "Taipei", + "hostname": "tw-008.whiskergalaxy.com", + "wgpubkey": "dAAkV3G3YFurH3+3198clav9vlh4FxB1asqNc0tLeCk=", + "ips": [ + "103.4.29.78" + ] + }, + { + "vpn": "openvpn", "region": "Taiwan", "city": "Taipei", "hostname": "tw-009.whiskergalaxy.com", @@ -106219,6 +114822,17 @@ ] }, { + "vpn": "wireguard", + "region": "Taiwan", + "city": "Taipei", + "hostname": "tw-009.whiskergalaxy.com", + "wgpubkey": "dAAkV3G3YFurH3+3198clav9vlh4FxB1asqNc0tLeCk=", + "ips": [ + "185.189.160.13" + ] + }, + { + "vpn": "openvpn", "region": "Taiwan", "city": "Taipei", "hostname": "tw-010.whiskergalaxy.com", @@ -106229,6 +114843,17 @@ ] }, { + "vpn": "wireguard", + "region": "Taiwan", + "city": "Taipei", + "hostname": "tw-010.whiskergalaxy.com", + "wgpubkey": "dAAkV3G3YFurH3+3198clav9vlh4FxB1asqNc0tLeCk=", + "ips": [ + "185.189.161.50" + ] + }, + { + "vpn": "openvpn", "region": "Taiwan", "city": "Taipei", "hostname": "tw-011.whiskergalaxy.com", @@ -106239,6 +114864,17 @@ ] }, { + "vpn": "wireguard", + "region": "Taiwan", + "city": "Taipei", + "hostname": "tw-011.whiskergalaxy.com", + "wgpubkey": "dAAkV3G3YFurH3+3198clav9vlh4FxB1asqNc0tLeCk=", + "ips": [ + "185.189.161.51" + ] + }, + { + "vpn": "openvpn", "region": "Thailand", "city": "Bangkok", "hostname": "th-003.whiskergalaxy.com", @@ -106249,6 +114885,17 @@ ] }, { + "vpn": "wireguard", + "region": "Thailand", + "city": "Bangkok", + "hostname": "th-003.whiskergalaxy.com", + "wgpubkey": "R0DcCsuFG3sgugDVRnt6vy28z+AP9r1ygYIw0pJApGs=", + "ips": [ + "27.254.130.222" + ] + }, + { + "vpn": "openvpn", "region": "Thailand", "city": "Bangkok", "hostname": "th-005.whiskergalaxy.com", @@ -106259,6 +114906,17 @@ ] }, { + "vpn": "wireguard", + "region": "Thailand", + "city": "Bangkok", + "hostname": "th-005.whiskergalaxy.com", + "wgpubkey": "DUUQLXeyl2nC4PCBQ07YsQOStFzr3P2BooWkNu318SA=", + "ips": [ + "202.129.16.149" + ] + }, + { + "vpn": "openvpn", "region": "Thailand", "city": "Bangkok", "hostname": "th-006.whiskergalaxy.com", @@ -106269,6 +114927,17 @@ ] }, { + "vpn": "wireguard", + "region": "Thailand", + "city": "Bangkok", + "hostname": "th-006.whiskergalaxy.com", + "wgpubkey": "DUUQLXeyl2nC4PCBQ07YsQOStFzr3P2BooWkNu318SA=", + "ips": [ + "202.129.16.156" + ] + }, + { + "vpn": "openvpn", "region": "Turkey", "city": "Bursa", "hostname": "tr-001.whiskergalaxy.com", @@ -106279,6 +114948,17 @@ ] }, { + "vpn": "wireguard", + "region": "Turkey", + "city": "Bursa", + "hostname": "tr-001.whiskergalaxy.com", + "wgpubkey": "ST6xQmd7dcCl8HuR7jBRpAEyc2IOgpVE605uPTIycQg=", + "ips": [ + "45.123.118.157" + ] + }, + { + "vpn": "openvpn", "region": "Turkey", "city": "Istanbul", "hostname": "tr-004.whiskergalaxy.com", @@ -106289,6 +114969,17 @@ ] }, { + "vpn": "wireguard", + "region": "Turkey", + "city": "Istanbul", + "hostname": "tr-004.whiskergalaxy.com", + "wgpubkey": "jJUwb5Ekpn3w4fqZiCjO6GDRQ882AeiLjvDx5tYOfTw=", + "ips": [ + "45.123.119.12" + ] + }, + { + "vpn": "openvpn", "region": "Turkey", "city": "Istanbul", "hostname": "tr-009.whiskergalaxy.com", @@ -106299,6 +114990,17 @@ ] }, { + "vpn": "wireguard", + "region": "Turkey", + "city": "Istanbul", + "hostname": "tr-009.whiskergalaxy.com", + "wgpubkey": "7iM2nW8rqa4RS7pIlqLx1P0/YvyckwcCVLv+ULsT+iY=", + "ips": [ + "79.98.131.44" + ] + }, + { + "vpn": "openvpn", "region": "Turkey", "city": "Istanbul", "hostname": "tr-011.whiskergalaxy.com", @@ -106309,6 +115011,17 @@ ] }, { + "vpn": "wireguard", + "region": "Turkey", + "city": "Istanbul", + "hostname": "tr-011.whiskergalaxy.com", + "wgpubkey": "PERLcFu5JMk3Cdt4sb45epMLasXqa0+PqRseBKMYMEc=", + "ips": [ + "176.53.113.164" + ] + }, + { + "vpn": "openvpn", "region": "Turkey", "city": "Istanbul", "hostname": "tr-013.whiskergalaxy.com", @@ -106319,6 +115032,17 @@ ] }, { + "vpn": "wireguard", + "region": "Turkey", + "city": "Istanbul", + "hostname": "tr-013.whiskergalaxy.com", + "wgpubkey": "PERLcFu5JMk3Cdt4sb45epMLasXqa0+PqRseBKMYMEc=", + "ips": [ + "46.45.136.100" + ] + }, + { + "vpn": "openvpn", "region": "Turkey", "city": "Istanbul", "hostname": "tr-014.whiskergalaxy.com", @@ -106329,6 +115053,17 @@ ] }, { + "vpn": "wireguard", + "region": "Turkey", + "city": "Istanbul", + "hostname": "tr-014.whiskergalaxy.com", + "wgpubkey": "PERLcFu5JMk3Cdt4sb45epMLasXqa0+PqRseBKMYMEc=", + "ips": [ + "178.211.33.244" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-015.whiskergalaxy.com", @@ -106339,6 +115074,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-015.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "107.150.31.132" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-016.whiskergalaxy.com", @@ -106349,6 +115095,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-016.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "104.129.18.4" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-020.whiskergalaxy.com", @@ -106359,6 +115116,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-020.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "104.129.18.132" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-034.whiskergalaxy.com", @@ -106369,6 +115137,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-034.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "161.129.70.196" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-046.whiskergalaxy.com", @@ -106379,6 +115158,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-046.whiskergalaxy.com", + "wgpubkey": "v8yTgxOMZjdZkCUoBVMUOiDBYgaNzQ9OfXc+uz2GUDc=", + "ips": [ + "198.12.76.212" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-049.whiskergalaxy.com", @@ -106389,6 +115179,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-049.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "107.150.31.4" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-050.whiskergalaxy.com", @@ -106399,6 +115200,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-050.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "107.150.31.68" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-054.whiskergalaxy.com", @@ -106409,6 +115221,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-054.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "104.223.92.164" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-056.whiskergalaxy.com", @@ -106419,6 +115242,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-056.whiskergalaxy.com", + "wgpubkey": "v8yTgxOMZjdZkCUoBVMUOiDBYgaNzQ9OfXc+uz2GUDc=", + "ips": [ + "206.217.143.132" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-070.whiskergalaxy.com", @@ -106429,6 +115263,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-070.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "107.150.30.196" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-075.whiskergalaxy.com", @@ -106439,6 +115284,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-075.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "104.223.95.100" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-077.whiskergalaxy.com", @@ -106449,6 +115305,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-077.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "162.222.198.132" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-087.whiskergalaxy.com", @@ -106459,6 +115326,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-087.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "104.223.93.132" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-088.whiskergalaxy.com", @@ -106469,6 +115347,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-088.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "155.94.216.132" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Atlanta", "hostname": "us-central-089.whiskergalaxy.com", @@ -106479,6 +115368,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Atlanta", + "hostname": "us-central-089.whiskergalaxy.com", + "wgpubkey": "D2Tx/zEgTy2uoH2HLp5EBIFyLkHGEhkhLMYYedpcUFw=", + "ips": [ + "155.94.216.196" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-014.whiskergalaxy.com", @@ -106489,6 +115389,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-014.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "69.12.94.68" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-029.whiskergalaxy.com", @@ -106499,6 +115410,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-029.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "198.55.125.196" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-036.whiskergalaxy.com", @@ -106509,6 +115431,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-036.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "204.44.112.68" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-037.whiskergalaxy.com", @@ -106519,6 +115452,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-037.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "204.44.112.132" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-044.whiskergalaxy.com", @@ -106529,6 +115473,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-044.whiskergalaxy.com", + "wgpubkey": "47tLjymDPpTIBerb+wn02/XNFABF4YDAGwOnijSoZmQ=", + "ips": [ + "206.217.139.196" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-045.whiskergalaxy.com", @@ -106539,6 +115494,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-045.whiskergalaxy.com", + "wgpubkey": "OhfZprfgCdrELOzmZyXaVa35AssZyYkzNiAeulqIXis=", + "ips": [ + "172.241.131.130" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-055.whiskergalaxy.com", @@ -106549,6 +115515,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-055.whiskergalaxy.com", + "wgpubkey": "47tLjymDPpTIBerb+wn02/XNFABF4YDAGwOnijSoZmQ=", + "ips": [ + "206.217.139.20" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-057.whiskergalaxy.com", @@ -106559,6 +115536,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-057.whiskergalaxy.com", + "wgpubkey": "OhfZprfgCdrELOzmZyXaVa35AssZyYkzNiAeulqIXis=", + "ips": [ + "172.241.26.79" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-060.whiskergalaxy.com", @@ -106569,6 +115557,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-060.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "198.55.126.132" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-067.whiskergalaxy.com", @@ -106579,6 +115578,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-067.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "104.223.98.196" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-072.whiskergalaxy.com", @@ -106589,6 +115599,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-072.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "162.218.120.68" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-073.whiskergalaxy.com", @@ -106599,6 +115620,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-073.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "173.254.250.68" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-078.whiskergalaxy.com", @@ -106609,6 +115641,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-078.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "155.94.248.68" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-079.whiskergalaxy.com", @@ -106619,6 +115662,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-079.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "192.161.189.132" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-080.whiskergalaxy.com", @@ -106629,6 +115683,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-080.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "192.161.188.196" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Dallas", "hostname": "us-central-081.whiskergalaxy.com", @@ -106639,6 +115704,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Dallas", + "hostname": "us-central-081.whiskergalaxy.com", + "wgpubkey": "pASG4FD9LwOfJukT/wYbUF10gD6v8DVuv5hrNbiOnHQ=", + "ips": [ + "155.94.249.68" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Denver", "hostname": "us-central-043.whiskergalaxy.com", @@ -106649,6 +115725,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Denver", + "hostname": "us-central-043.whiskergalaxy.com", + "wgpubkey": "xS6I4AqciTxU4Aox8HiudDs44kpHEuWe+BDc6ifO610=", + "ips": [ + "199.115.96.84" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Denver", "hostname": "us-central-058.whiskergalaxy.com", @@ -106659,6 +115746,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Denver", + "hostname": "us-central-058.whiskergalaxy.com", + "wgpubkey": "c31sdkhmVsucRVa6nSNNSiZ2UHHLdUhq5gvfdJxSnFw=", + "ips": [ + "198.54.128.117" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Denver", "hostname": "us-central-062.whiskergalaxy.com", @@ -106669,6 +115767,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Denver", + "hostname": "us-central-062.whiskergalaxy.com", + "wgpubkey": "xS6I4AqciTxU4Aox8HiudDs44kpHEuWe+BDc6ifO610=", + "ips": [ + "174.128.251.148" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Denver", "hostname": "us-central-071.whiskergalaxy.com", @@ -106679,6 +115788,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Denver", + "hostname": "us-central-071.whiskergalaxy.com", + "wgpubkey": "c31sdkhmVsucRVa6nSNNSiZ2UHHLdUhq5gvfdJxSnFw=", + "ips": [ + "198.54.128.197" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Kansas City", "hostname": "us-central-063.whiskergalaxy.com", @@ -106689,6 +115809,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Kansas City", + "hostname": "us-central-063.whiskergalaxy.com", + "wgpubkey": "0VAbqR6QprUwYMbgo1Xuel23UzzibC7OIxDJYAe3wx4=", + "ips": [ + "38.146.5.52" + ] + }, + { + "vpn": "openvpn", "region": "US Central", "city": "Kansas City", "hostname": "us-central-086.whiskergalaxy.com", @@ -106699,6 +115830,17 @@ ] }, { + "vpn": "wireguard", + "region": "US Central", + "city": "Kansas City", + "hostname": "us-central-086.whiskergalaxy.com", + "wgpubkey": "0VAbqR6QprUwYMbgo1Xuel23UzzibC7OIxDJYAe3wx4=", + "ips": [ + "38.146.5.116" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Boston", "hostname": "us-east-039.whiskergalaxy.com", @@ -106709,6 +115851,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Boston", + "hostname": "us-east-039.whiskergalaxy.com", + "wgpubkey": "5yBJlSpfxd8Hq4+X4ZD60MYc6tosaMh5inQwA18XCCk=", + "ips": [ + "199.217.104.228" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Boston", "hostname": "us-east-051.whiskergalaxy.com", @@ -106719,6 +115872,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Boston", + "hostname": "us-east-051.whiskergalaxy.com", + "wgpubkey": "5yBJlSpfxd8Hq4+X4ZD60MYc6tosaMh5inQwA18XCCk=", + "ips": [ + "199.217.105.228" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Buffalo", "hostname": "us-east-045.whiskergalaxy.com", @@ -106729,6 +115893,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Buffalo", + "hostname": "us-east-045.whiskergalaxy.com", + "wgpubkey": "z77o+FZ5AcTxTvkNyjLv69ZqaQtzFoS6UdtTK1eyoE8=", + "ips": [ + "104.168.34.148" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Buffalo", "hostname": "us-east-065.whiskergalaxy.com", @@ -106739,6 +115914,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Buffalo", + "hostname": "us-east-065.whiskergalaxy.com", + "wgpubkey": "z77o+FZ5AcTxTvkNyjLv69ZqaQtzFoS6UdtTK1eyoE8=", + "ips": [ + "198.12.64.36" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Charlotte", "hostname": "us-east-040.whiskergalaxy.com", @@ -106749,6 +115935,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Charlotte", + "hostname": "us-east-040.whiskergalaxy.com", + "wgpubkey": "FUPy5mxwpV0z7j5d1Pqb37wHcyuqcCKSRDTBu/8kezc=", + "ips": [ + "67.21.32.146" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Charlotte", "hostname": "us-east-100.whiskergalaxy.com", @@ -106759,6 +115956,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Charlotte", + "hostname": "us-east-100.whiskergalaxy.com", + "wgpubkey": "FUPy5mxwpV0z7j5d1Pqb37wHcyuqcCKSRDTBu/8kezc=", + "ips": [ + "192.158.226.16" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Chicago", "hostname": "us-east-015.whiskergalaxy.com", @@ -106769,6 +115977,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Chicago", + "hostname": "us-east-015.whiskergalaxy.com", + "wgpubkey": "6O1bKP+apj/JT/aV++aODc1+EHlPO+c0xGyfKXE+k14=", + "ips": [ + "68.235.50.228" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Chicago", "hostname": "us-east-019.whiskergalaxy.com", @@ -106779,6 +115998,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Chicago", + "hostname": "us-east-019.whiskergalaxy.com", + "wgpubkey": "qt+nrPNqLaB7dNOKD3JWvkG4JbgZgKfHZv7t0818LTg=", + "ips": [ + "23.226.141.196" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Chicago", "hostname": "us-east-022.whiskergalaxy.com", @@ -106789,6 +116019,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Chicago", + "hostname": "us-east-022.whiskergalaxy.com", + "wgpubkey": "qt+nrPNqLaB7dNOKD3JWvkG4JbgZgKfHZv7t0818LTg=", + "ips": [ + "167.160.172.4" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Chicago", "hostname": "us-east-047.whiskergalaxy.com", @@ -106799,6 +116040,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Chicago", + "hostname": "us-east-047.whiskergalaxy.com", + "wgpubkey": "5LYbbr320XMoXPrLsZex+2cDAMUOnzX5Htpcgb4Uc1c=", + "ips": [ + "23.83.91.171" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Chicago", "hostname": "us-east-053.whiskergalaxy.com", @@ -106809,6 +116061,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Chicago", + "hostname": "us-east-053.whiskergalaxy.com", + "wgpubkey": "qt+nrPNqLaB7dNOKD3JWvkG4JbgZgKfHZv7t0818LTg=", + "ips": [ + "107.150.29.132" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Chicago", "hostname": "us-east-071.whiskergalaxy.com", @@ -106819,6 +116082,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Chicago", + "hostname": "us-east-071.whiskergalaxy.com", + "wgpubkey": "6O1bKP+apj/JT/aV++aODc1+EHlPO+c0xGyfKXE+k14=", + "ips": [ + "68.235.35.13" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Chicago", "hostname": "us-east-077.whiskergalaxy.com", @@ -106829,6 +116103,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Chicago", + "hostname": "us-east-077.whiskergalaxy.com", + "wgpubkey": "6O1bKP+apj/JT/aV++aODc1+EHlPO+c0xGyfKXE+k14=", + "ips": [ + "68.235.43.205" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Chicago", "hostname": "us-east-083.whiskergalaxy.com", @@ -106839,6 +116124,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Chicago", + "hostname": "us-east-083.whiskergalaxy.com", + "wgpubkey": "5LYbbr320XMoXPrLsZex+2cDAMUOnzX5Htpcgb4Uc1c=", + "ips": [ + "23.19.122.226" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Chicago", "hostname": "us-east-086.whiskergalaxy.com", @@ -106849,6 +116145,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Chicago", + "hostname": "us-east-086.whiskergalaxy.com", + "wgpubkey": "6O1bKP+apj/JT/aV++aODc1+EHlPO+c0xGyfKXE+k14=", + "ips": [ + "208.77.22.101" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Cleveland", "hostname": "us-east-078.whiskergalaxy.com", @@ -106859,6 +116166,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Cleveland", + "hostname": "us-east-078.whiskergalaxy.com", + "wgpubkey": "Ptieqs4YovU0Jxgu9d7rSTapQPp7G+8GYWiwaf8jPlA=", + "ips": [ + "38.101.74.20" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Cleveland", "hostname": "us-east-099.whiskergalaxy.com", @@ -106869,6 +116187,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Cleveland", + "hostname": "us-east-099.whiskergalaxy.com", + "wgpubkey": "Ptieqs4YovU0Jxgu9d7rSTapQPp7G+8GYWiwaf8jPlA=", + "ips": [ + "38.101.74.84" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Detroit", "hostname": "us-east-079.whiskergalaxy.com", @@ -106879,6 +116208,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Detroit", + "hostname": "us-east-079.whiskergalaxy.com", + "wgpubkey": "IMHoX/bhNghQVQB0pYKi14pwJhkOcLevpiMa7Khaz2I=", + "ips": [ + "104.244.210.52" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Detroit", "hostname": "us-east-098.whiskergalaxy.com", @@ -106889,6 +116229,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Detroit", + "hostname": "us-east-098.whiskergalaxy.com", + "wgpubkey": "IMHoX/bhNghQVQB0pYKi14pwJhkOcLevpiMa7Khaz2I=", + "ips": [ + "104.244.210.244" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Miami", "hostname": "us-east-006.whiskergalaxy.com", @@ -106899,6 +116250,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Miami", + "hostname": "us-east-006.whiskergalaxy.com", + "wgpubkey": "7LiZu9B4qzVwl3jKRVs7ivx/BHi/jnSS/GWSuxEClgk=", + "ips": [ + "173.44.36.68" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Miami", "hostname": "us-east-012.whiskergalaxy.com", @@ -106909,6 +116271,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Miami", + "hostname": "us-east-012.whiskergalaxy.com", + "wgpubkey": "1S9LgDyVSo2X34ZG8ukQQ7vqL5RpmXszNe0SYNjiUws=", + "ips": [ + "45.87.214.36" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Miami", "hostname": "us-east-028.whiskergalaxy.com", @@ -106919,6 +116292,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Miami", + "hostname": "us-east-028.whiskergalaxy.com", + "wgpubkey": "7LiZu9B4qzVwl3jKRVs7ivx/BHi/jnSS/GWSuxEClgk=", + "ips": [ + "104.223.127.196" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Miami", "hostname": "us-east-049.whiskergalaxy.com", @@ -106929,6 +116313,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Miami", + "hostname": "us-east-049.whiskergalaxy.com", + "wgpubkey": "makkxzTeghSw9LGaFifz0C251aBeDCKhMmtJ8p0E6Uw=", + "ips": [ + "23.108.51.15" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Miami", "hostname": "us-east-067.whiskergalaxy.com", @@ -106939,6 +116334,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Miami", + "hostname": "us-east-067.whiskergalaxy.com", + "wgpubkey": "1S9LgDyVSo2X34ZG8ukQQ7vqL5RpmXszNe0SYNjiUws=", + "ips": [ + "86.106.87.84" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Miami", "hostname": "us-east-084.whiskergalaxy.com", @@ -106949,6 +116355,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Miami", + "hostname": "us-east-084.whiskergalaxy.com", + "wgpubkey": "makkxzTeghSw9LGaFifz0C251aBeDCKhMmtJ8p0E6Uw=", + "ips": [ + "23.82.137.73" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Miami", "hostname": "us-east-088.whiskergalaxy.com", @@ -106959,6 +116376,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Miami", + "hostname": "us-east-088.whiskergalaxy.com", + "wgpubkey": "1S9LgDyVSo2X34ZG8ukQQ7vqL5RpmXszNe0SYNjiUws=", + "ips": [ + "194.5.215.196" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Miami", "hostname": "us-east-097.whiskergalaxy.com", @@ -106969,6 +116397,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Miami", + "hostname": "us-east-097.whiskergalaxy.com", + "wgpubkey": "7LiZu9B4qzVwl3jKRVs7ivx/BHi/jnSS/GWSuxEClgk=", + "ips": [ + "173.44.43.132" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New Jersey", "hostname": "us-east-020.whiskergalaxy.com", @@ -106979,6 +116418,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New Jersey", + "hostname": "us-east-020.whiskergalaxy.com", + "wgpubkey": "cHmeYFIKgOrUDgfx6xOTjPUnnUtUapeLa2xA2XHvBFc=", + "ips": [ + "162.222.195.68" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New Jersey", "hostname": "us-east-054.whiskergalaxy.com", @@ -106989,6 +116439,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New Jersey", + "hostname": "us-east-054.whiskergalaxy.com", + "wgpubkey": "cHmeYFIKgOrUDgfx6xOTjPUnnUtUapeLa2xA2XHvBFc=", + "ips": [ + "167.160.167.196" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New Jersey", "hostname": "us-east-095.whiskergalaxy.com", @@ -106999,6 +116460,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New Jersey", + "hostname": "us-east-095.whiskergalaxy.com", + "wgpubkey": "cHmeYFIKgOrUDgfx6xOTjPUnnUtUapeLa2xA2XHvBFc=", + "ips": [ + "173.205.85.164" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New York", "hostname": "us-east-013.whiskergalaxy.com", @@ -107009,6 +116481,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New York", + "hostname": "us-east-013.whiskergalaxy.com", + "wgpubkey": "Tu8tlHPMbkXRANX3AF1Te+stynfOJS1mCtIOjiRToCg=", + "ips": [ + "185.232.22.196" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New York", "hostname": "us-east-046.whiskergalaxy.com", @@ -107019,6 +116502,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New York", + "hostname": "us-east-046.whiskergalaxy.com", + "wgpubkey": "8lPLkuOqKEggDfnX6fNo9eO4h7ZE8hrEkSwFGJqoK0M=", + "ips": [ + "206.217.129.228" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New York", "hostname": "us-east-050.whiskergalaxy.com", @@ -107029,6 +116523,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New York", + "hostname": "us-east-050.whiskergalaxy.com", + "wgpubkey": "B8Oyz2mKiUvv3iMiKt7/rhLccCB3KcAYnCj5+fO4hHM=", + "ips": [ + "173.208.45.34" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New York", "hostname": "us-east-064.whiskergalaxy.com", @@ -107039,6 +116544,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New York", + "hostname": "us-east-064.whiskergalaxy.com", + "wgpubkey": "8lPLkuOqKEggDfnX6fNo9eO4h7ZE8hrEkSwFGJqoK0M=", + "ips": [ + "206.217.128.4" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New York", "hostname": "us-east-068.whiskergalaxy.com", @@ -107049,6 +116565,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New York", + "hostname": "us-east-068.whiskergalaxy.com", + "wgpubkey": "B8Oyz2mKiUvv3iMiKt7/rhLccCB3KcAYnCj5+fO4hHM=", + "ips": [ + "23.81.64.130" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New York", "hostname": "us-east-074.whiskergalaxy.com", @@ -107059,6 +116586,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New York", + "hostname": "us-east-074.whiskergalaxy.com", + "wgpubkey": "Tu8tlHPMbkXRANX3AF1Te+stynfOJS1mCtIOjiRToCg=", + "ips": [ + "217.138.255.180" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New York", "hostname": "us-east-094.whiskergalaxy.com", @@ -107069,6 +116607,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New York", + "hostname": "us-east-094.whiskergalaxy.com", + "wgpubkey": "Tu8tlHPMbkXRANX3AF1Te+stynfOJS1mCtIOjiRToCg=", + "ips": [ + "217.138.255.164" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New York", "hostname": "us-east-096.whiskergalaxy.com", @@ -107079,6 +116628,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New York", + "hostname": "us-east-096.whiskergalaxy.com", + "wgpubkey": "VB4VC+CyLyFtYO86OsTV4Z17X/sa1t3pPqbJejI/Enc=", + "ips": [ + "89.187.177.51" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "New York", "hostname": "us-east-103.whiskergalaxy.com", @@ -107089,6 +116649,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "New York", + "hostname": "us-east-103.whiskergalaxy.com", + "wgpubkey": "Tu8tlHPMbkXRANX3AF1Te+stynfOJS1mCtIOjiRToCg=", + "ips": [ + "212.103.48.68" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Orlando", "hostname": "us-east-052.whiskergalaxy.com", @@ -107099,6 +116670,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Orlando", + "hostname": "us-east-052.whiskergalaxy.com", + "wgpubkey": "b5fIKEXhihCI7f4NOkQO/2BOd+bYHa0c05OylImgB0E=", + "ips": [ + "198.147.22.227" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Orlando", "hostname": "us-east-082.whiskergalaxy.com", @@ -107109,6 +116691,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Orlando", + "hostname": "us-east-082.whiskergalaxy.com", + "wgpubkey": "b5fIKEXhihCI7f4NOkQO/2BOd+bYHa0c05OylImgB0E=", + "ips": [ + "66.115.182.132" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Philadelphia", "hostname": "us-east-060.whiskergalaxy.com", @@ -107119,6 +116712,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Philadelphia", + "hostname": "us-east-060.whiskergalaxy.com", + "wgpubkey": "iZMzm2yjt8zU5xgsiw0TyRUbIXHsO1pZ6VrMvkRG3ng=", + "ips": [ + "76.72.175.100" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Philadelphia", "hostname": "us-east-061.whiskergalaxy.com", @@ -107129,6 +116733,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Philadelphia", + "hostname": "us-east-061.whiskergalaxy.com", + "wgpubkey": "oZSSjyLgPsssnrWYUZYiU5x1wF4wuuENQUoY5S4oeHc=", + "ips": [ + "23.172.112.228" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Tampa", "hostname": "us-east-080.whiskergalaxy.com", @@ -107139,6 +116754,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Tampa", + "hostname": "us-east-080.whiskergalaxy.com", + "wgpubkey": "jqf7HHmkBdzk1kkGLD20O/EzLHSFV2Bc7z4MeHcP7iA=", + "ips": [ + "209.216.79.84" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Tampa", "hostname": "us-east-081.whiskergalaxy.com", @@ -107149,6 +116775,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Tampa", + "hostname": "us-east-081.whiskergalaxy.com", + "wgpubkey": "jqf7HHmkBdzk1kkGLD20O/EzLHSFV2Bc7z4MeHcP7iA=", + "ips": [ + "209.216.79.68" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Washington DC", "hostname": "us-east-089.whiskergalaxy.com", @@ -107159,6 +116796,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Washington DC", + "hostname": "us-east-089.whiskergalaxy.com", + "wgpubkey": "uZxQR1klZ1Ere9kA8Thp7CUgAlviSWXdYjagsNdunjM=", + "ips": [ + "198.7.56.228" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Washington DC", "hostname": "us-east-090.whiskergalaxy.com", @@ -107169,6 +116817,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Washington DC", + "hostname": "us-east-090.whiskergalaxy.com", + "wgpubkey": "uZxQR1klZ1Ere9kA8Thp7CUgAlviSWXdYjagsNdunjM=", + "ips": [ + "207.244.91.131" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Washington DC", "hostname": "us-east-092.whiskergalaxy.com", @@ -107179,6 +116838,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Washington DC", + "hostname": "us-east-092.whiskergalaxy.com", + "wgpubkey": "uZxQR1klZ1Ere9kA8Thp7CUgAlviSWXdYjagsNdunjM=", + "ips": [ + "207.244.91.144" + ] + }, + { + "vpn": "openvpn", "region": "US East", "city": "Washington DC", "hostname": "us-east-093.whiskergalaxy.com", @@ -107189,6 +116859,17 @@ ] }, { + "vpn": "wireguard", + "region": "US East", + "city": "Washington DC", + "hostname": "us-east-093.whiskergalaxy.com", + "wgpubkey": "uZxQR1klZ1Ere9kA8Thp7CUgAlviSWXdYjagsNdunjM=", + "ips": [ + "198.7.56.239" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Bend", "hostname": "us-west-038.whiskergalaxy.com", @@ -107199,6 +116880,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Bend", + "hostname": "us-west-038.whiskergalaxy.com", + "wgpubkey": "oIt9F8IfWqCvSQACrDcmfLPFrhn+RtG+Mr9/sd4VSSU=", + "ips": [ + "104.152.222.34" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Bend", "hostname": "us-west-072.whiskergalaxy.com", @@ -107209,6 +116901,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Bend", + "hostname": "us-west-072.whiskergalaxy.com", + "wgpubkey": "oIt9F8IfWqCvSQACrDcmfLPFrhn+RtG+Mr9/sd4VSSU=", + "ips": [ + "104.255.169.111" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Las Vegas", "hostname": "us-west-018.whiskergalaxy.com", @@ -107219,6 +116922,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Las Vegas", + "hostname": "us-west-018.whiskergalaxy.com", + "wgpubkey": "XF69enunWI6bbHHwgRbE/jAvuM6plb4kyGcObYKvLVc=", + "ips": [ + "82.102.30.68" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Las Vegas", "hostname": "us-west-030.whiskergalaxy.com", @@ -107229,6 +116943,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Las Vegas", + "hostname": "us-west-030.whiskergalaxy.com", + "wgpubkey": "XF69enunWI6bbHHwgRbE/jAvuM6plb4kyGcObYKvLVc=", + "ips": [ + "37.120.147.164" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-004.whiskergalaxy.com", @@ -107239,6 +116964,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-004.whiskergalaxy.com", + "wgpubkey": "fvmyuUJF8JvjzIts5bROwwZQ0zkSB7lk/q8E4G3+F20=", + "ips": [ + "185.236.200.36" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-015.whiskergalaxy.com", @@ -107249,6 +116985,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-015.whiskergalaxy.com", + "wgpubkey": "99Kk/D1AJ2R1Tjtcvv2JaiKrBU0Jp2z9543lX1bSfUE=", + "ips": [ + "216.45.53.132" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-027.whiskergalaxy.com", @@ -107259,6 +117006,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-027.whiskergalaxy.com", + "wgpubkey": "fvmyuUJF8JvjzIts5bROwwZQ0zkSB7lk/q8E4G3+F20=", + "ips": [ + "212.103.49.68" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-040.whiskergalaxy.com", @@ -107269,6 +117027,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-040.whiskergalaxy.com", + "wgpubkey": "7CGKj3gnMrJ73Q3TX/YPtk94ZqX+H3kfBbMwfhze/Hg=", + "ips": [ + "89.187.185.35" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-044.whiskergalaxy.com", @@ -107279,6 +117048,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-044.whiskergalaxy.com", + "wgpubkey": "EOprktmhNg2NV9HqyHTs+uLNnTwpVnXe1/wBIFesQTE=", + "ips": [ + "192.3.20.52" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-047.whiskergalaxy.com", @@ -107289,6 +117069,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-047.whiskergalaxy.com", + "wgpubkey": "sgBIEKuocQBegrbXRmTVl6QvbhdXj2MQlIrhfEMf3RQ=", + "ips": [ + "172.241.214.203" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-055.whiskergalaxy.com", @@ -107299,6 +117090,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-055.whiskergalaxy.com", + "wgpubkey": "99Kk/D1AJ2R1Tjtcvv2JaiKrBU0Jp2z9543lX1bSfUE=", + "ips": [ + "104.129.3.68" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-059.whiskergalaxy.com", @@ -107309,6 +117111,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-059.whiskergalaxy.com", + "wgpubkey": "99Kk/D1AJ2R1Tjtcvv2JaiKrBU0Jp2z9543lX1bSfUE=", + "ips": [ + "104.129.3.164" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-060.whiskergalaxy.com", @@ -107319,6 +117132,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-060.whiskergalaxy.com", + "wgpubkey": "fvmyuUJF8JvjzIts5bROwwZQ0zkSB7lk/q8E4G3+F20=", + "ips": [ + "217.138.217.52" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-063.whiskergalaxy.com", @@ -107329,6 +117153,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-063.whiskergalaxy.com", + "wgpubkey": "EOprktmhNg2NV9HqyHTs+uLNnTwpVnXe1/wBIFesQTE=", + "ips": [ + "198.23.242.148" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-065.whiskergalaxy.com", @@ -107339,6 +117174,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-065.whiskergalaxy.com", + "wgpubkey": "fvmyuUJF8JvjzIts5bROwwZQ0zkSB7lk/q8E4G3+F20=", + "ips": [ + "217.138.217.212" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-066.whiskergalaxy.com", @@ -107349,6 +117195,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-066.whiskergalaxy.com", + "wgpubkey": "7CGKj3gnMrJ73Q3TX/YPtk94ZqX+H3kfBbMwfhze/Hg=", + "ips": [ + "89.187.187.99" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-069.whiskergalaxy.com", @@ -107359,6 +117216,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-069.whiskergalaxy.com", + "wgpubkey": "7CGKj3gnMrJ73Q3TX/YPtk94ZqX+H3kfBbMwfhze/Hg=", + "ips": [ + "185.152.67.227" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Los Angeles", "hostname": "us-west-070.whiskergalaxy.com", @@ -107369,6 +117237,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Los Angeles", + "hostname": "us-west-070.whiskergalaxy.com", + "wgpubkey": "99Kk/D1AJ2R1Tjtcvv2JaiKrBU0Jp2z9543lX1bSfUE=", + "ips": [ + "104.129.4.68" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Phoenix", "hostname": "us-west-046.whiskergalaxy.com", @@ -107379,6 +117258,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Phoenix", + "hostname": "us-west-046.whiskergalaxy.com", + "wgpubkey": "ZXYlnCS0zJGhpsYDhCxs8pYXsB00yqxhagTBjRD002U=", + "ips": [ + "23.83.130.167" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Phoenix", "hostname": "us-west-061.whiskergalaxy.com", @@ -107389,6 +117279,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Phoenix", + "hostname": "us-west-061.whiskergalaxy.com", + "wgpubkey": "ZXYlnCS0zJGhpsYDhCxs8pYXsB00yqxhagTBjRD002U=", + "ips": [ + "23.83.184.129" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "San Francisco", "hostname": "us-west-048.whiskergalaxy.com", @@ -107399,6 +117300,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "San Francisco", + "hostname": "us-west-048.whiskergalaxy.com", + "wgpubkey": "6GllLFSyxxwlqV9Yd9xij83CYgfGvfQGgN6SNh9h0xM=", + "ips": [ + "172.241.250.171" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "San Francisco", "hostname": "us-west-053.whiskergalaxy.com", @@ -107409,6 +117321,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "San Francisco", + "hostname": "us-west-053.whiskergalaxy.com", + "wgpubkey": "6GllLFSyxxwlqV9Yd9xij83CYgfGvfQGgN6SNh9h0xM=", + "ips": [ + "209.58.129.122" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "San Francisco", "hostname": "us-west-054.whiskergalaxy.com", @@ -107419,6 +117342,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "San Francisco", + "hostname": "us-west-054.whiskergalaxy.com", + "wgpubkey": "6GllLFSyxxwlqV9Yd9xij83CYgfGvfQGgN6SNh9h0xM=", + "ips": [ + "172.255.125.161" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "San Jose", "hostname": "us-west-052.whiskergalaxy.com", @@ -107429,6 +117363,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "San Jose", + "hostname": "us-west-052.whiskergalaxy.com", + "wgpubkey": "DBXvFCQL1KxJkVfJGiFzAru/1ClQi54EV1GHgoyIsWY=", + "ips": [ + "66.115.176.4" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "San Jose", "hostname": "us-west-067.whiskergalaxy.com", @@ -107439,6 +117384,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "San Jose", + "hostname": "us-west-067.whiskergalaxy.com", + "wgpubkey": "DBXvFCQL1KxJkVfJGiFzAru/1ClQi54EV1GHgoyIsWY=", + "ips": [ + "66.115.165.228" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Santa Clara", "hostname": "us-west-050.whiskergalaxy.com", @@ -107449,6 +117405,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Santa Clara", + "hostname": "us-west-050.whiskergalaxy.com", + "wgpubkey": "/oz2frQv99JveBgmTXW22QXIEulQURK79BW+ugk8fCE=", + "ips": [ + "167.88.60.228" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Santa Clara", "hostname": "us-west-051.whiskergalaxy.com", @@ -107459,6 +117426,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Santa Clara", + "hostname": "us-west-051.whiskergalaxy.com", + "wgpubkey": "/oz2frQv99JveBgmTXW22QXIEulQURK79BW+ugk8fCE=", + "ips": [ + "167.88.60.244" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Seattle", "hostname": "us-west-043.whiskergalaxy.com", @@ -107469,6 +117447,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Seattle", + "hostname": "us-west-043.whiskergalaxy.com", + "wgpubkey": "mRksyUF7wDK/8uBoPoEujp+yoUhjhq0N2LnNJFJnmiE=", + "ips": [ + "23.94.74.100" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Seattle", "hostname": "us-west-045.whiskergalaxy.com", @@ -107479,6 +117468,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Seattle", + "hostname": "us-west-045.whiskergalaxy.com", + "wgpubkey": "mPzcl2obsDyjjBl4tExF+gSle0jEhv9bHRZEi8D0PQA=", + "ips": [ + "64.120.2.175" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Seattle", "hostname": "us-west-056.whiskergalaxy.com", @@ -107489,6 +117489,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Seattle", + "hostname": "us-west-056.whiskergalaxy.com", + "wgpubkey": "89DUtbYYyXcAktaB2cnCVA/YiZQEddYHuOz2K0vBAn4=", + "ips": [ + "104.129.56.68" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Seattle", "hostname": "us-west-057.whiskergalaxy.com", @@ -107499,6 +117510,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Seattle", + "hostname": "us-west-057.whiskergalaxy.com", + "wgpubkey": "89DUtbYYyXcAktaB2cnCVA/YiZQEddYHuOz2K0vBAn4=", + "ips": [ + "104.129.56.132" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Seattle", "hostname": "us-west-062.whiskergalaxy.com", @@ -107509,6 +117531,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Seattle", + "hostname": "us-west-062.whiskergalaxy.com", + "wgpubkey": "mRksyUF7wDK/8uBoPoEujp+yoUhjhq0N2LnNJFJnmiE=", + "ips": [ + "198.12.116.196" + ] + }, + { + "vpn": "openvpn", "region": "US West", "city": "Seattle", "hostname": "us-west-071.whiskergalaxy.com", @@ -107519,6 +117552,17 @@ ] }, { + "vpn": "wireguard", + "region": "US West", + "city": "Seattle", + "hostname": "us-west-071.whiskergalaxy.com", + "wgpubkey": "89DUtbYYyXcAktaB2cnCVA/YiZQEddYHuOz2K0vBAn4=", + "ips": [ + "104.129.56.4" + ] + }, + { + "vpn": "openvpn", "region": "Ukraine", "city": "Kyiv", "hostname": "ua-010.whiskergalaxy.com", @@ -107529,6 +117573,17 @@ ] }, { + "vpn": "wireguard", + "region": "Ukraine", + "city": "Kyiv", + "hostname": "ua-010.whiskergalaxy.com", + "wgpubkey": "xd+b0SNB38ILyN8mfY3d7w7zLggbq4CkkxqPavP2OUk=", + "ips": [ + "37.19.218.3" + ] + }, + { + "vpn": "openvpn", "region": "Ukraine", "city": "Kyiv", "hostname": "ua-011.whiskergalaxy.com", @@ -107539,6 +117594,17 @@ ] }, { + "vpn": "wireguard", + "region": "Ukraine", + "city": "Kyiv", + "hostname": "ua-011.whiskergalaxy.com", + "wgpubkey": "xd+b0SNB38ILyN8mfY3d7w7zLggbq4CkkxqPavP2OUk=", + "ips": [ + "37.19.218.17" + ] + }, + { + "vpn": "openvpn", "region": "United Arab Emirates", "city": "Dubai", "hostname": "ae-001.whiskergalaxy.com", @@ -107549,6 +117615,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Arab Emirates", + "city": "Dubai", + "hostname": "ae-001.whiskergalaxy.com", + "wgpubkey": "TKpGTxyjCr7+CiVhaYulaLZ7pnXEsg4135ZIlz99qwc=", + "ips": [ + "45.9.249.44" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "Edinburgh", "hostname": "uk-026.whiskergalaxy.com", @@ -107559,6 +117636,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "Edinburgh", + "hostname": "uk-026.whiskergalaxy.com", + "wgpubkey": "bGn6yuCFQWWF8+ZMGlJ0M6+IJRlkLXn0/UI/mvIyYwQ=", + "ips": [ + "193.36.118.244" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "Edinburgh", "hostname": "uk-030.whiskergalaxy.com", @@ -107569,6 +117657,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "Edinburgh", + "hostname": "uk-030.whiskergalaxy.com", + "wgpubkey": "bGn6yuCFQWWF8+ZMGlJ0M6+IJRlkLXn0/UI/mvIyYwQ=", + "ips": [ + "193.36.118.228" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "London", "hostname": "uk-007.whiskergalaxy.com", @@ -107579,6 +117678,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "London", + "hostname": "uk-007.whiskergalaxy.com", + "wgpubkey": "yrmgyxaJAxTEth7Gc8lXOQVHn9Gn/fzd4cLE+0WZjFI=", + "ips": [ + "185.212.168.134" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "London", "hostname": "uk-013.whiskergalaxy.com", @@ -107589,6 +117699,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "London", + "hostname": "uk-013.whiskergalaxy.com", + "wgpubkey": "yrmgyxaJAxTEth7Gc8lXOQVHn9Gn/fzd4cLE+0WZjFI=", + "ips": [ + "89.238.150.230" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "London", "hostname": "uk-014.whiskergalaxy.com", @@ -107599,6 +117720,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "London", + "hostname": "uk-014.whiskergalaxy.com", + "wgpubkey": "qWSr7Tf40kvS+0kv4TbpSb6EevhSvn3kuXsjn2eWbA4=", + "ips": [ + "2.58.29.146" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "London", "hostname": "uk-015.whiskergalaxy.com", @@ -107609,6 +117741,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "London", + "hostname": "uk-015.whiskergalaxy.com", + "wgpubkey": "qWSr7Tf40kvS+0kv4TbpSb6EevhSvn3kuXsjn2eWbA4=", + "ips": [ + "2.58.29.18" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "London", "hostname": "uk-017.whiskergalaxy.com", @@ -107619,6 +117762,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "London", + "hostname": "uk-017.whiskergalaxy.com", + "wgpubkey": "895TAMNSeQymq8Qr6dxHh9FdRfNweZt5GdDDMB0s5XE=", + "ips": [ + "84.17.50.131" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "London", "hostname": "uk-021.whiskergalaxy.com", @@ -107629,6 +117783,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "London", + "hostname": "uk-021.whiskergalaxy.com", + "wgpubkey": "895TAMNSeQymq8Qr6dxHh9FdRfNweZt5GdDDMB0s5XE=", + "ips": [ + "212.102.63.33" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "London", "hostname": "uk-024.whiskergalaxy.com", @@ -107639,6 +117804,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "London", + "hostname": "uk-024.whiskergalaxy.com", + "wgpubkey": "yrmgyxaJAxTEth7Gc8lXOQVHn9Gn/fzd4cLE+0WZjFI=", + "ips": [ + "217.138.254.52" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "London", "hostname": "uk-028.whiskergalaxy.com", @@ -107649,6 +117825,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "London", + "hostname": "uk-028.whiskergalaxy.com", + "wgpubkey": "895TAMNSeQymq8Qr6dxHh9FdRfNweZt5GdDDMB0s5XE=", + "ips": [ + "212.102.63.94" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "Manchester", "hostname": "uk-008.whiskergalaxy.com", @@ -107659,6 +117846,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "Manchester", + "hostname": "uk-008.whiskergalaxy.com", + "wgpubkey": "oeqDhAeoxw1g/6cKq/fo4ubgssbwhO3K2Nkmn6JVhg8=", + "ips": [ + "81.92.207.70" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "Manchester", "hostname": "uk-010.whiskergalaxy.com", @@ -107669,6 +117867,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "Manchester", + "hostname": "uk-010.whiskergalaxy.com", + "wgpubkey": "oeqDhAeoxw1g/6cKq/fo4ubgssbwhO3K2Nkmn6JVhg8=", + "ips": [ + "89.238.135.134" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "Manchester", "hostname": "uk-025.whiskergalaxy.com", @@ -107679,6 +117888,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "Manchester", + "hostname": "uk-025.whiskergalaxy.com", + "wgpubkey": "oeqDhAeoxw1g/6cKq/fo4ubgssbwhO3K2Nkmn6JVhg8=", + "ips": [ + "89.44.201.100" + ] + }, + { + "vpn": "openvpn", "region": "United Kingdom", "city": "Manchester", "hostname": "uk-027.whiskergalaxy.com", @@ -107689,6 +117909,17 @@ ] }, { + "vpn": "wireguard", + "region": "United Kingdom", + "city": "Manchester", + "hostname": "uk-027.whiskergalaxy.com", + "wgpubkey": "oeqDhAeoxw1g/6cKq/fo4ubgssbwhO3K2Nkmn6JVhg8=", + "ips": [ + "84.252.95.132" + ] + }, + { + "vpn": "openvpn", "region": "Vietnam", "city": "Hanoi", "hostname": "vn-001.whiskergalaxy.com", @@ -107699,6 +117930,17 @@ ] }, { + "vpn": "wireguard", + "region": "Vietnam", + "city": "Hanoi", + "hostname": "vn-001.whiskergalaxy.com", + "wgpubkey": "SxBT11IISNRou7thGo5A1QtaMjfzPIzZXDxdYEbDxhE=", + "ips": [ + "103.9.76.198" + ] + }, + { + "vpn": "openvpn", "region": "Vietnam", "city": "Hanoi", "hostname": "vn-002.whiskergalaxy.com", @@ -107709,6 +117951,17 @@ ] }, { + "vpn": "wireguard", + "region": "Vietnam", + "city": "Hanoi", + "hostname": "vn-002.whiskergalaxy.com", + "wgpubkey": "SxBT11IISNRou7thGo5A1QtaMjfzPIzZXDxdYEbDxhE=", + "ips": [ + "103.9.79.187" + ] + }, + { + "vpn": "openvpn", "region": "Vietnam", "city": "Hanoi", "hostname": "vn-003.whiskergalaxy.com", @@ -107719,6 +117972,17 @@ ] }, { + "vpn": "wireguard", + "region": "Vietnam", + "city": "Hanoi", + "hostname": "vn-003.whiskergalaxy.com", + "wgpubkey": "SxBT11IISNRou7thGo5A1QtaMjfzPIzZXDxdYEbDxhE=", + "ips": [ + "103.9.79.220" + ] + }, + { + "vpn": "openvpn", "region": "WINDFLIX CA", "city": "Toronto", "hostname": "wf-ca-003.whiskergalaxy.com", @@ -107729,6 +117993,17 @@ ] }, { + "vpn": "wireguard", + "region": "WINDFLIX CA", + "city": "Toronto", + "hostname": "wf-ca-003.whiskergalaxy.com", + "wgpubkey": "dxMoXE/9ztTLm2UK0g6GxO1TLya8vxF7pZpX7LABuAI=", + "ips": [ + "91.149.252.50" + ] + }, + { + "vpn": "openvpn", "region": "WINDFLIX CA", "city": "Toronto", "hostname": "wf-ca-004.whiskergalaxy.com", @@ -107739,6 +118014,17 @@ ] }, { + "vpn": "wireguard", + "region": "WINDFLIX CA", + "city": "Toronto", + "hostname": "wf-ca-004.whiskergalaxy.com", + "wgpubkey": "dxMoXE/9ztTLm2UK0g6GxO1TLya8vxF7pZpX7LABuAI=", + "ips": [ + "104.254.92.100" + ] + }, + { + "vpn": "openvpn", "region": "WINDFLIX JP", "city": "Tokyo", "hostname": "wf-jp-002.whiskergalaxy.com", @@ -107749,6 +118035,17 @@ ] }, { + "vpn": "wireguard", + "region": "WINDFLIX JP", + "city": "Tokyo", + "hostname": "wf-jp-002.whiskergalaxy.com", + "wgpubkey": "RDqLEpYi8AT8yjjNQP12tsBvGxPekebtT0SC+gk2oAw=", + "ips": [ + "5.181.235.68" + ] + }, + { + "vpn": "openvpn", "region": "WINDFLIX UK", "city": "London", "hostname": "wf-uk-001.whiskergalaxy.com", @@ -107759,16 +118056,17 @@ ] }, { + "vpn": "wireguard", "region": "WINDFLIX UK", "city": "London", - "hostname": "wf-uk-006.whiskergalaxy.com", - "x509": "lhr-185.windscribe.com", + "hostname": "wf-uk-001.whiskergalaxy.com", + "wgpubkey": "XKu6eYKMo3aqVxjOEo4vNY11qZYUsMG+WXWnQlCoKR0=", "ips": [ - "81.92.200.84", - "81.92.200.85" + "45.9.248.4" ] }, { + "vpn": "openvpn", "region": "WINDFLIX UK", "city": "London", "hostname": "wf-uk-007.whiskergalaxy.com", @@ -107779,6 +118077,17 @@ ] }, { + "vpn": "wireguard", + "region": "WINDFLIX UK", + "city": "London", + "hostname": "wf-uk-007.whiskergalaxy.com", + "wgpubkey": "XKu6eYKMo3aqVxjOEo4vNY11qZYUsMG+WXWnQlCoKR0=", + "ips": [ + "89.47.62.84" + ] + }, + { + "vpn": "openvpn", "region": "WINDFLIX US", "city": "New York", "hostname": "wf-us-010.whiskergalaxy.com", @@ -107789,6 +118098,17 @@ ] }, { + "vpn": "wireguard", + "region": "WINDFLIX US", + "city": "New York", + "hostname": "wf-us-010.whiskergalaxy.com", + "wgpubkey": "GxEk9eSOUsTVzoE07pe4YZRaROCQwW96cQokD38Pgkk=", + "ips": [ + "146.70.25.4" + ] + }, + { + "vpn": "openvpn", "region": "WINDFLIX US", "city": "New York", "hostname": "wf-us-011.whiskergalaxy.com", @@ -107799,6 +118119,17 @@ ] }, { + "vpn": "wireguard", + "region": "WINDFLIX US", + "city": "New York", + "hostname": "wf-us-011.whiskergalaxy.com", + "wgpubkey": "GxEk9eSOUsTVzoE07pe4YZRaROCQwW96cQokD38Pgkk=", + "ips": [ + "146.70.25.68" + ] + }, + { + "vpn": "openvpn", "region": "WINDFLIX US", "city": "New York", "hostname": "wf-us-012.whiskergalaxy.com", @@ -107809,6 +118140,17 @@ ] }, { + "vpn": "wireguard", + "region": "WINDFLIX US", + "city": "New York", + "hostname": "wf-us-012.whiskergalaxy.com", + "wgpubkey": "GxEk9eSOUsTVzoE07pe4YZRaROCQwW96cQokD38Pgkk=", + "ips": [ + "185.232.22.132" + ] + }, + { + "vpn": "openvpn", "region": "WINDFLIX US", "city": "New York", "hostname": "wf-us-013.whiskergalaxy.com", @@ -107819,6 +118161,17 @@ ] }, { + "vpn": "wireguard", + "region": "WINDFLIX US", + "city": "New York", + "hostname": "wf-us-013.whiskergalaxy.com", + "wgpubkey": "GxEk9eSOUsTVzoE07pe4YZRaROCQwW96cQokD38Pgkk=", + "ips": [ + "217.138.206.212" + ] + }, + { + "vpn": "openvpn", "region": "WINDFLIX US", "city": "New York", "hostname": "wf-us-014.whiskergalaxy.com", @@ -107829,6 +118182,17 @@ ] }, { + "vpn": "wireguard", + "region": "WINDFLIX US", + "city": "New York", + "hostname": "wf-us-014.whiskergalaxy.com", + "wgpubkey": "GxEk9eSOUsTVzoE07pe4YZRaROCQwW96cQokD38Pgkk=", + "ips": [ + "77.81.136.100" + ] + }, + { + "vpn": "openvpn", "region": "WINDFLIX US", "city": "New York", "hostname": "wf-us-015.whiskergalaxy.com", @@ -107837,6 +118201,16 @@ "38.132.101.210", "38.132.101.211" ] + }, + { + "vpn": "wireguard", + "region": "WINDFLIX US", + "city": "New York", + "hostname": "wf-us-015.whiskergalaxy.com", + "wgpubkey": "GxEk9eSOUsTVzoE07pe4YZRaROCQwW96cQokD38Pgkk=", + "ips": [ + "38.132.101.212" + ] } ] } diff --git a/internal/constants/servers_test.go b/internal/constants/servers_test.go index e92b56ae..5e1541bc 100644 --- a/internal/constants/servers_test.go +++ b/internal/constants/servers_test.go @@ -73,7 +73,7 @@ func Test_versions(t *testing.T) { "Mullvad": { model: models.MullvadServer{}, version: allServers.Mullvad.Version, - digest: "2a009192", + digest: "ec56f19d", }, "Nordvpn": { model: models.NordvpnServer{}, @@ -128,7 +128,7 @@ func Test_versions(t *testing.T) { "Windscribe": { model: models.WindscribeServer{}, version: allServers.Windscribe.Version, - digest: "6f6c16d6", + digest: "4bd0fc4f", }, } for name, testCase := range testCases { diff --git a/internal/constants/vpn.go b/internal/constants/vpn.go index 9c7db9f4..9af18ec7 100644 --- a/internal/constants/vpn.go +++ b/internal/constants/vpn.go @@ -1,7 +1,8 @@ package constants const ( - OpenVPN = "openvpn" + OpenVPN = "openvpn" + Wireguard = "wireguard" ) const ( diff --git a/internal/models/connection.go b/internal/models/connection.go index e2ff1637..8d7a9473 100644 --- a/internal/models/connection.go +++ b/internal/models/connection.go @@ -6,7 +6,7 @@ import ( ) type Connection struct { - // Type is the connection type and can be "openvpn" + // Type is the connection type and can be "openvpn" or "wireguard" Type string `json:"type"` // IP is the VPN server IP address. IP net.IP `json:"ip"` @@ -15,13 +15,17 @@ type Connection struct { // Protocol can be "tcp" or "udp". Protocol string `json:"protocol"` // Hostname is used for IPVanish, IVPN, Privado - // and Windscribe for TLS verification + // and Windscribe for TLS verification. Hostname string `json:"hostname"` + // PubKey is the public key of the VPN server, + // used only for Wireguard. + PubKey string `json:"pubkey"` } func (c *Connection) Equal(other Connection) bool { return c.IP.Equal(other.IP) && c.Port == other.Port && - c.Protocol == other.Protocol && c.Hostname == other.Hostname + c.Protocol == other.Protocol && c.Hostname == other.Hostname && + c.PubKey == other.PubKey } func (c Connection) OpenVPNRemoteLine() (line string) { diff --git a/internal/models/server.go b/internal/models/server.go index f8c81193..08859802 100644 --- a/internal/models/server.go +++ b/internal/models/server.go @@ -48,6 +48,7 @@ type IvpnServer struct { } type MullvadServer struct { + VPN string `json:"vpn"` IPs []net.IP `json:"ips"` IPsV6 []net.IP `json:"ipsv6"` Country string `json:"country"` @@ -55,6 +56,7 @@ type MullvadServer struct { Hostname string `json:"hostname"` ISP string `json:"isp"` Owned bool `json:"owned"` + WgPubKey string `json:"wgpubkey,omitempty"` } type NordvpnServer struct { //nolint:maligned @@ -149,9 +151,11 @@ type VyprvpnServer struct { } type WindscribeServer struct { + VPN string `json:"vpn"` Region string `json:"region"` City string `json:"city"` Hostname string `json:"hostname"` - OvpnX509 string `json:"x509"` + OvpnX509 string `json:"x509,omitempty"` + WgPubKey string `json:"wgpubkey,omitempty"` IPs []net.IP `json:"ips"` } diff --git a/internal/netlink/address.go b/internal/netlink/address.go new file mode 100644 index 00000000..8252e962 --- /dev/null +++ b/internal/netlink/address.go @@ -0,0 +1,7 @@ +package netlink + +import "github.com/vishvananda/netlink" + +func (n *NetLink) AddrAdd(link netlink.Link, addr *netlink.Addr) error { + return netlink.AddrAdd(link, addr) +} diff --git a/internal/netlink/interface.go b/internal/netlink/interface.go new file mode 100644 index 00000000..0e091be2 --- /dev/null +++ b/internal/netlink/interface.go @@ -0,0 +1,14 @@ +package netlink + +import "github.com/vishvananda/netlink" + +//go:generate mockgen -destination=mock_$GOPACKAGE/$GOFILE . NetLinker + +var _ NetLinker = (*NetLink)(nil) + +type NetLinker interface { + AddrAdd(link netlink.Link, addr *netlink.Addr) error + RouteAdd(route *netlink.Route) error + RuleAdd(rule *netlink.Rule) error + RuleDel(rule *netlink.Rule) error +} diff --git a/internal/netlink/netlink.go b/internal/netlink/netlink.go new file mode 100644 index 00000000..ed34015b --- /dev/null +++ b/internal/netlink/netlink.go @@ -0,0 +1,7 @@ +package netlink + +type NetLink struct{} + +func New() *NetLink { + return &NetLink{} +} diff --git a/internal/netlink/route.go b/internal/netlink/route.go new file mode 100644 index 00000000..13a3a4b1 --- /dev/null +++ b/internal/netlink/route.go @@ -0,0 +1,7 @@ +package netlink + +import "github.com/vishvananda/netlink" + +func (n *NetLink) RouteAdd(route *netlink.Route) error { + return netlink.RouteAdd(route) +} diff --git a/internal/netlink/rule.go b/internal/netlink/rule.go new file mode 100644 index 00000000..9952460c --- /dev/null +++ b/internal/netlink/rule.go @@ -0,0 +1,11 @@ +package netlink + +import "github.com/vishvananda/netlink" + +func (n *NetLink) RuleAdd(rule *netlink.Rule) error { + return netlink.RuleAdd(rule) +} + +func (n *NetLink) RuleDel(rule *netlink.Rule) error { + return netlink.RuleDel(rule) +} diff --git a/internal/provider/cyberghost/filter_test.go b/internal/provider/cyberghost/filter_test.go index 7ec15865..0fa81806 100644 --- a/internal/provider/cyberghost/filter_test.go +++ b/internal/provider/cyberghost/filter_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/qdm12/gluetun/internal/configuration" + "github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/models" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -19,7 +20,8 @@ func Test_Cyberghost_filterServers(t *testing.T) { err error }{ "no servers": { - err: errors.New("no server found: for protocol udp"), + selection: configuration.ServerSelection{VPN: constants.OpenVPN}, + err: errors.New("no server found: for VPN openvpn; protocol udp"), }, "servers without filter defaults to UDP": { servers: []models.CyberghostServer{ diff --git a/internal/provider/mullvad/connection.go b/internal/provider/mullvad/connection.go index f5fe0471..c22efb02 100644 --- a/internal/provider/mullvad/connection.go +++ b/internal/provider/mullvad/connection.go @@ -9,16 +9,8 @@ import ( func (m *Mullvad) GetConnection(selection configuration.ServerSelection) ( connection models.Connection, err error) { - var port uint16 = 1194 - protocol := constants.UDP - if selection.OpenVPN.TCP { - port = 443 - protocol = constants.TCP - } - - if selection.OpenVPN.CustomPort > 0 { - port = selection.OpenVPN.CustomPort - } + port := getPort(selection) + protocol := getProtocol(selection) servers, err := m.filterServers(selection) if err != nil { @@ -33,6 +25,7 @@ func (m *Mullvad) GetConnection(selection configuration.ServerSelection) ( IP: IP, Port: port, Protocol: protocol, + PubKey: server.WgPubKey, // Wireguard only } connections = append(connections, connection) } @@ -44,3 +37,33 @@ func (m *Mullvad) GetConnection(selection configuration.ServerSelection) ( return utils.PickRandomConnection(connections, m.randSource), nil } + +func getPort(selection configuration.ServerSelection) (port uint16) { + switch selection.VPN { + case constants.Wireguard: + customPort := selection.Wireguard.CustomPort + if customPort > 0 { + return customPort + } + const defaultPort = 51820 + return defaultPort + default: // OpenVPN + customPort := selection.OpenVPN.CustomPort + if customPort > 0 { + return customPort + } + port = 1194 + if selection.OpenVPN.TCP { + port = 443 + } + return port + } +} + +func getProtocol(selection configuration.ServerSelection) (protocol string) { + protocol = constants.UDP + if selection.VPN == constants.OpenVPN && selection.OpenVPN.TCP { + protocol = constants.TCP + } + return protocol +} diff --git a/internal/provider/mullvad/connection_test.go b/internal/provider/mullvad/connection_test.go new file mode 100644 index 00000000..88c67349 --- /dev/null +++ b/internal/provider/mullvad/connection_test.go @@ -0,0 +1,204 @@ +package mullvad + +import ( + "errors" + "math/rand" + "net" + "testing" + + "github.com/qdm12/gluetun/internal/configuration" + "github.com/qdm12/gluetun/internal/constants" + "github.com/qdm12/gluetun/internal/models" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_Mullvad_GetConnection(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + servers []models.MullvadServer + selection configuration.ServerSelection + connection models.Connection + err error + }{ + "no server available": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + }, + err: errors.New("no server found: for VPN openvpn; protocol udp"), + }, + "no filter": { + servers: []models.MullvadServer{ + {IPs: []net.IP{net.IPv4(1, 1, 1, 1)}}, + {IPs: []net.IP{net.IPv4(2, 2, 2, 2)}}, + {IPs: []net.IP{net.IPv4(3, 3, 3, 3)}}, + }, + connection: models.Connection{ + IP: net.IPv4(1, 1, 1, 1), + Port: 1194, + Protocol: constants.UDP, + }, + }, + "target IP": { + selection: configuration.ServerSelection{ + TargetIP: net.IPv4(2, 2, 2, 2), + }, + servers: []models.MullvadServer{ + {IPs: []net.IP{net.IPv4(1, 1, 1, 1)}}, + {IPs: []net.IP{net.IPv4(2, 2, 2, 2)}}, + {IPs: []net.IP{net.IPv4(3, 3, 3, 3)}}, + }, + connection: models.Connection{ + IP: net.IPv4(2, 2, 2, 2), + Port: 1194, + Protocol: constants.UDP, + }, + }, + "with filter": { + selection: configuration.ServerSelection{ + Hostnames: []string{"b"}, + }, + servers: []models.MullvadServer{ + {Hostname: "a", IPs: []net.IP{net.IPv4(1, 1, 1, 1)}}, + {Hostname: "b", IPs: []net.IP{net.IPv4(2, 2, 2, 2)}}, + {Hostname: "a", IPs: []net.IP{net.IPv4(3, 3, 3, 3)}}, + }, + connection: models.Connection{ + IP: net.IPv4(2, 2, 2, 2), + Port: 1194, + Protocol: constants.UDP, + }, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + randSource := rand.NewSource(0) + + m := New(testCase.servers, randSource) + + connection, err := m.GetConnection(testCase.selection) + + if testCase.err != nil { + require.Error(t, err) + assert.Equal(t, testCase.err.Error(), err.Error()) + } else { + assert.NoError(t, err) + } + + assert.Equal(t, testCase.connection, connection) + }) + } +} + +func Test_getPort(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + selection configuration.ServerSelection + port uint16 + }{ + "default": { + port: 1194, + }, + "OpenVPN UDP": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + }, + port: 1194, + }, + "OpenVPN TCP": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + OpenVPN: configuration.OpenVPNSelection{ + TCP: true, + }, + }, + port: 443, + }, + "OpenVPN custom port": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + OpenVPN: configuration.OpenVPNSelection{ + CustomPort: 1234, + }, + }, + port: 1234, + }, + "Wireguard": { + selection: configuration.ServerSelection{ + VPN: constants.Wireguard, + }, + port: 51820, + }, + "Wireguard custom port": { + selection: configuration.ServerSelection{ + VPN: constants.Wireguard, + Wireguard: configuration.WireguardSelection{ + CustomPort: 1234, + }, + }, + port: 1234, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + port := getPort(testCase.selection) + + assert.Equal(t, testCase.port, port) + }) + } +} + +func Test_getProtocol(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + selection configuration.ServerSelection + protocol string + }{ + "default": { + protocol: constants.UDP, + }, + "OpenVPN UDP": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + }, + protocol: constants.UDP, + }, + "OpenVPN TCP": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + OpenVPN: configuration.OpenVPNSelection{ + TCP: true, + }, + }, + protocol: constants.TCP, + }, + "Wireguard": { + selection: configuration.ServerSelection{ + VPN: constants.Wireguard, + }, + protocol: constants.UDP, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + protocol := getProtocol(testCase.selection) + + assert.Equal(t, testCase.protocol, protocol) + }) + } +} diff --git a/internal/provider/mullvad/filter.go b/internal/provider/mullvad/filter.go index 8bc30be2..d096e344 100644 --- a/internal/provider/mullvad/filter.go +++ b/internal/provider/mullvad/filter.go @@ -11,6 +11,7 @@ func (m *Mullvad) filterServers(selection configuration.ServerSelection) ( for _, server := range m.servers { switch { case + server.VPN != selection.VPN, utils.FilterByPossibilities(server.Country, selection.Countries), utils.FilterByPossibilities(server.City, selection.Cities), utils.FilterByPossibilities(server.ISP, selection.ISPs), diff --git a/internal/provider/mullvad/filter_test.go b/internal/provider/mullvad/filter_test.go new file mode 100644 index 00000000..dfdd62c8 --- /dev/null +++ b/internal/provider/mullvad/filter_test.go @@ -0,0 +1,143 @@ +package mullvad + +import ( + "errors" + "math/rand" + "testing" + + "github.com/qdm12/gluetun/internal/configuration" + "github.com/qdm12/gluetun/internal/constants" + "github.com/qdm12/gluetun/internal/models" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_Mullvad_filterServers(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + servers []models.MullvadServer + selection configuration.ServerSelection + filtered []models.MullvadServer + err error + }{ + "no server available": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + }, + err: errors.New("no server found: for VPN openvpn; protocol udp"), + }, + "no filter": { + servers: []models.MullvadServer{ + {Hostname: "a"}, + {Hostname: "b"}, + {Hostname: "c"}, + }, + filtered: []models.MullvadServer{ + {Hostname: "a"}, + {Hostname: "b"}, + {Hostname: "c"}, + }, + }, + "filter OpenVPN out": { + selection: configuration.ServerSelection{ + VPN: constants.Wireguard, + }, + servers: []models.MullvadServer{ + {VPN: constants.OpenVPN, Hostname: "a"}, + {VPN: constants.Wireguard, Hostname: "b"}, + {VPN: constants.OpenVPN, Hostname: "c"}, + }, + filtered: []models.MullvadServer{ + {VPN: constants.Wireguard, Hostname: "b"}, + }, + }, + "filter by country": { + selection: configuration.ServerSelection{ + Countries: []string{"b"}, + }, + servers: []models.MullvadServer{ + {Country: "a"}, + {Country: "b"}, + {Country: "c"}, + }, + filtered: []models.MullvadServer{ + {Country: "b"}, + }, + }, + "filter by city": { + selection: configuration.ServerSelection{ + Cities: []string{"b"}, + }, + servers: []models.MullvadServer{ + {City: "a"}, + {City: "b"}, + {City: "c"}, + }, + filtered: []models.MullvadServer{ + {City: "b"}, + }, + }, + "filter by ISP": { + selection: configuration.ServerSelection{ + ISPs: []string{"b"}, + }, + servers: []models.MullvadServer{ + {ISP: "a"}, + {ISP: "b"}, + {ISP: "c"}, + }, + filtered: []models.MullvadServer{ + {ISP: "b"}, + }, + }, + "filter by hostname": { + selection: configuration.ServerSelection{ + Hostnames: []string{"b"}, + }, + servers: []models.MullvadServer{ + {Hostname: "a"}, + {Hostname: "b"}, + {Hostname: "c"}, + }, + filtered: []models.MullvadServer{ + {Hostname: "b"}, + }, + }, + "filter by owned": { + selection: configuration.ServerSelection{ + Owned: true, + }, + servers: []models.MullvadServer{ + {Hostname: "a"}, + {Hostname: "b", Owned: true}, + {Hostname: "c"}, + }, + filtered: []models.MullvadServer{ + {Hostname: "b", Owned: true}, + }, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + randSource := rand.NewSource(0) + + m := New(testCase.servers, randSource) + + servers, err := m.filterServers(testCase.selection) + + if testCase.err != nil { + require.Error(t, err) + assert.Equal(t, testCase.err.Error(), err.Error()) + } else { + assert.NoError(t, err) + } + + assert.Equal(t, testCase.filtered, servers) + }) + } +} diff --git a/internal/provider/utils/formatting.go b/internal/provider/utils/formatting.go index 96de8da4..de872591 100644 --- a/internal/provider/utils/formatting.go +++ b/internal/provider/utils/formatting.go @@ -19,6 +19,8 @@ var ErrNoServerFound = errors.New("no server found") func NoServerFoundError(selection configuration.ServerSelection) (err error) { var messageParts []string + messageParts = append(messageParts, "VPN "+selection.VPN) + protocol := constants.UDP if selection.OpenVPN.TCP { protocol = constants.TCP diff --git a/internal/provider/utils/wireguard.go b/internal/provider/utils/wireguard.go new file mode 100644 index 00000000..d718dc53 --- /dev/null +++ b/internal/provider/utils/wireguard.go @@ -0,0 +1,34 @@ +package utils + +import ( + "net" + + "github.com/qdm12/gluetun/internal/configuration" + "github.com/qdm12/gluetun/internal/models" + "github.com/qdm12/gluetun/internal/wireguard" +) + +func BuildWireguardSettings(connection models.Connection, + userSettings configuration.Wireguard) (settings wireguard.Settings) { + settings.PrivateKey = userSettings.PrivateKey + settings.PublicKey = connection.PubKey + settings.PreSharedKey = userSettings.PreSharedKey + settings.InterfaceName = userSettings.Interface + + const routePriority = 101 // 100 is to receive external connections + settings.RulePriority = routePriority + + settings.Endpoint = new(net.UDPAddr) + settings.Endpoint.IP = make(net.IP, len(connection.IP)) + copy(settings.Endpoint.IP, connection.IP) + settings.Endpoint.Port = int(connection.Port) + + address := new(net.IPNet) + address.IP = make(net.IP, len(userSettings.Address.IP)) + copy(address.IP, userSettings.Address.IP) + address.Mask = make(net.IPMask, len(userSettings.Address.Mask)) + copy(address.Mask, userSettings.Address.Mask) + settings.Addresses = append(settings.Addresses, address) + + return settings +} diff --git a/internal/provider/windscribe/connection.go b/internal/provider/windscribe/connection.go index 88986000..8f565a4d 100644 --- a/internal/provider/windscribe/connection.go +++ b/internal/provider/windscribe/connection.go @@ -9,16 +9,8 @@ import ( func (w *Windscribe) GetConnection(selection configuration.ServerSelection) ( connection models.Connection, err error) { - protocol := constants.UDP - var port uint16 = 443 - if selection.OpenVPN.TCP { - protocol = constants.TCP - port = 1194 - } - - if selection.OpenVPN.CustomPort > 0 { - port = selection.OpenVPN.CustomPort - } + port := getPort(selection) + protocol := getProtocol(selection) servers, err := w.filterServers(selection) if err != nil { @@ -34,6 +26,7 @@ func (w *Windscribe) GetConnection(selection configuration.ServerSelection) ( Port: port, Protocol: protocol, Hostname: server.OvpnX509, + PubKey: server.WgPubKey, } connections = append(connections, connection) } @@ -45,3 +38,33 @@ func (w *Windscribe) GetConnection(selection configuration.ServerSelection) ( return utils.PickRandomConnection(connections, w.randSource), nil } + +func getPort(selection configuration.ServerSelection) (port uint16) { + switch selection.VPN { + case constants.Wireguard: + customPort := selection.Wireguard.CustomPort + if customPort > 0 { + return customPort + } + const defaultPort = 1194 + return defaultPort + default: // OpenVPN + customPort := selection.OpenVPN.CustomPort + if customPort > 0 { + return customPort + } + port = 1194 + if selection.OpenVPN.TCP { + port = 443 + } + return port + } +} + +func getProtocol(selection configuration.ServerSelection) (protocol string) { + protocol = constants.UDP + if selection.VPN == constants.OpenVPN && selection.OpenVPN.TCP { + protocol = constants.TCP + } + return protocol +} diff --git a/internal/provider/windscribe/connection_test.go b/internal/provider/windscribe/connection_test.go new file mode 100644 index 00000000..d6521130 --- /dev/null +++ b/internal/provider/windscribe/connection_test.go @@ -0,0 +1,204 @@ +package windscribe + +import ( + "errors" + "math/rand" + "net" + "testing" + + "github.com/qdm12/gluetun/internal/configuration" + "github.com/qdm12/gluetun/internal/constants" + "github.com/qdm12/gluetun/internal/models" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_Windscribe_GetConnection(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + servers []models.WindscribeServer + selection configuration.ServerSelection + connection models.Connection + err error + }{ + "no server available": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + }, + err: errors.New("no server found: for VPN openvpn; protocol udp"), + }, + "no filter": { + servers: []models.WindscribeServer{ + {IPs: []net.IP{net.IPv4(1, 1, 1, 1)}}, + {IPs: []net.IP{net.IPv4(2, 2, 2, 2)}}, + {IPs: []net.IP{net.IPv4(3, 3, 3, 3)}}, + }, + connection: models.Connection{ + IP: net.IPv4(1, 1, 1, 1), + Port: 1194, + Protocol: constants.UDP, + }, + }, + "target IP": { + selection: configuration.ServerSelection{ + TargetIP: net.IPv4(2, 2, 2, 2), + }, + servers: []models.WindscribeServer{ + {IPs: []net.IP{net.IPv4(1, 1, 1, 1)}}, + {IPs: []net.IP{net.IPv4(2, 2, 2, 2)}}, + {IPs: []net.IP{net.IPv4(3, 3, 3, 3)}}, + }, + connection: models.Connection{ + IP: net.IPv4(2, 2, 2, 2), + Port: 1194, + Protocol: constants.UDP, + }, + }, + "with filter": { + selection: configuration.ServerSelection{ + Hostnames: []string{"b"}, + }, + servers: []models.WindscribeServer{ + {Hostname: "a", IPs: []net.IP{net.IPv4(1, 1, 1, 1)}}, + {Hostname: "b", IPs: []net.IP{net.IPv4(2, 2, 2, 2)}}, + {Hostname: "a", IPs: []net.IP{net.IPv4(3, 3, 3, 3)}}, + }, + connection: models.Connection{ + IP: net.IPv4(2, 2, 2, 2), + Port: 1194, + Protocol: constants.UDP, + }, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + randSource := rand.NewSource(0) + + m := New(testCase.servers, randSource) + + connection, err := m.GetConnection(testCase.selection) + + if testCase.err != nil { + require.Error(t, err) + assert.Equal(t, testCase.err.Error(), err.Error()) + } else { + assert.NoError(t, err) + } + + assert.Equal(t, testCase.connection, connection) + }) + } +} + +func Test_getPort(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + selection configuration.ServerSelection + port uint16 + }{ + "default": { + port: 1194, + }, + "OpenVPN UDP": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + }, + port: 1194, + }, + "OpenVPN TCP": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + OpenVPN: configuration.OpenVPNSelection{ + TCP: true, + }, + }, + port: 443, + }, + "OpenVPN custom port": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + OpenVPN: configuration.OpenVPNSelection{ + CustomPort: 1234, + }, + }, + port: 1234, + }, + "Wireguard": { + selection: configuration.ServerSelection{ + VPN: constants.Wireguard, + }, + port: 1194, + }, + "Wireguard custom port": { + selection: configuration.ServerSelection{ + VPN: constants.Wireguard, + Wireguard: configuration.WireguardSelection{ + CustomPort: 1234, + }, + }, + port: 1234, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + port := getPort(testCase.selection) + + assert.Equal(t, testCase.port, port) + }) + } +} + +func Test_getProtocol(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + selection configuration.ServerSelection + protocol string + }{ + "default": { + protocol: constants.UDP, + }, + "OpenVPN UDP": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + }, + protocol: constants.UDP, + }, + "OpenVPN TCP": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + OpenVPN: configuration.OpenVPNSelection{ + TCP: true, + }, + }, + protocol: constants.TCP, + }, + "Wireguard": { + selection: configuration.ServerSelection{ + VPN: constants.Wireguard, + }, + protocol: constants.UDP, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + protocol := getProtocol(testCase.selection) + + assert.Equal(t, testCase.protocol, protocol) + }) + } +} diff --git a/internal/provider/windscribe/filter.go b/internal/provider/windscribe/filter.go index d2bfc21b..84a87a91 100644 --- a/internal/provider/windscribe/filter.go +++ b/internal/provider/windscribe/filter.go @@ -11,6 +11,7 @@ func (w *Windscribe) filterServers(selection configuration.ServerSelection) ( for _, server := range w.servers { switch { case + server.VPN != selection.VPN, utils.FilterByPossibilities(server.Region, selection.Regions), utils.FilterByPossibilities(server.City, selection.Cities), utils.FilterByPossibilities(server.Hostname, selection.Hostnames): diff --git a/internal/provider/windscribe/filter_test.go b/internal/provider/windscribe/filter_test.go new file mode 100644 index 00000000..dbbf9f66 --- /dev/null +++ b/internal/provider/windscribe/filter_test.go @@ -0,0 +1,117 @@ +package windscribe + +import ( + "errors" + "math/rand" + "testing" + + "github.com/qdm12/gluetun/internal/configuration" + "github.com/qdm12/gluetun/internal/constants" + "github.com/qdm12/gluetun/internal/models" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_Windscribe_filterServers(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + servers []models.WindscribeServer + selection configuration.ServerSelection + filtered []models.WindscribeServer + err error + }{ + "no server available": { + selection: configuration.ServerSelection{ + VPN: constants.OpenVPN, + }, + err: errors.New("no server found: for VPN openvpn; protocol udp"), + }, + "no filter": { + servers: []models.WindscribeServer{ + {Hostname: "a"}, + {Hostname: "b"}, + {Hostname: "c"}, + }, + filtered: []models.WindscribeServer{ + {Hostname: "a"}, + {Hostname: "b"}, + {Hostname: "c"}, + }, + }, + "filter OpenVPN out": { + selection: configuration.ServerSelection{ + VPN: constants.Wireguard, + }, + servers: []models.WindscribeServer{ + {VPN: constants.OpenVPN, Hostname: "a"}, + {VPN: constants.Wireguard, Hostname: "b"}, + {VPN: constants.OpenVPN, Hostname: "c"}, + }, + filtered: []models.WindscribeServer{ + {VPN: constants.Wireguard, Hostname: "b"}, + }, + }, + "filter by region": { + selection: configuration.ServerSelection{ + Regions: []string{"b"}, + }, + servers: []models.WindscribeServer{ + {Region: "a"}, + {Region: "b"}, + {Region: "c"}, + }, + filtered: []models.WindscribeServer{ + {Region: "b"}, + }, + }, + "filter by city": { + selection: configuration.ServerSelection{ + Cities: []string{"b"}, + }, + servers: []models.WindscribeServer{ + {City: "a"}, + {City: "b"}, + {City: "c"}, + }, + filtered: []models.WindscribeServer{ + {City: "b"}, + }, + }, + "filter by hostname": { + selection: configuration.ServerSelection{ + Hostnames: []string{"b"}, + }, + servers: []models.WindscribeServer{ + {Hostname: "a"}, + {Hostname: "b"}, + {Hostname: "c"}, + }, + filtered: []models.WindscribeServer{ + {Hostname: "b"}, + }, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + randSource := rand.NewSource(0) + + m := New(testCase.servers, randSource) + + servers, err := m.filterServers(testCase.selection) + + if testCase.err != nil { + require.Error(t, err) + assert.Equal(t, testCase.err.Error(), err.Error()) + } else { + assert.NoError(t, err) + } + + assert.Equal(t, testCase.filtered, servers) + }) + } +} diff --git a/internal/updater/providers/mullvad/api.go b/internal/updater/providers/mullvad/api.go index a527fbbc..9ca17164 100644 --- a/internal/updater/providers/mullvad/api.go +++ b/internal/updater/providers/mullvad/api.go @@ -22,10 +22,12 @@ type serverData struct { Provider string `json:"provider"` IPv4 string `json:"ipv4_addr_in"` IPv6 string `json:"ipv6_addr_in"` + Type string `json:"type"` + PubKey string `json:"pubkey"` // Wireguard public key } func fetchAPI(ctx context.Context, client *http.Client) (data []serverData, err error) { - const url = "https://api.mullvad.net/www/relays/openvpn/" + const url = "https://api.mullvad.net/www/relays/all/" request, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { diff --git a/internal/updater/providers/mullvad/hosttoserver.go b/internal/updater/providers/mullvad/hosttoserver.go index 5ee5fa6d..dde5e37a 100644 --- a/internal/updater/providers/mullvad/hosttoserver.go +++ b/internal/updater/providers/mullvad/hosttoserver.go @@ -6,14 +6,17 @@ import ( "net" "strings" + "github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/models" ) type hostToServer map[string]models.MullvadServer var ( - ErrParseIPv4 = errors.New("cannot parse IPv4 address") - ErrParseIPv6 = errors.New("cannot parse IPv6 address") + ErrNoIP = errors.New("no IP address for VPN server") + ErrParseIPv4 = errors.New("cannot parse IPv4 address") + ErrParseIPv6 = errors.New("cannot parse IPv6 address") + ErrVPNTypeNotSupported = errors.New("VPN type not supported") ) func (hts hostToServer) add(data serverData) (err error) { @@ -21,14 +24,8 @@ func (hts hostToServer) add(data serverData) (err error) { return } - ipv4 := net.ParseIP(data.IPv4) - if ipv4 == nil || ipv4.To4() == nil { - return fmt.Errorf("%w: %s", ErrParseIPv4, data.IPv4) - } - - ipv6 := net.ParseIP(data.IPv6) - if ipv6 == nil || ipv6.To4() != nil { - return fmt.Errorf("%w: %s", ErrParseIPv6, data.IPv6) + if data.IPv4 == "" && data.IPv6 == "" { + return ErrNoIP } server, ok := hts[data.Hostname] @@ -36,13 +33,40 @@ func (hts hostToServer) add(data serverData) (err error) { return nil } + switch data.Type { + case "openvpn": + server.VPN = constants.OpenVPN + case "wireguard": + server.VPN = constants.Wireguard + case "bridge": + // ignore bridge servers + return nil + default: + return fmt.Errorf("%w: %s", ErrVPNTypeNotSupported, data.Type) + } + + if data.IPv4 != "" { + ipv4 := net.ParseIP(data.IPv4) + if ipv4 == nil || ipv4.To4() == nil { + return fmt.Errorf("%w: %s", ErrParseIPv4, data.IPv4) + } + server.IPs = []net.IP{ipv4} + } + + if data.IPv6 != "" { + ipv6 := net.ParseIP(data.IPv6) + if ipv6 == nil || ipv6.To4() != nil { + return fmt.Errorf("%w: %s", ErrParseIPv6, data.IPv6) + } + server.IPsV6 = []net.IP{ipv6} + } + server.Country = data.Country server.City = strings.ReplaceAll(data.City, ",", "") server.Hostname = data.Hostname server.ISP = data.Provider server.Owned = data.Owned - server.IPs = []net.IP{ipv4} - server.IPsV6 = []net.IP{ipv6} + server.WgPubKey = data.PubKey hts[data.Hostname] = server diff --git a/internal/updater/providers/windscribe/api.go b/internal/updater/providers/windscribe/api.go index 2d4e357c..9b176068 100644 --- a/internal/updater/providers/windscribe/api.go +++ b/internal/updater/providers/windscribe/api.go @@ -29,6 +29,7 @@ type groupData struct { City string `json:"city"` Nodes []serverData `json:"nodes"` OvpnX509 string `json:"ovpn_x509"` + WgPubKey string `json:"wg_pubkey"` } type serverData struct { diff --git a/internal/updater/providers/windscribe/servers.go b/internal/updater/providers/windscribe/servers.go index f18a2dec..fe3e2f45 100644 --- a/internal/updater/providers/windscribe/servers.go +++ b/internal/updater/providers/windscribe/servers.go @@ -9,10 +9,14 @@ import ( "net" "net/http" + "github.com/qdm12/gluetun/internal/constants" "github.com/qdm12/gluetun/internal/models" ) -var ErrNotEnoughServers = errors.New("not enough servers found") +var ( + ErrNotEnoughServers = errors.New("not enough servers found") + ErrNoWireguardKey = errors.New("no wireguard public key found") +) func GetServers(ctx context.Context, client *http.Client, minServers int) ( servers []models.WindscribeServer, err error) { @@ -26,19 +30,17 @@ func GetServers(ctx context.Context, client *http.Client, minServers int) ( for _, group := range regionData.Groups { city := group.City x5090Name := group.OvpnX509 + wgPubKey := group.WgPubKey for _, node := range group.Nodes { - const maxIPsPerNode = 3 - ips := make([]net.IP, 0, maxIPsPerNode) + ips := make([]net.IP, 0, 2) // nolint:gomnd if node.IP != nil { ips = append(ips, node.IP) } if node.IP2 != nil { ips = append(ips, node.IP2) } - // if node.IP3 != nil { // Wireguard + Stealth - // ips = append(ips, node.IP3) - // } server := models.WindscribeServer{ + VPN: constants.OpenVPN, Region: region, City: city, Hostname: node.Hostname, @@ -46,6 +48,18 @@ func GetServers(ctx context.Context, client *http.Client, minServers int) ( IPs: ips, } servers = append(servers, server) + + if node.IP3 == nil { // Wireguard + Stealth + continue + } else if wgPubKey == "" { + return nil, fmt.Errorf("%w: for node %s", ErrNoWireguardKey, node.Hostname) + } + + server.VPN = constants.Wireguard + server.OvpnX509 = "" + server.WgPubKey = wgPubKey + server.IPs = []net.IP{node.IP3} + servers = append(servers, server) } } } diff --git a/internal/updater/providers/windscribe/sort.go b/internal/updater/providers/windscribe/sort.go index a0c8861b..0b338daa 100644 --- a/internal/updater/providers/windscribe/sort.go +++ b/internal/updater/providers/windscribe/sort.go @@ -10,6 +10,9 @@ func sortServers(servers []models.WindscribeServer) { sort.Slice(servers, func(i, j int) bool { if servers[i].Region == servers[j].Region { if servers[i].City == servers[j].City { + if servers[i].Hostname == servers[j].Hostname { + return servers[i].VPN < servers[j].VPN + } return servers[i].Hostname < servers[j].Hostname } return servers[i].City < servers[j].City diff --git a/internal/vpn/loop.go b/internal/vpn/loop.go index bbad0c37..750d72c3 100644 --- a/internal/vpn/loop.go +++ b/internal/vpn/loop.go @@ -10,6 +10,7 @@ import ( "github.com/qdm12/gluetun/internal/firewall" "github.com/qdm12/gluetun/internal/loopstate" "github.com/qdm12/gluetun/internal/models" + "github.com/qdm12/gluetun/internal/netlink" "github.com/qdm12/gluetun/internal/openvpn" "github.com/qdm12/gluetun/internal/portforward" "github.com/qdm12/gluetun/internal/publicip" @@ -37,6 +38,7 @@ type Loop struct { versionInfo bool // Configurators openvpnConf openvpn.Interface + netLinker netlink.NetLinker fw firewallConfigurer routing routing.VPNGetter portForward portforward.StartStopper @@ -67,7 +69,7 @@ const ( func NewLoop(vpnSettings configuration.VPN, allServers models.AllServers, openvpnConf openvpn.Interface, - fw firewallConfigurer, routing routing.VPNGetter, + netLinker netlink.NetLinker, fw firewallConfigurer, routing routing.VPNGetter, portForward portforward.StartStopper, starter command.Starter, publicip publicip.Looper, dnsLooper dns.Looper, logger logging.Logger, client *http.Client, @@ -86,6 +88,7 @@ func NewLoop(vpnSettings configuration.VPN, buildInfo: buildInfo, versionInfo: versionInfo, openvpnConf: openvpnConf, + netLinker: netLinker, fw: fw, routing: routing, portForward: portForward, diff --git a/internal/vpn/run.go b/internal/vpn/run.go index a311921a..b374ac34 100644 --- a/internal/vpn/run.go +++ b/internal/vpn/run.go @@ -30,8 +30,17 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { providerConf := provider.New(settings.Provider.Name, allServers, time.Now) - vpnRunner, serverName, err := setupOpenVPN(ctx, l.fw, - l.openvpnConf, providerConf, settings, l.starter, l.logger) + var vpnRunner vpnRunner + var serverName, vpnInterface string + var err error + if settings.Type == constants.OpenVPN { + vpnInterface = settings.OpenVPN.Interface + vpnRunner, serverName, err = setupOpenVPN(ctx, l.fw, + l.openvpnConf, providerConf, settings, l.starter, l.logger) + } else { // Wireguard + vpnInterface = settings.Wireguard.Interface + vpnRunner, serverName, err = setupWireguard(ctx, l.netLinker, l.fw, providerConf, settings, l.logger) + } if err != nil { l.crashed(ctx, err) continue @@ -40,7 +49,7 @@ func (l *Loop) Run(ctx context.Context, done chan<- struct{}) { portForwarding: settings.Provider.PortForwarding.Enabled, serverName: serverName, portForwarder: providerConf, - vpnIntf: settings.OpenVPN.Interface, + vpnIntf: vpnInterface, } openvpnCtx, openvpnCancel := context.WithCancel(context.Background()) diff --git a/internal/vpn/tunnelup.go b/internal/vpn/tunnelup.go index 9348fb6c..4be1f859 100644 --- a/internal/vpn/tunnelup.go +++ b/internal/vpn/tunnelup.go @@ -17,13 +17,6 @@ type tunnelUpData struct { } func (l *Loop) onTunnelUp(ctx context.Context, data tunnelUpData) { - vpnDestination, err := l.routing.VPNDestinationIP() - if err != nil { - l.logger.Warn(err.Error()) - } else { - l.logger.Info("VPN routing IP address: " + vpnDestination.String()) - } - if l.dnsLooper.GetSettings().Enabled { _, _ = l.dnsLooper.ApplyStatus(ctx, constants.Running) } @@ -40,7 +33,7 @@ func (l *Loop) onTunnelUp(ctx context.Context, data tunnelUpData) { } } - err = l.startPortForwarding(ctx, data) + err := l.startPortForwarding(ctx, data) if err != nil { l.logger.Error(err.Error()) } diff --git a/internal/vpn/wireguard.go b/internal/vpn/wireguard.go new file mode 100644 index 00000000..f5ddf416 --- /dev/null +++ b/internal/vpn/wireguard.go @@ -0,0 +1,45 @@ +package vpn + +import ( + "context" + "errors" + "fmt" + + "github.com/qdm12/gluetun/internal/configuration" + "github.com/qdm12/gluetun/internal/firewall" + "github.com/qdm12/gluetun/internal/netlink" + "github.com/qdm12/gluetun/internal/provider" + "github.com/qdm12/gluetun/internal/provider/utils" + "github.com/qdm12/gluetun/internal/wireguard" +) + +var ( + errGetServer = errors.New("failed finding a VPN server") + errCreateWireguard = errors.New("failed creating Wireguard") +) + +// setupWireguard sets Wireguard up using the configurators and settings given. +// It returns a serverName for port forwarding (PIA) and an error if it fails. +func setupWireguard(ctx context.Context, netlinker netlink.NetLinker, + fw firewall.VPNConnectionSetter, providerConf provider.Provider, + settings configuration.VPN, logger wireguard.Logger) ( + wireguarder wireguard.Wireguarder, serverName string, err error) { + connection, err := providerConf.GetConnection(settings.Provider.ServerSelection) + if err != nil { + return nil, "", fmt.Errorf("%w: %s", errGetServer, err) + } + + wireguardSettings := utils.BuildWireguardSettings(connection, settings.Wireguard) + + wireguarder, err = wireguard.New(wireguardSettings, netlinker, logger) + if err != nil { + return nil, "", fmt.Errorf("%w: %s", errCreateWireguard, err) + } + + err = fw.SetVPNConnection(ctx, connection, settings.Wireguard.Interface) + if err != nil { + return nil, "", fmt.Errorf("%w: %s", errFirewall, err) + } + + return wireguarder, connection.Hostname, nil +} diff --git a/internal/wireguard/address.go b/internal/wireguard/address.go new file mode 100644 index 00000000..b3485e1f --- /dev/null +++ b/internal/wireguard/address.go @@ -0,0 +1,25 @@ +package wireguard + +import ( + "fmt" + "net" + + "github.com/vishvananda/netlink" +) + +func (w *Wireguard) addAddresses(link netlink.Link, + addresses []*net.IPNet) (err error) { + for _, ipNet := range addresses { + address := &netlink.Addr{ + IPNet: ipNet, + } + + err = w.netlink.AddrAdd(link, address) + if err != nil { + return fmt.Errorf("%w: when adding address %s to link %s", + err, address, link.Attrs().Name) + } + } + + return nil +} diff --git a/internal/wireguard/address_test.go b/internal/wireguard/address_test.go new file mode 100644 index 00000000..0523fa62 --- /dev/null +++ b/internal/wireguard/address_test.go @@ -0,0 +1,94 @@ +package wireguard + +import ( + "errors" + "net" + "testing" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/vishvananda/netlink" +) + +func Test_Wireguard_addAddresses(t *testing.T) { + t.Parallel() + + ipNetOne := &net.IPNet{IP: net.IPv4(1, 2, 3, 4), Mask: net.IPv4Mask(255, 255, 255, 255)} + ipNetTwo := &net.IPNet{IP: net.IPv4(4, 5, 6, 7), Mask: net.IPv4Mask(255, 255, 255, 128)} + + newLink := func() netlink.Link { + linkAttrs := netlink.NewLinkAttrs() + linkAttrs.Name = "a_bridge" + return &netlink.Bridge{ + LinkAttrs: linkAttrs, + } + } + + errDummy := errors.New("dummy") + + testCases := map[string]struct { + link netlink.Link + addrs []*net.IPNet + expectedAddrs []*netlink.Addr + addrAddErrs []error + err error + }{ + "success": { + link: newLink(), + addrs: []*net.IPNet{ipNetOne, ipNetTwo}, + expectedAddrs: []*netlink.Addr{ + {IPNet: ipNetOne}, {IPNet: ipNetTwo}, + }, + addrAddErrs: []error{nil, nil}, + }, + "first add error": { + link: newLink(), + addrs: []*net.IPNet{ipNetOne, ipNetTwo}, + expectedAddrs: []*netlink.Addr{ + {IPNet: ipNetOne}, + }, + addrAddErrs: []error{errDummy}, + err: errors.New("dummy: when adding address 1.2.3.4/32 to link a_bridge"), + }, + "second add error": { + link: newLink(), + addrs: []*net.IPNet{ipNetOne, ipNetTwo}, + expectedAddrs: []*netlink.Addr{ + {IPNet: ipNetOne}, {IPNet: ipNetTwo}, + }, + addrAddErrs: []error{nil, errDummy}, + err: errors.New("dummy: when adding address 4.5.6.7/25 to link a_bridge"), + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + ctrl := gomock.NewController(t) + + require.Equal(t, len(testCase.expectedAddrs), len(testCase.addrAddErrs)) + + netLinker := NewMockNetLinker(ctrl) + wg := Wireguard{ + netlink: netLinker, + } + + for i := range testCase.expectedAddrs { + netLinker.EXPECT(). + AddrAdd(testCase.link, testCase.expectedAddrs[i]). + Return(testCase.addrAddErrs[i]) + } + + err := wg.addAddresses(testCase.link, testCase.addrs) + + if testCase.err != nil { + require.Error(t, err) + assert.Equal(t, testCase.err.Error(), err.Error()) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/internal/wireguard/cleanup.go b/internal/wireguard/cleanup.go new file mode 100644 index 00000000..d567b12e --- /dev/null +++ b/internal/wireguard/cleanup.go @@ -0,0 +1,59 @@ +package wireguard + +import "sort" + +type closer struct { + operation string + step step + close func() error + closed bool +} + +type closers []closer + +func (c *closers) add(operation string, step step, + closeFunc func() error) { + closer := closer{ + operation: operation, + step: step, + close: closeFunc, + } + *c = append(*c, closer) +} + +func (c *closers) cleanup(logger Logger) { + closers := *c + + sort.Slice(closers, func(i, j int) bool { + return closers[i].step < closers[j].step + }) + + for i, closer := range closers { + if closer.closed { + continue + } else { + closers[i].closed = true + } + logger.Debug(closer.operation + "...") + err := closer.close() + if err != nil { + logger.Error("failed " + closer.operation + ": " + err.Error()) + } + } +} + +type step int + +const ( + // stepOne closes the wireguard controller client, + // and removes the IP rule. + stepOne step = iota + // stepTwo closes the UAPI listener. + stepTwo + // stepThree closes the UAPI file. + stepThree + // stepFour closes the Wireguard device. + stepFour + // stepFive closes the bind connection and the TUN device file. + stepFive +) diff --git a/internal/wireguard/cleanup_test.go b/internal/wireguard/cleanup_test.go new file mode 100644 index 00000000..4968ad96 --- /dev/null +++ b/internal/wireguard/cleanup_test.go @@ -0,0 +1,57 @@ +package wireguard + +import ( + "errors" + "testing" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" +) + +func Test_closers(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + + var ACloseCalled, BCloseCalled, CCloseCalled bool + var ( + AErr error + BErr = errors.New("B failed") + CErr = errors.New("C failed") + ) + + var closers closers + closers.add("closing A", stepFive, func() error { + ACloseCalled = true + return AErr + }) + + closers.add("closing B", stepThree, func() error { + BCloseCalled = true + return BErr + }) + + closers.add("closing C", stepTwo, func() error { + CCloseCalled = true + return CErr + }) + + logger := NewMockLogger(ctrl) + prevCall := logger.EXPECT().Debug("closing C...") + prevCall = logger.EXPECT().Error("failed closing C: C failed").After(prevCall) + prevCall = logger.EXPECT().Debug("closing B...").After(prevCall) + prevCall = logger.EXPECT().Error("failed closing B: B failed").After(prevCall) + logger.EXPECT().Debug("closing A...").After(prevCall) + + closers.cleanup(logger) + + closers.cleanup(logger) // run twice should not close already closed + + for _, closer := range closers { + assert.True(t, closer.closed) + } + + assert.True(t, ACloseCalled) + assert.True(t, BCloseCalled) + assert.True(t, CCloseCalled) +} diff --git a/internal/wireguard/config.go b/internal/wireguard/config.go new file mode 100644 index 00000000..fa660dce --- /dev/null +++ b/internal/wireguard/config.go @@ -0,0 +1,86 @@ +package wireguard + +import ( + "errors" + "fmt" + "net" + + "golang.zx2c4.com/wireguard/wgctrl" + "golang.zx2c4.com/wireguard/wgctrl/wgtypes" +) + +var ( + errMakeConfig = errors.New("cannot make device configuration") + errConfigureDevice = errors.New("cannot configure device") +) + +func configureDevice(client *wgctrl.Client, settings Settings) (err error) { + deviceConfig, err := makeDeviceConfig(settings) + if err != nil { + return fmt.Errorf("%w: %s", errMakeConfig, err) + } + + err = client.ConfigureDevice(settings.InterfaceName, deviceConfig) + if err != nil { + return fmt.Errorf("%w: %s", errConfigureDevice, err) + } + + return nil +} + +func makeDeviceConfig(settings Settings) (config wgtypes.Config, err error) { + privateKey, err := wgtypes.ParseKey(settings.PrivateKey) + if err != nil { + return config, ErrPrivateKeyInvalid + } + + publicKey, err := wgtypes.ParseKey(settings.PublicKey) + if err != nil { + return config, fmt.Errorf("%w: %s", ErrPublicKeyInvalid, settings.PublicKey) + } + + var preSharedKey *wgtypes.Key + if settings.PreSharedKey != "" { + preSharedKeyValue, err := wgtypes.ParseKey(settings.PreSharedKey) + if err != nil { + return config, ErrPreSharedKeyInvalid + } + preSharedKey = &preSharedKeyValue + } + + firewallMark := settings.FirewallMark + + config = wgtypes.Config{ + PrivateKey: &privateKey, + ReplacePeers: true, + FirewallMark: &firewallMark, + Peers: []wgtypes.PeerConfig{ + { + PublicKey: publicKey, + PresharedKey: preSharedKey, + AllowedIPs: []net.IPNet{ + *allIPv4(), + *allIPv6(), + }, + ReplaceAllowedIPs: true, + Endpoint: settings.Endpoint, + }, + }, + } + + return config, nil +} + +func allIPv4() (ipNet *net.IPNet) { + return &net.IPNet{ + IP: net.IPv4(0, 0, 0, 0), + Mask: []byte{0, 0, 0, 0}, + } +} + +func allIPv6() (ipNet *net.IPNet) { + return &net.IPNet{ + IP: net.IPv6zero, + Mask: []byte(net.IPv6zero), + } +} diff --git a/internal/wireguard/config_test.go b/internal/wireguard/config_test.go new file mode 100644 index 00000000..e3a65557 --- /dev/null +++ b/internal/wireguard/config_test.go @@ -0,0 +1,126 @@ +package wireguard + +import ( + "errors" + "net" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "golang.zx2c4.com/wireguard/wgctrl/wgtypes" +) + +func Test_makeDeviceConfig(t *testing.T) { + t.Parallel() + + const ( + validKey1 = "oMNSf/zJ0pt1ciy+qIRk8Rlyfs9accwuRLnKd85Yl1Q=" + validKey2 = "aPjc9US5ICB30D1P4glR9tO7bkB2Ga+KZiFqnoypBHk=" + validKey3 = "gFIW0lTmBYEucynoIg+XmeWckDUXTcC4Po5ijR5G+HM=" + ) + + parseKey := func(t *testing.T, s string) *wgtypes.Key { + t.Helper() + key, err := wgtypes.ParseKey(s) + require.NoError(t, err) + return &key + } + + intPtr := func(n int) *int { return &n } + + testCases := map[string]struct { + settings Settings + config wgtypes.Config + err error + }{ + "bad private key": { + settings: Settings{ + PrivateKey: "bad key", + }, + err: ErrPrivateKeyInvalid, + }, + "bad public key": { + settings: Settings{ + PrivateKey: validKey1, + PublicKey: "bad key", + }, + err: errors.New("cannot parse public key: bad key"), + }, + "bad pre-shared key": { + settings: Settings{ + PrivateKey: validKey1, + PublicKey: validKey2, + PreSharedKey: "bad key", + }, + err: errors.New("cannot parse pre-shared key"), + }, + "valid settings": { + settings: Settings{ + PrivateKey: validKey1, + PublicKey: validKey2, + PreSharedKey: validKey3, + FirewallMark: 9876, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(99, 99, 99, 99), + Port: 51820, + }, + }, + config: wgtypes.Config{ + PrivateKey: parseKey(t, validKey1), + ReplacePeers: true, + FirewallMark: intPtr(9876), + Peers: []wgtypes.PeerConfig{ + { + PublicKey: *parseKey(t, validKey2), + PresharedKey: parseKey(t, validKey3), + AllowedIPs: []net.IPNet{ + { + IP: net.IPv4(0, 0, 0, 0), + Mask: []byte{0, 0, 0, 0}, + }, + { + IP: net.IPv6zero, + Mask: []byte(net.IPv6zero), + }, + }, + ReplaceAllowedIPs: true, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(99, 99, 99, 99), + Port: 51820, + }, + }, + }, + }, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + config, err := makeDeviceConfig(testCase.settings) + + if testCase.err != nil { + require.Error(t, err) + assert.Equal(t, testCase.err.Error(), err.Error()) + } else { + assert.NoError(t, err) + } + + assert.Equal(t, testCase.config, config) + }) + } +} + +func Test_allIPv4(t *testing.T) { + t.Parallel() + ipNet := allIPv4() + assert.Equal(t, "0.0.0.0/0", ipNet.String()) +} + +func Test_allIPv6(t *testing.T) { + t.Parallel() + ipNet := allIPv6() + assert.Equal(t, "::/0", ipNet.String()) +} diff --git a/internal/wireguard/constructor.go b/internal/wireguard/constructor.go new file mode 100644 index 00000000..70caa547 --- /dev/null +++ b/internal/wireguard/constructor.go @@ -0,0 +1,30 @@ +package wireguard + +import "github.com/qdm12/gluetun/internal/netlink" + +var _ Wireguarder = (*Wireguard)(nil) + +type Wireguarder interface { + Runner + Runner +} + +type Wireguard struct { + logger Logger + settings Settings + netlink netlink.NetLinker +} + +func New(settings Settings, netlink NetLinker, + logger Logger) (w *Wireguard, err error) { + settings.SetDefaults() + if err := settings.Check(); err != nil { + return nil, err + } + + return &Wireguard{ + logger: logger, + settings: settings, + netlink: netlink, + }, nil +} diff --git a/internal/wireguard/constructor_test.go b/internal/wireguard/constructor_test.go new file mode 100644 index 00000000..0661fa46 --- /dev/null +++ b/internal/wireguard/constructor_test.go @@ -0,0 +1,80 @@ +package wireguard + +import ( + "net" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_New(t *testing.T) { + t.Parallel() + + const validKeyString = "oMNSf/zJ0pt1ciy+qIRk8Rlyfs9accwuRLnKd85Yl1Q=" + logger := NewMockLogger(nil) + netLinker := NewMockNetLinker(nil) + + testCases := map[string]struct { + settings Settings + wireguard *Wireguard + err error + }{ + "bad settings": { + settings: Settings{ + PrivateKey: "", + }, + err: ErrPrivateKeyMissing, + }, + "minimal valid settings": { + settings: Settings{ + PrivateKey: validKeyString, + PublicKey: validKeyString, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + }, + Addresses: []*net.IPNet{{ + IP: net.IPv4(5, 6, 7, 8), + Mask: net.IPv4Mask(255, 255, 255, 255)}, + }, + FirewallMark: 100, + }, + wireguard: &Wireguard{ + logger: logger, + netlink: netLinker, + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKeyString, + PublicKey: validKeyString, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + Port: 51820, + }, + Addresses: []*net.IPNet{{ + IP: net.IPv4(5, 6, 7, 8), + Mask: net.IPv4Mask(255, 255, 255, 255)}, + }, + FirewallMark: 100, + }, + }, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + wireguard, err := New(testCase.settings, netLinker, logger) + + if testCase.err != nil { + require.Error(t, err) + assert.Equal(t, testCase.err.Error(), err.Error()) + } else { + assert.NoError(t, err) + } + + assert.Equal(t, testCase.wireguard, wireguard) + }) + } +} diff --git a/internal/wireguard/log.go b/internal/wireguard/log.go new file mode 100644 index 00000000..b56c5b84 --- /dev/null +++ b/internal/wireguard/log.go @@ -0,0 +1,26 @@ +package wireguard + +import ( + "fmt" + + "golang.zx2c4.com/wireguard/device" +) + +//go:generate mockgen -destination=log_mock_test.go -package wireguard . Logger + +type Logger interface { + Debug(s string) + Info(s string) + Error(s string) +} + +func makeDeviceLogger(logger Logger) (deviceLogger *device.Logger) { + return &device.Logger{ + Verbosef: func(format string, args ...interface{}) { + logger.Debug(fmt.Sprintf(format, args...)) + }, + Errorf: func(format string, args ...interface{}) { + logger.Error(fmt.Sprintf(format, args...)) + }, + } +} diff --git a/internal/wireguard/log_mock_test.go b/internal/wireguard/log_mock_test.go new file mode 100644 index 00000000..a7a40456 --- /dev/null +++ b/internal/wireguard/log_mock_test.go @@ -0,0 +1,70 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/qdm12/gluetun/internal/wireguard (interfaces: Logger) + +// Package wireguard is a generated GoMock package. +package wireguard + +import ( + reflect "reflect" + + gomock "github.com/golang/mock/gomock" +) + +// MockLogger is a mock of Logger interface. +type MockLogger struct { + ctrl *gomock.Controller + recorder *MockLoggerMockRecorder +} + +// MockLoggerMockRecorder is the mock recorder for MockLogger. +type MockLoggerMockRecorder struct { + mock *MockLogger +} + +// NewMockLogger creates a new mock instance. +func NewMockLogger(ctrl *gomock.Controller) *MockLogger { + mock := &MockLogger{ctrl: ctrl} + mock.recorder = &MockLoggerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockLogger) EXPECT() *MockLoggerMockRecorder { + return m.recorder +} + +// Debug mocks base method. +func (m *MockLogger) Debug(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Debug", arg0) +} + +// Debug indicates an expected call of Debug. +func (mr *MockLoggerMockRecorder) Debug(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Debug", reflect.TypeOf((*MockLogger)(nil).Debug), arg0) +} + +// Error mocks base method. +func (m *MockLogger) Error(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Error", arg0) +} + +// Error indicates an expected call of Error. +func (mr *MockLoggerMockRecorder) Error(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Error", reflect.TypeOf((*MockLogger)(nil).Error), arg0) +} + +// Info mocks base method. +func (m *MockLogger) Info(arg0 string) { + m.ctrl.T.Helper() + m.ctrl.Call(m, "Info", arg0) +} + +// Info indicates an expected call of Info. +func (mr *MockLoggerMockRecorder) Info(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Info", reflect.TypeOf((*MockLogger)(nil).Info), arg0) +} diff --git a/internal/wireguard/log_test.go b/internal/wireguard/log_test.go new file mode 100644 index 00000000..c35c3d37 --- /dev/null +++ b/internal/wireguard/log_test.go @@ -0,0 +1,23 @@ +package wireguard + +import ( + "testing" + + "github.com/golang/mock/gomock" +) + +func Test_makeDeviceLogger(t *testing.T) { + t.Parallel() + + ctrl := gomock.NewController(t) + + logger := NewMockLogger(ctrl) + + deviceLogger := makeDeviceLogger(logger) + + logger.EXPECT().Debug("test 1") + deviceLogger.Verbosef("test %d", 1) + + logger.EXPECT().Error("test 2") + deviceLogger.Errorf("test %d", 2) +} diff --git a/internal/wireguard/netlink_integration_test.go b/internal/wireguard/netlink_integration_test.go new file mode 100644 index 00000000..f6f9b10d --- /dev/null +++ b/internal/wireguard/netlink_integration_test.go @@ -0,0 +1,113 @@ +// +build netlink + +package wireguard + +import ( + "fmt" + "math/rand" + "net" + "testing" + + inetlink "github.com/qdm12/gluetun/internal/netlink" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/vishvananda/netlink" +) + +func Test_netlink_Wireguard_addAddresses(t *testing.T) { + t.Parallel() + + netlinker := inetlink.New() + wg := &Wireguard{ + netlink: netlinker, + } + + intfName := "test_" + fmt.Sprint(rand.Intn(10000)) //nolint:gosec + + // Add link + linkAttrs := netlink.NewLinkAttrs() + linkAttrs.Name = intfName + link := &netlink.Bridge{ + LinkAttrs: linkAttrs, + } + err := netlink.LinkAdd(link) + require.NoError(t, err) + + defer func() { + err = netlink.LinkDel(link) + assert.NoError(t, err) + }() + + addresses := []*net.IPNet{ + {IP: net.IP{1, 2, 3, 4}, Mask: net.IPv4Mask(255, 255, 255, 255)}, + {IP: net.IP{5, 6, 7, 8}, Mask: net.IPv4Mask(255, 255, 255, 255)}, + } + + // Success + err = wg.addAddresses(link, addresses) + require.NoError(t, err) + + netlinkAddresses, err := netlink.AddrList(link, netlink.FAMILY_ALL) + require.NoError(t, err) + require.Equal(t, len(addresses), len(netlinkAddresses)) + for i, netlinkAddress := range netlinkAddresses { + ipNet := netlinkAddress.IPNet + assert.Equal(t, addresses[i], ipNet) + } + + // Existing address cannot be added + err = wg.addAddresses(link, addresses) + require.Error(t, err) + assert.Equal(t, "file exists: when adding address 1.2.3.4/32 to link test_8081", err.Error()) +} + +func Test_netlink_Wireguard_addRule(t *testing.T) { + t.Parallel() + + netlinker := inetlink.New() + wg := &Wireguard{ + netlink: netlinker, + } + + rulePriority := 10000 + const firewallMark = 999 + + cleanup, err := wg.addRule(rulePriority, firewallMark) + require.NoError(t, err) + defer func() { + err := cleanup() + assert.NoError(t, err) + }() + + rules, err := netlink.RuleList(netlink.FAMILY_ALL) + require.NoError(t, err) + var rule netlink.Rule + var ruleFound bool + for _, rule = range rules { + if rule.Mark == firewallMark { + ruleFound = true + break + } + } + require.True(t, ruleFound) + expectedRule := netlink.Rule{ + Invert: true, + Priority: rulePriority, + Mark: firewallMark, + Table: firewallMark, + Mask: 4294967295, + Goto: -1, + Flow: -1, + SuppressIfgroup: -1, + SuppressPrefixlen: -1, + } + assert.Equal(t, expectedRule, rule) + + // Existing rule cannot be added + nilCleanup, err := wg.addRule(rulePriority, firewallMark) + if nilCleanup != nil { + _ = nilCleanup() // in case it succeeds + } + require.Error(t, err) + assert.Equal(t, "file exists: when adding rule: ip rule 10000: from table 999", err.Error()) +} diff --git a/internal/wireguard/netlinker.go b/internal/wireguard/netlinker.go new file mode 100644 index 00000000..818c3fb9 --- /dev/null +++ b/internal/wireguard/netlinker.go @@ -0,0 +1,12 @@ +package wireguard + +import "github.com/vishvananda/netlink" + +//go:generate mockgen -destination=netlinker_mock_test.go -package wireguard . NetLinker + +type NetLinker interface { + AddrAdd(link netlink.Link, addr *netlink.Addr) error + RouteAdd(route *netlink.Route) error + RuleAdd(rule *netlink.Rule) error + RuleDel(rule *netlink.Rule) error +} diff --git a/internal/wireguard/netlinker_mock_test.go b/internal/wireguard/netlinker_mock_test.go new file mode 100644 index 00000000..8617aa38 --- /dev/null +++ b/internal/wireguard/netlinker_mock_test.go @@ -0,0 +1,91 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/qdm12/gluetun/internal/wireguard (interfaces: NetLinker) + +// Package wireguard is a generated GoMock package. +package wireguard + +import ( + reflect "reflect" + + gomock "github.com/golang/mock/gomock" + netlink "github.com/vishvananda/netlink" +) + +// MockNetLinker is a mock of NetLinker interface. +type MockNetLinker struct { + ctrl *gomock.Controller + recorder *MockNetLinkerMockRecorder +} + +// MockNetLinkerMockRecorder is the mock recorder for MockNetLinker. +type MockNetLinkerMockRecorder struct { + mock *MockNetLinker +} + +// NewMockNetLinker creates a new mock instance. +func NewMockNetLinker(ctrl *gomock.Controller) *MockNetLinker { + mock := &MockNetLinker{ctrl: ctrl} + mock.recorder = &MockNetLinkerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockNetLinker) EXPECT() *MockNetLinkerMockRecorder { + return m.recorder +} + +// AddrAdd mocks base method. +func (m *MockNetLinker) AddrAdd(arg0 netlink.Link, arg1 *netlink.Addr) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AddrAdd", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// AddrAdd indicates an expected call of AddrAdd. +func (mr *MockNetLinkerMockRecorder) AddrAdd(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AddrAdd", reflect.TypeOf((*MockNetLinker)(nil).AddrAdd), arg0, arg1) +} + +// RouteAdd mocks base method. +func (m *MockNetLinker) RouteAdd(arg0 *netlink.Route) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RouteAdd", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// RouteAdd indicates an expected call of RouteAdd. +func (mr *MockNetLinkerMockRecorder) RouteAdd(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RouteAdd", reflect.TypeOf((*MockNetLinker)(nil).RouteAdd), arg0) +} + +// RuleAdd mocks base method. +func (m *MockNetLinker) RuleAdd(arg0 *netlink.Rule) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RuleAdd", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// RuleAdd indicates an expected call of RuleAdd. +func (mr *MockNetLinkerMockRecorder) RuleAdd(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RuleAdd", reflect.TypeOf((*MockNetLinker)(nil).RuleAdd), arg0) +} + +// RuleDel mocks base method. +func (m *MockNetLinker) RuleDel(arg0 *netlink.Rule) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "RuleDel", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// RuleDel indicates an expected call of RuleDel. +func (mr *MockNetLinkerMockRecorder) RuleDel(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RuleDel", reflect.TypeOf((*MockNetLinker)(nil).RuleDel), arg0) +} diff --git a/internal/wireguard/route.go b/internal/wireguard/route.go new file mode 100644 index 00000000..33ca7e9d --- /dev/null +++ b/internal/wireguard/route.go @@ -0,0 +1,26 @@ +package wireguard + +import ( + "fmt" + "net" + + "github.com/vishvananda/netlink" +) + +// TODO add IPv6 route if IPv6 is supported + +func (w *Wireguard) addRoute(link netlink.Link, dst *net.IPNet, + firewallMark int) (err error) { + route := &netlink.Route{ + LinkIndex: link.Attrs().Index, + Dst: dst, + Table: firewallMark, + } + + err = w.netlink.RouteAdd(route) + if err != nil { + return fmt.Errorf("%w: when adding route: %s", err, route) + } + + return err +} diff --git a/internal/wireguard/route_test.go b/internal/wireguard/route_test.go new file mode 100644 index 00000000..68f6a499 --- /dev/null +++ b/internal/wireguard/route_test.go @@ -0,0 +1,85 @@ +package wireguard + +import ( + "errors" + "net" + "testing" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/vishvananda/netlink" +) + +func Test_Wireguard_addRoute(t *testing.T) { + t.Parallel() + + const linkIndex = 88 + newLink := func() netlink.Link { + linkAttrs := netlink.NewLinkAttrs() + linkAttrs.Name = "a_bridge" + linkAttrs.Index = linkIndex + return &netlink.Bridge{ + LinkAttrs: linkAttrs, + } + } + ipNet := &net.IPNet{IP: net.IPv4(1, 2, 3, 4), Mask: net.IPv4Mask(255, 255, 255, 255)} + const firewallMark = 51820 + + errDummy := errors.New("dummy") + + testCases := map[string]struct { + link netlink.Link + dst *net.IPNet + expectedRoute *netlink.Route + routeAddErr error + err error + }{ + "success": { + link: newLink(), + dst: ipNet, + expectedRoute: &netlink.Route{ + LinkIndex: linkIndex, + Dst: ipNet, + Table: firewallMark, + }, + }, + "route add error": { + link: newLink(), + dst: ipNet, + expectedRoute: &netlink.Route{ + LinkIndex: linkIndex, + Dst: ipNet, + Table: firewallMark, + }, + routeAddErr: errDummy, + err: errors.New("dummy: when adding route: {Ifindex: 88 Dst: 1.2.3.4/32 Src: Gw: Flags: [] Table: 51820}"), //nolint:lll + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + ctrl := gomock.NewController(t) + + netLinker := NewMockNetLinker(ctrl) + wg := Wireguard{ + netlink: netLinker, + } + + netLinker.EXPECT(). + RouteAdd(testCase.expectedRoute). + Return(testCase.routeAddErr) + + err := wg.addRoute(testCase.link, testCase.dst, firewallMark) + + if testCase.err != nil { + require.Error(t, err) + assert.Equal(t, testCase.err.Error(), err.Error()) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/internal/wireguard/rule.go b/internal/wireguard/rule.go new file mode 100644 index 00000000..ff5136d2 --- /dev/null +++ b/internal/wireguard/rule.go @@ -0,0 +1,28 @@ +package wireguard + +import ( + "fmt" + + "github.com/vishvananda/netlink" +) + +func (w *Wireguard) addRule(rulePriority, firewallMark int) ( + cleanup func() error, err error) { + rule := netlink.NewRule() + rule.Invert = true + rule.Priority = rulePriority + rule.Mark = firewallMark + rule.Table = firewallMark + if err := w.netlink.RuleAdd(rule); err != nil { + return nil, fmt.Errorf("%w: when adding rule: %s", err, rule) + } + + cleanup = func() error { + err := w.netlink.RuleDel(rule) + if err != nil { + return fmt.Errorf("%w: when deleting rule: %s", err, rule) + } + return nil + } + return cleanup, nil +} diff --git a/internal/wireguard/rule_test.go b/internal/wireguard/rule_test.go new file mode 100644 index 00000000..18d6abcb --- /dev/null +++ b/internal/wireguard/rule_test.go @@ -0,0 +1,106 @@ +package wireguard + +import ( + "errors" + "testing" + + "github.com/golang/mock/gomock" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/vishvananda/netlink" +) + +func Test_Wireguard_addRule(t *testing.T) { + t.Parallel() + + const rulePriority = 987 + const firewallMark = 456 + + errDummy := errors.New("dummy") + + testCases := map[string]struct { + expectedRule *netlink.Rule + ruleAddErr error + err error + ruleDelErr error + cleanupErr error + }{ + "success": { + expectedRule: &netlink.Rule{ + Invert: true, + Priority: rulePriority, + Mark: firewallMark, + Table: firewallMark, + Mask: -1, + Goto: -1, + Flow: -1, + SuppressIfgroup: -1, + SuppressPrefixlen: -1, + }, + }, + "rule add error": { + expectedRule: &netlink.Rule{ + Invert: true, + Priority: rulePriority, + Mark: firewallMark, + Table: firewallMark, + Mask: -1, + Goto: -1, + Flow: -1, + SuppressIfgroup: -1, + SuppressPrefixlen: -1, + }, + ruleAddErr: errDummy, + err: errors.New("dummy: when adding rule: ip rule 987: from table 456"), + }, + "rule delete error": { + expectedRule: &netlink.Rule{ + Invert: true, + Priority: rulePriority, + Mark: firewallMark, + Table: firewallMark, + Mask: -1, + Goto: -1, + Flow: -1, + SuppressIfgroup: -1, + SuppressPrefixlen: -1, + }, + ruleDelErr: errDummy, + cleanupErr: errors.New("dummy: when deleting rule: ip rule 987: from table 456"), + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + ctrl := gomock.NewController(t) + + netLinker := NewMockNetLinker(ctrl) + wg := Wireguard{ + netlink: netLinker, + } + + netLinker.EXPECT().RuleAdd(testCase.expectedRule). + Return(testCase.ruleAddErr) + cleanup, err := wg.addRule(rulePriority, firewallMark) + if testCase.err != nil { + require.Error(t, err) + assert.Equal(t, testCase.err.Error(), err.Error()) + return + } + + require.NoError(t, err) + + netLinker.EXPECT().RuleDel(testCase.expectedRule). + Return(testCase.ruleDelErr) + err = cleanup() + if testCase.cleanupErr != nil { + require.Error(t, err) + assert.Equal(t, testCase.cleanupErr.Error(), err.Error()) + } else { + require.NoError(t, err) + } + }) + } +} diff --git a/internal/wireguard/run.go b/internal/wireguard/run.go new file mode 100644 index 00000000..b0d18015 --- /dev/null +++ b/internal/wireguard/run.go @@ -0,0 +1,165 @@ +package wireguard + +import ( + "context" + "errors" + "fmt" + "net" + + "github.com/vishvananda/netlink" + "golang.zx2c4.com/wireguard/conn" + "golang.zx2c4.com/wireguard/device" + "golang.zx2c4.com/wireguard/ipc" + "golang.zx2c4.com/wireguard/tun" + "golang.zx2c4.com/wireguard/wgctrl" +) + +var ( + ErrCreateTun = errors.New("cannot create TUN device") + ErrFindLink = errors.New("cannot find link") + ErrFindDevice = errors.New("cannot find Wireguard device") + ErrUAPISocketOpening = errors.New("cannot open UAPI socket") + ErrWgctrlOpen = errors.New("cannot open wgctrl") + ErrUAPIListen = errors.New("cannot listen on UAPI socket") + ErrAddAddress = errors.New("cannot add address to wireguard interface") + ErrConfigure = errors.New("cannot configure wireguard interface") + ErrIfaceUp = errors.New("cannot set the interface to UP") + ErrRouteAdd = errors.New("cannot add route for interface") + ErrRuleAdd = errors.New("cannot add rule for interface") + ErrDeviceWaited = errors.New("device waited for") +) + +type Runner interface { + Run(ctx context.Context, waitError chan<- error, ready chan<- struct{}) +} + +// See https://git.zx2c4.com/wireguard-go/tree/main.go +func (w *Wireguard) Run(ctx context.Context, waitError chan<- error, ready chan<- struct{}) { + client, err := wgctrl.New() + if err != nil { + waitError <- fmt.Errorf("%w: %s", ErrWgctrlOpen, err) + return + } + + var closers closers + closers.add("closing controller client", stepOne, client.Close) + + defer closers.cleanup(w.logger) + + tun, err := tun.CreateTUN(w.settings.InterfaceName, device.DefaultMTU) + if err != nil { + waitError <- fmt.Errorf("%w: %s", ErrCreateTun, err) + return + } + + closers.add("closing TUN device", stepFive, tun.Close) + + tunName, err := tun.Name() + if err != nil { + waitError <- fmt.Errorf("%w: cannot get TUN name: %s", ErrCreateTun, err) + return + } else if tunName != w.settings.InterfaceName { + waitError <- fmt.Errorf("%w: names don't match: expected %q and got %q", + ErrCreateTun, w.settings.InterfaceName, tunName) + return + } + + link, err := netlink.LinkByName(w.settings.InterfaceName) + if err != nil { + waitError <- fmt.Errorf("%w: %s: %s", ErrFindLink, w.settings.InterfaceName, err) + return + } + + bind := conn.NewDefaultBind() + + closers.add("closing bind", stepFive, bind.Close) + + deviceLogger := makeDeviceLogger(w.logger) + device := device.NewDevice(tun, bind, deviceLogger) + + closers.add("closing Wireguard device", stepFour, func() error { + device.Close() + return nil + }) + + uapiFile, err := ipc.UAPIOpen(w.settings.InterfaceName) + if err != nil { + waitError <- fmt.Errorf("%w: %s", ErrUAPISocketOpening, err) + return + } + + closers.add("closing UAPI file", stepThree, uapiFile.Close) + + uapiListener, err := ipc.UAPIListen(w.settings.InterfaceName, uapiFile) + if err != nil { + waitError <- fmt.Errorf("%w: %s", ErrUAPIListen, err) + return + } + + closers.add("closing UAPI listener", stepTwo, uapiListener.Close) + + // acceptAndHandle exits when uapiListener is closed + uapiAcceptErrorCh := make(chan error) + go acceptAndHandle(uapiListener, device, uapiAcceptErrorCh) + + err = w.addAddresses(link, w.settings.Addresses) + if err != nil { + waitError <- fmt.Errorf("%w: %s", ErrAddAddress, err) + return + } + + err = configureDevice(client, w.settings) + if err != nil { + waitError <- fmt.Errorf("%w: %s", ErrConfigure, err) + return + } + + if err := netlink.LinkSetUp(link); err != nil { + waitError <- fmt.Errorf("%w: %s", ErrIfaceUp, err) + return + } + + err = w.addRoute(link, allIPv4(), w.settings.FirewallMark) + if err != nil { + waitError <- fmt.Errorf("%w: %s", ErrRouteAdd, err) + return + } + + ruleCleanup, err := w.addRule( + w.settings.RulePriority, w.settings.FirewallMark) + if err != nil { + waitError <- fmt.Errorf("%w: %s", ErrRuleAdd, err) + return + } + closers.add("removing rule", stepOne, ruleCleanup) + + w.logger.Info("Wireguard is up") + ready <- struct{}{} + + select { + case <-ctx.Done(): + err = ctx.Err() + case err = <-uapiAcceptErrorCh: + close(uapiAcceptErrorCh) + case <-device.Wait(): + err = ErrDeviceWaited + } + + closers.cleanup(w.logger) + + <-uapiAcceptErrorCh // wait for acceptAndHandle to exit + + waitError <- err +} + +func acceptAndHandle(uapi net.Listener, device *device.Device, + uapiAcceptErrorCh chan<- error) { + for { // stopped by uapiFile.Close() + conn, err := uapi.Accept() + if err != nil { + uapiAcceptErrorCh <- err + return + } + go device.IpcHandle(conn) + } +} diff --git a/internal/wireguard/settings.go b/internal/wireguard/settings.go new file mode 100644 index 00000000..cfe18b23 --- /dev/null +++ b/internal/wireguard/settings.go @@ -0,0 +1,212 @@ +package wireguard + +import ( + "errors" + "fmt" + "net" + "regexp" + "strings" + + "golang.zx2c4.com/wireguard/wgctrl/wgtypes" +) + +type Settings struct { + // Interface name for the Wireguard interface. + // It defaults to wg0 if unset. + InterfaceName string + // Private key in base 64 format + PrivateKey string + // Public key in base 64 format + PublicKey string + // Pre shared key in base 64 format + PreSharedKey string + // Wireguard server endpoint to connect to. + Endpoint *net.UDPAddr + // Addresses assigned to the client. + Addresses []*net.IPNet + // FirewallMark to be used in routing tables and IP rules. + // It defaults to 51820 if left to 0. + FirewallMark int + // RulePriority is the priority for the rule created with the + // FirewallMark. + RulePriority int +} + +func (s *Settings) SetDefaults() { + if s.InterfaceName == "" { + const defaultInterfaceName = "wg0" + s.InterfaceName = defaultInterfaceName + } + + if s.Endpoint != nil && s.Endpoint.Port == 0 { + const defaultPort = 51820 + s.Endpoint.Port = defaultPort + } + + if s.FirewallMark == 0 { + const defaultFirewallMark = 51820 + s.FirewallMark = defaultFirewallMark + } +} + +var ( + ErrInterfaceNameInvalid = errors.New("invalid interface name") + ErrPrivateKeyMissing = errors.New("private key is missing") + ErrPrivateKeyInvalid = errors.New("cannot parse private key") + ErrPublicKeyMissing = errors.New("public key is missing") + ErrPublicKeyInvalid = errors.New("cannot parse public key") + ErrPreSharedKeyInvalid = errors.New("cannot parse pre-shared key") + ErrEndpointMissing = errors.New("endpoint is missing") + ErrEndpointIPMissing = errors.New("endpoint IP is missing") + ErrEndpointPortMissing = errors.New("endpoint port is missing") + ErrAddressMissing = errors.New("interface address is missing") + ErrAddressNil = errors.New("interface address is nil") + ErrAddressIPMissing = errors.New("interface address IP is missing") + ErrAddressMaskMissing = errors.New("interface address mask is missing") + ErrFirewallMarkMissing = errors.New("firewall mark is missing") +) + +var interfaceNameRegexp = regexp.MustCompile(`^[a-zA-Z0-9_]+$`) + +func (s *Settings) Check() (err error) { + if !interfaceNameRegexp.MatchString(s.InterfaceName) { + return fmt.Errorf("%w: %s", ErrInterfaceNameInvalid, s.InterfaceName) + } + + if s.PrivateKey == "" { + return ErrPrivateKeyMissing + } else if _, err := wgtypes.ParseKey(s.PrivateKey); err != nil { + return ErrPrivateKeyInvalid + } + + if s.PublicKey == "" { + return ErrPublicKeyMissing + } else if _, err := wgtypes.ParseKey(s.PublicKey); err != nil { + return fmt.Errorf("%w: %s", ErrPublicKeyInvalid, s.PublicKey) + } + + if s.PreSharedKey != "" { + if _, err := wgtypes.ParseKey(s.PreSharedKey); err != nil { + return ErrPreSharedKeyInvalid + } + } + + switch { + case s.Endpoint == nil: + return ErrEndpointMissing + case s.Endpoint.IP == nil: + return ErrEndpointIPMissing + case s.Endpoint.Port == 0: + return ErrEndpointPortMissing + } + + if len(s.Addresses) == 0 { + return ErrAddressMissing + } + for i, addr := range s.Addresses { + switch { + case addr == nil: + return fmt.Errorf("%w: for address %d of %d", + ErrAddressNil, i+1, len(s.Addresses)) + case addr.IP == nil: + return fmt.Errorf("%w: for address %d of %d", + ErrAddressIPMissing, i+1, len(s.Addresses)) + case addr.Mask == nil: + return fmt.Errorf("%w: for address %d of %d", + ErrAddressMaskMissing, i+1, len(s.Addresses)) + } + } + + if s.FirewallMark == 0 { + return ErrFirewallMarkMissing + } + + return nil +} + +func (s Settings) String() string { + lines := s.ToLines(ToLinesSettings{}) + return strings.Join(lines, "\n") +} + +type ToLinesSettings struct { + // Indent defaults to 4 spaces " ". + Indent *string + // FieldPrefix defaults to "├── ". + FieldPrefix *string + // LastFieldPrefix defaults to "└── ". + LastFieldPrefix *string +} + +func (settings *ToLinesSettings) setDefaults() { + toStringPtr := func(s string) *string { return &s } + if settings.Indent == nil { + settings.Indent = toStringPtr(" ") + } + if settings.FieldPrefix == nil { + settings.FieldPrefix = toStringPtr("├── ") + } + if settings.LastFieldPrefix == nil { + settings.LastFieldPrefix = toStringPtr("└── ") + } +} + +// ToLines serializes the settings to a slice of strings for display. +func (s Settings) ToLines(settings ToLinesSettings) (lines []string) { + settings.setDefaults() + + indent := *settings.Indent + fieldPrefix := *settings.FieldPrefix + lastFieldPrefix := *settings.LastFieldPrefix + + lines = append(lines, fieldPrefix+"Interface name: "+s.InterfaceName) + const ( + set = "set" + notSet = "not set" + ) + + isSet := notSet + if s.PrivateKey != "" { + isSet = set + } + lines = append(lines, fieldPrefix+"Private key: "+isSet) + + if s.PublicKey != "" { + lines = append(lines, fieldPrefix+"PublicKey: "+s.PublicKey) + } + + isSet = notSet + if s.PreSharedKey != "" { + isSet = set + } + lines = append(lines, fieldPrefix+"Pre shared key: "+isSet) + + endpointStr := notSet + if s.Endpoint != nil { + endpointStr = s.Endpoint.String() + } + lines = append(lines, fieldPrefix+"Endpoint: "+endpointStr) + + if s.FirewallMark != 0 { + lines = append(lines, fieldPrefix+"Firewall mark: "+fmt.Sprint(s.FirewallMark)) + } + + if s.RulePriority != 0 { + lines = append(lines, fieldPrefix+"Rule priority: "+fmt.Sprint(s.RulePriority)) + } + + if len(s.Addresses) == 0 { + lines = append(lines, lastFieldPrefix+"Addresses: "+notSet) + } else { + lines = append(lines, lastFieldPrefix+"Addresses:") + for i, address := range s.Addresses { + prefix := fieldPrefix + if i == len(s.Addresses)-1 { + prefix = lastFieldPrefix + } + lines = append(lines, indent+prefix+address.String()) + } + } + + return lines +} diff --git a/internal/wireguard/settings_test.go b/internal/wireguard/settings_test.go new file mode 100644 index 00000000..11cb184f --- /dev/null +++ b/internal/wireguard/settings_test.go @@ -0,0 +1,377 @@ +package wireguard + +import ( + "errors" + "net" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_Settings_SetDefaults(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + original Settings + expected Settings + }{ + "empty settings": { + expected: Settings{ + InterfaceName: "wg0", + FirewallMark: 51820, + }, + }, + "default endpoint port": { + original: Settings{ + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + }, + }, + expected: Settings{ + InterfaceName: "wg0", + FirewallMark: 51820, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + Port: 51820, + }, + }, + }, + "not empty settings": { + original: Settings{ + InterfaceName: "wg1", + FirewallMark: 999, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + Port: 9999, + }, + }, + expected: Settings{ + InterfaceName: "wg1", + FirewallMark: 999, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + Port: 9999, + }, + }, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + testCase.original.SetDefaults() + + assert.Equal(t, testCase.expected, testCase.original) + }) + } +} + +func Test_Settings_Check(t *testing.T) { + t.Parallel() + + const ( + validKey1 = "oMNSf/zJ0pt1ciy+qIRk8Rlyfs9accwuRLnKd85Yl1Q=" + validKey2 = "aPjc9US5ICB30D1P4glR9tO7bkB2Ga+KZiFqnoypBHk=" + ) + + testCases := map[string]struct { + settings Settings + err error + }{ + "empty settings": { + err: errors.New("invalid interface name: "), + }, + "bad interface name": { + settings: Settings{ + InterfaceName: "$H1T", + }, + err: errors.New("invalid interface name: $H1T"), + }, + "empty private key": { + settings: Settings{ + InterfaceName: "wg0", + }, + err: ErrPrivateKeyMissing, + }, + "bad private key": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: "bad key", + }, + err: ErrPrivateKeyInvalid, + }, + "empty public key": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + }, + err: ErrPublicKeyMissing, + }, + "bad public key": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + PublicKey: "bad key", + }, + err: errors.New("cannot parse public key: bad key"), + }, + "bad preshared key": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + PublicKey: validKey2, + PreSharedKey: "bad key", + }, + err: errors.New("cannot parse pre-shared key"), + }, + "empty endpoint": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + PublicKey: validKey2, + }, + err: ErrEndpointMissing, + }, + "nil endpoint IP": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + PublicKey: validKey2, + Endpoint: &net.UDPAddr{}, + }, + err: ErrEndpointIPMissing, + }, + "nil endpoint port": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + PublicKey: validKey2, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + }, + }, + err: ErrEndpointPortMissing, + }, + "no address": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + PublicKey: validKey2, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + Port: 51820, + }, + }, + err: ErrAddressMissing, + }, + "nil address": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + PublicKey: validKey2, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + Port: 51820, + }, + Addresses: []*net.IPNet{nil}, + }, + err: errors.New("interface address is nil: for address 1 of 1"), + }, + "nil address IP": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + PublicKey: validKey2, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + Port: 51820, + }, + Addresses: []*net.IPNet{{}}, + }, + err: errors.New("interface address IP is missing: for address 1 of 1"), + }, + "nil address mask": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + PublicKey: validKey2, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + Port: 51820, + }, + Addresses: []*net.IPNet{{IP: net.IPv4(1, 2, 3, 4)}}, + }, + err: errors.New("interface address mask is missing: for address 1 of 1"), + }, + "zero firewall mark": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + PublicKey: validKey2, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + Port: 51820, + }, + Addresses: []*net.IPNet{{IP: net.IPv4(1, 2, 3, 4), Mask: net.CIDRMask(24, 32)}}, + }, + err: ErrFirewallMarkMissing, + }, + "all valid": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: validKey1, + PublicKey: validKey2, + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + Port: 51820, + }, + Addresses: []*net.IPNet{{IP: net.IPv4(1, 2, 3, 4), Mask: net.CIDRMask(24, 32)}}, + FirewallMark: 999, + }, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + err := testCase.settings.Check() + + if testCase.err != nil { + require.Error(t, err) + assert.Equal(t, testCase.err.Error(), err.Error()) + } else { + assert.NoError(t, err) + } + }) + } +} + +func toStringPtr(s string) *string { return &s } + +func Test_ToLinesSettings_setDefaults(t *testing.T) { + t.Parallel() + + settings := ToLinesSettings{ + Indent: toStringPtr("indent"), + } + + someFunc := func(settings ToLinesSettings) { + settings.setDefaults() + expectedSettings := ToLinesSettings{ + Indent: toStringPtr("indent"), + FieldPrefix: toStringPtr("├── "), + LastFieldPrefix: toStringPtr("└── "), + } + assert.Equal(t, expectedSettings, settings) + } + someFunc(settings) + + untouchedSettings := ToLinesSettings{ + Indent: toStringPtr("indent"), + } + assert.Equal(t, untouchedSettings, settings) +} + +func Test_Settings_String(t *testing.T) { + t.Parallel() + + settings := Settings{ + InterfaceName: "wg0", + } + const expected = `├── Interface name: wg0 +├── Private key: not set +├── Pre shared key: not set +├── Endpoint: not set +└── Addresses: not set` + s := settings.String() + assert.Equal(t, expected, s) +} + +func Test_Settings_Lines(t *testing.T) { + t.Parallel() + + testCases := map[string]struct { + settings Settings + lineSettings ToLinesSettings + lines []string + }{ + "empty settings": { + lines: []string{ + "├── Interface name: ", + "├── Private key: not set", + "├── Pre shared key: not set", + "├── Endpoint: not set", + "└── Addresses: not set", + }, + }, + "settings all set": { + settings: Settings{ + InterfaceName: "wg0", + PrivateKey: "private key", + PublicKey: "public key", + PreSharedKey: "pre-shared key", + Endpoint: &net.UDPAddr{ + IP: net.IPv4(1, 2, 3, 4), + Port: 51820, + }, + FirewallMark: 999, + RulePriority: 888, + Addresses: []*net.IPNet{ + {IP: net.IPv4(1, 1, 1, 1), Mask: net.CIDRMask(24, 32)}, + {IP: net.IPv4(2, 2, 2, 2), Mask: net.CIDRMask(32, 32)}, + }, + }, + lines: []string{ + "├── Interface name: wg0", + "├── Private key: set", + "├── PublicKey: public key", + "├── Pre shared key: set", + "├── Endpoint: 1.2.3.4:51820", + "├── Firewall mark: 999", + "├── Rule priority: 888", + "└── Addresses:", + " ├── 1.1.1.1/24", + " └── 2.2.2.2/32", + }, + }, + "custom line settings": { + lineSettings: ToLinesSettings{ + Indent: toStringPtr(" "), + FieldPrefix: toStringPtr("- "), + LastFieldPrefix: toStringPtr("* "), + }, + settings: Settings{ + InterfaceName: "wg0", + Addresses: []*net.IPNet{ + {IP: net.IPv4(1, 1, 1, 1), Mask: net.CIDRMask(24, 32)}, + {IP: net.IPv4(2, 2, 2, 2), Mask: net.CIDRMask(32, 32)}, + }, + }, + lines: []string{ + "- Interface name: wg0", + "- Private key: not set", + "- Pre shared key: not set", + "- Endpoint: not set", + "* Addresses:", + " - 1.1.1.1/24", + " * 2.2.2.2/32", + }, + }, + } + + for name, testCase := range testCases { + testCase := testCase + t.Run(name, func(t *testing.T) { + t.Parallel() + + lines := testCase.settings.ToLines(testCase.lineSettings) + + assert.Equal(t, testCase.lines, lines) + }) + } +} diff --git a/maintenance.md b/maintenance.md index 10da816b..04ce307a 100644 --- a/maintenance.md +++ b/maintenance.md @@ -11,6 +11,7 @@ - Filter servers by protocol for all - Multiple IPs addresses support for all proviedrs +- Use `internal/netlink` in firewall and routing packages ## Code