├── README.md ├── main.go └── servers └── servers.go /README.md: -------------------------------------------------------------------------------- 1 | ## mullvad-find-fastest-server 2 | > Find the fastest Wireguard server for Mullvad 3 | 4 | ## Usage: 5 | 6 | ``` 7 | go run main.go 8 | ``` 9 | 10 | ## License 11 | 12 | MIT 2018 - Victor Bjelkholm 13 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "sort" 6 | "time" 7 | 8 | ping "github.com/sparrc/go-ping" 9 | servers "github.com/victorb/mullvad-find-fastest-server/servers" 10 | ) 11 | 12 | var pingCount = 3 13 | 14 | var mullvadAddr = ".mullvad.net" 15 | 16 | var results = map[string]int64{} 17 | 18 | func main() { 19 | for _, server := range servers.GetServers() { 20 | pinger, err := ping.NewPinger(server) 21 | if err != nil { 22 | panic(err) 23 | } 24 | pinger.Count = pingCount 25 | pinger.OnRecv = func(pkt *ping.Packet) { 26 | fmt.Printf("%d bytes from %s: icmp_seq=%d time=%v\n", 27 | pkt.Nbytes, pkt.IPAddr, pkt.Seq, pkt.Rtt) 28 | } 29 | pinger.Run() // blocks until finished 30 | stats := pinger.Statistics() // get send/receive/rtt stats 31 | fmt.Printf("%s = %s\n", server, stats.AvgRtt.String()) 32 | results[server] = stats.AvgRtt.Nanoseconds() 33 | } 34 | type kv struct { 35 | Key string 36 | Value int64 37 | } 38 | 39 | var ss []kv 40 | for k, v := range results { 41 | ss = append(ss, kv{k, v}) 42 | } 43 | 44 | sort.Slice(ss, func(i, j int) bool { 45 | return ss[i].Value < ss[j].Value 46 | }) 47 | 48 | fmt.Println("## Final Results (least latency first):") 49 | for _, kv := range ss { 50 | durr, _ := time.ParseDuration(fmt.Sprintf("%dns", kv.Value)) 51 | fmt.Printf("%s = %s\n", kv.Key, durr.String()) 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /servers/servers.go: -------------------------------------------------------------------------------- 1 | package servers 2 | 3 | // Get the list by going to https://mullvad.net/en/servers/ 4 | // and run the following snippet in the JS console: 5 | // `var arr = []; document.querySelectorAll('body > section:nth-child(7) > div.container.extra-wide > div > table > tbody > tr > td:nth-child(1)').forEach(a => arr.push(a.innerText)); copy(arr)` 6 | // You will now have a JS array in the clipboard that you can paste below and 7 | // reformat to Go format 8 | 9 | var servers = []string{ 10 | "au3-wireguard.mullvad.net", 11 | "au4-wireguard.mullvad.net", 12 | "au1-wireguard.mullvad.net", 13 | "au2-wireguard.mullvad.net", 14 | "au5-wireguard.mullvad.net", 15 | "au6-wireguard.mullvad.net", 16 | "au7-wireguard.mullvad.net", 17 | "at1-wireguard.mullvad.net", 18 | "at2-wireguard.mullvad.net", 19 | "be1-wireguard.mullvad.net", 20 | "be2-wireguard.mullvad.net", 21 | "be3-wireguard.mullvad.net", 22 | "be4-wireguard.mullvad.net", 23 | "br1-wireguard.mullvad.net", 24 | "bg1-wireguard.mullvad.net", 25 | "bg2-wireguard.mullvad.net", 26 | "bg3-wireguard.mullvad.net", 27 | "ca1-wireguard.mullvad.net", 28 | "ca3-wireguard.mullvad.net", 29 | "ca4-wireguard.mullvad.net", 30 | "ca5-wireguard.mullvad.net", 31 | "ca6-wireguard.mullvad.net", 32 | "ca8-wireguard.mullvad.net", 33 | "ca9-wireguard.mullvad.net", 34 | "ca2-wireguard.mullvad.net", 35 | "ca7-wireguard.mullvad.net", 36 | "cz1-wireguard.mullvad.net", 37 | "cz2-wireguard.mullvad.net", 38 | "cz3-wireguard.mullvad.net", 39 | "cz4-wireguard.mullvad.net", 40 | "cz5-wireguard.mullvad.net", 41 | "dk1-wireguard.mullvad.net", 42 | "dk2-wireguard.mullvad.net", 43 | "fi1-wireguard.mullvad.net", 44 | "fi2-wireguard.mullvad.net", 45 | "fi3-wireguard.mullvad.net", 46 | "fr1-wireguard.mullvad.net", 47 | "fr2-wireguard.mullvad.net", 48 | "fr3-wireguard.mullvad.net", 49 | "fr4-wireguard.mullvad.net", 50 | "fr5-wireguard.mullvad.net", 51 | "fr6-wireguard.mullvad.net", 52 | "fr7-wireguard.mullvad.net", 53 | "fr8-wireguard.mullvad.net", 54 | "de1-wireguard.mullvad.net", 55 | "de2-wireguard.mullvad.net", 56 | "de4-wireguard.mullvad.net", 57 | "de5-wireguard.mullvad.net", 58 | "de6-wireguard.mullvad.net", 59 | "hk1-wireguard.mullvad.net", 60 | "hu1-wireguard.mullvad.net", 61 | "hu2-wireguard.mullvad.net", 62 | "it1-wireguard.mullvad.net", 63 | "it2-wireguard.mullvad.net", 64 | "it3-wireguard.mullvad.net", 65 | "jp1-wireguard.mullvad.net", 66 | "jp2-wireguard.mullvad.net", 67 | "jp3-wireguard.mullvad.net", 68 | "jp4-wireguard.mullvad.net", 69 | "jp5-wireguard.mullvad.net", 70 | "lv1-wireguard.mullvad.net", 71 | "lu1-wireguard.mullvad.net", 72 | "lu2-wireguard.mullvad.net", 73 | "md1-wireguard.mullvad.net", 74 | "nl1-wireguard.mullvad.net", 75 | "nl2-wireguard.mullvad.net", 76 | "nl3-wireguard.mullvad.net", 77 | "nl4-wireguard.mullvad.net", 78 | "nl5-wireguard.mullvad.net", 79 | "nz2-wireguard.mullvad.net", 80 | "no1-wireguard.mullvad.net", 81 | "no2-wireguard.mullvad.net", 82 | "no3-wireguard.mullvad.net", 83 | "no4-wireguard.mullvad.net", 84 | "pl1-wireguard.mullvad.net", 85 | "pl2-wireguard.mullvad.net", 86 | "pl3-wireguard.mullvad.net", 87 | "pl4-wireguard.mullvad.net", 88 | "ro1-wireguard.mullvad.net", 89 | "ro2-wireguard.mullvad.net", 90 | "ro3-wireguard.mullvad.net", 91 | "rs1-wireguard.mullvad.net", 92 | "rs2-wireguard.mullvad.net", 93 | "sg1-wireguard.mullvad.net", 94 | "sg2-wireguard.mullvad.net", 95 | "sg3-wireguard.mullvad.net", 96 | "es1-wireguard.mullvad.net", 97 | "es2-wireguard.mullvad.net", 98 | "es3-wireguard.mullvad.net", 99 | "es4-wireguard.mullvad.net", 100 | "es5-wireguard.mullvad.net", 101 | "se10-wireguard.mullvad.net", 102 | "se3-wireguard.mullvad.net", 103 | "se5-wireguard.mullvad.net", 104 | "se9-wireguard.mullvad.net", 105 | "se1-wireguard.mullvad.net", 106 | "se4-wireguard.mullvad.net", 107 | "se2-wireguard.mullvad.net", 108 | "se6-wireguard.mullvad.net", 109 | "se7-wireguard.mullvad.net", 110 | "se8-wireguard.mullvad.net", 111 | "ch1-wireguard.mullvad.net", 112 | "ch2-wireguard.mullvad.net", 113 | "ch3-wireguard.mullvad.net", 114 | "ch4-wireguard.mullvad.net", 115 | "ch5-wireguard.mullvad.net", 116 | "ch6-wireguard.mullvad.net", 117 | "ch7-wireguard.mullvad.net", 118 | "ch8-wireguard.mullvad.net", 119 | "ch9-wireguard.mullvad.net", 120 | "gb1-wireguard.mullvad.net", 121 | "gb2-wireguard.mullvad.net", 122 | "gb4-wireguard.mullvad.net", 123 | "gb5-wireguard.mullvad.net", 124 | "gb6-wireguard.mullvad.net", 125 | "gb10-wireguard.mullvad.net", 126 | "gb3-wireguard.mullvad.net", 127 | "gb7-wireguard.mullvad.net", 128 | "gb8-wireguard.mullvad.net", 129 | "gb9-wireguard.mullvad.net", 130 | "us21-wireguard.mullvad.net", 131 | "us38-wireguard.mullvad.net", 132 | "us39-wireguard.mullvad.net", 133 | "us6-wireguard.mullvad.net", 134 | "us18-wireguard.mullvad.net", 135 | "us22-wireguard.mullvad.net", 136 | "us23-wireguard.mullvad.net", 137 | "us4-wireguard.mullvad.net", 138 | "us17-wireguard.mullvad.net", 139 | "us7-wireguard.mullvad.net", 140 | "us10-wireguard.mullvad.net", 141 | "us11-wireguard.mullvad.net", 142 | "us2-wireguard.mullvad.net", 143 | "us35-wireguard.mullvad.net", 144 | "us36-wireguard.mullvad.net", 145 | "us37-wireguard.mullvad.net", 146 | "us8-wireguard.mullvad.net", 147 | "us19-wireguard.mullvad.net", 148 | "us20-wireguard.mullvad.net", 149 | "us27-wireguard.mullvad.net", 150 | "us3-wireguard.mullvad.net", 151 | "us40-wireguard.mullvad.net", 152 | "us41-wireguard.mullvad.net", 153 | "us42-wireguard.mullvad.net", 154 | "us43-wireguard.mullvad.net", 155 | "us1-wireguard.mullvad.net", 156 | "us13-wireguard.mullvad.net", 157 | "us16-wireguard.mullvad.net", 158 | "us29-wireguard.mullvad.net", 159 | "us30-wireguard.mullvad.net", 160 | "us31-wireguard.mullvad.net", 161 | "us32-wireguard.mullvad.net", 162 | "us33-wireguard.mullvad.net", 163 | "us34-wireguard.mullvad.net", 164 | "us15-wireguard.mullvad.net", 165 | "us14-wireguard.mullvad.net", 166 | "us24-wireguard.mullvad.net", 167 | "us25-wireguard.mullvad.net", 168 | "us26-wireguard.mullvad.net", 169 | "us9-wireguard.mullvad.net", 170 | "us5-wireguard.mullvad.net", 171 | } 172 | 173 | func GetServers() []string { 174 | return servers 175 | } 176 | --------------------------------------------------------------------------------