dsnet/init.go

82 lines
1.7 KiB
Go
Raw Normal View History

2020-02-28 00:22:32 +01:00
package dsnet
import (
2020-03-01 22:39:05 +01:00
"fmt"
"io/ioutil"
2020-03-02 00:08:10 +01:00
"math/rand"
"net"
"net/http"
2020-03-02 22:11:45 +01:00
"strings"
2020-03-01 22:39:05 +01:00
"time"
2020-02-28 00:22:32 +01:00
)
func Init() {
2020-03-01 23:58:21 +01:00
privateKey := GenerateJSONPrivateKey()
presharedKey := GenerateJSONKey()
2020-03-01 22:39:05 +01:00
conf := DsnetConfig{
2020-03-02 00:08:10 +01:00
PrivateKey: privateKey,
2020-03-01 22:39:05 +01:00
PresharedKey: presharedKey,
2020-03-02 22:11:45 +01:00
ListenPort: DEFAULT_LISTEN_PORT,
2020-03-02 00:08:10 +01:00
Network: getRandomNetwork(),
Peers: make([]PeerConfig, 0),
Domain: "dsnet",
2020-03-02 00:17:01 +01:00
ReportFile: DEFAULT_REPORT_FILE,
2020-03-02 22:11:45 +01:00
ExternalIP: getExternalIP(),
2020-03-01 21:54:33 +01:00
}
2020-03-01 22:39:05 +01:00
2020-03-02 21:11:33 +01:00
IP := conf.MustAllocateIP()
2020-03-02 22:02:21 +01:00
conf.InternalIP = IP
conf.InternalDNS = IP
2020-03-02 21:10:48 +01:00
2020-03-02 03:54:43 +01:00
conf.MustSave()
2020-03-01 22:48:24 +01:00
2020-03-02 22:11:45 +01:00
fmt.Printf("Config written to %s. Please check/edit.", CONFIG_FILE)
2020-03-01 21:54:33 +01:00
}
2020-03-01 22:39:05 +01:00
// get a random /22 subnet on 10.0.0.0 (1023 hosts) (or /24?)
2020-03-01 23:29:11 +01:00
func getRandomNetwork() JSONIPNet {
2020-03-01 22:39:05 +01:00
rbs := make([]byte, 2)
rand.Seed(time.Now().UTC().UnixNano())
rand.Read(rbs)
2020-03-01 23:29:11 +01:00
return JSONIPNet{
2020-03-02 00:17:01 +01:00
IPNet: net.IPNet{
2020-03-02 00:08:10 +01:00
net.IP{10, rbs[0], rbs[1] << 2, 0},
net.IPMask{255, 255, 252, 0},
2020-03-01 23:03:31 +01:00
},
2020-03-01 21:54:33 +01:00
}
2020-02-28 00:22:32 +01:00
}
2020-03-02 22:11:45 +01:00
2020-03-02 22:36:41 +01:00
// TODO support IPv6
2020-03-02 22:11:45 +01:00
func getExternalIP() net.IP {
conn, _ := net.Dial("udp", "8.8.8.8:80")
defer conn.Close()
localAddr := conn.LocalAddr().String()
IP := net.ParseIP(strings.Split(localAddr, ":")[0])
IP = IP.To4()
2020-03-02 22:11:45 +01:00
2020-03-02 22:36:41 +01:00
if !(IP[0] == 10 || (IP[0] == 172 && IP[1] >= 16 && IP[1] <= 31) || (IP[0] == 192 && IP[1] == 168)) {
// not private, so public
return IP
}
// detect private IP and use icanhazip.com instead
client := http.Client{
Timeout: 5 * time.Second,
}
resp, err := client.Get("https://ipv4.icanhazip.com/")
check(err)
defer resp.Body.Close()
if resp.StatusCode == http.StatusOK {
body, err := ioutil.ReadAll(resp.Body)
check(err)
IP = net.ParseIP(strings.TrimSpace(string(body)))
return IP.To4()
}
2020-03-02 22:36:41 +01:00
return net.IP{}
2020-03-02 22:11:45 +01:00
}