croc/src/models/constants.go

150 lines
3.4 KiB
Go
Raw Normal View History

2018-09-23 15:28:34 +02:00
package models
2020-11-17 19:29:52 +01:00
import (
"context"
"fmt"
2020-11-17 19:29:52 +01:00
"net"
2021-08-16 19:25:34 +02:00
"os"
2022-02-03 17:34:03 +01:00
"path"
"github.com/schollz/croc/v9/src/utils"
2020-11-17 19:29:52 +01:00
)
2020-10-13 21:26:11 +02:00
2019-09-07 18:46:04 +02:00
// TCP_BUFFER_SIZE is the maximum packet size
2019-04-30 15:58:57 +02:00
const TCP_BUFFER_SIZE = 1024 * 64
2019-09-07 18:46:04 +02:00
// DEFAULT_RELAY is the default relay used (can be set using --relay)
var (
DEFAULT_RELAY = "croc.schollz.com"
DEFAULT_RELAY6 = "croc6.schollz.com"
DEFAULT_PORT = "9009"
DEFAULT_PASSPHRASE = "pass123"
2021-08-16 19:25:34 +02:00
INTERNAL_DNS = false
)
2020-10-13 21:26:11 +02:00
2022-12-05 20:21:04 +01:00
// publicDNS are servers to be queried if a local lookup fails
var publicDNS = []string{
"1.0.0.1", // Cloudflare
"1.1.1.1", // Cloudflare
"[2606:4700:4700::1111]", // Cloudflare
"[2606:4700:4700::1001]", // Cloudflare
"8.8.4.4", // Google
"8.8.8.8", // Google
"[2001:4860:4860::8844]", // Google
"[2001:4860:4860::8888]", // Google
"9.9.9.9", // Quad9
"149.112.112.112", // Quad9
"[2620:fe::fe]", // Quad9
"[2620:fe::fe:9]", // Quad9
"8.26.56.26", // Comodo
"8.20.247.20", // Comodo
"208.67.220.220", // Cisco OpenDNS
"208.67.222.222", // Cisco OpenDNS
"[2620:119:35::35]", // Cisco OpenDNS
"[2620:119:53::53]", // Cisco OpenDNS
}
func getConfigFile(requireValidPath bool) (fname string, err error) {
configFile, err := utils.GetConfigDir(requireValidPath)
2022-02-03 17:34:03 +01:00
if err != nil {
return
}
fname = path.Join(configFile, "internal-dns")
return
}
2020-10-13 21:26:11 +02:00
func init() {
2022-02-03 17:34:03 +01:00
doRemember := false
2021-08-16 19:25:34 +02:00
for _, flag := range os.Args {
if flag == "--internal-dns" {
INTERNAL_DNS = true
break
}
2022-02-03 17:34:03 +01:00
if flag == "--remember" {
doRemember = true
}
}
if doRemember {
// save in config file
fname, err := getConfigFile(true)
2022-02-03 17:34:03 +01:00
if err == nil {
f, _ := os.Create(fname)
f.Close()
}
}
if !INTERNAL_DNS {
fname, err := getConfigFile(false)
2022-02-03 17:34:03 +01:00
if err == nil {
INTERNAL_DNS = utils.Exists(fname)
}
2021-08-16 19:25:34 +02:00
}
2020-11-17 19:46:49 +01:00
var err error
var addr string
addr, err = lookup(DEFAULT_RELAY)
2020-11-17 19:46:49 +01:00
if err == nil {
DEFAULT_RELAY = net.JoinHostPort(addr, DEFAULT_PORT)
2020-11-17 19:46:49 +01:00
} else {
DEFAULT_RELAY = ""
}
addr, err = lookup(DEFAULT_RELAY6)
2020-11-17 19:46:49 +01:00
if err == nil {
DEFAULT_RELAY6 = net.JoinHostPort(addr, DEFAULT_PORT)
2020-11-17 19:46:49 +01:00
} else {
DEFAULT_RELAY6 = ""
}
2020-11-17 19:29:52 +01:00
}
2021-08-16 19:25:34 +02:00
// Resolve a hostname to an IP address using DNS.
func lookup(address string) (ipaddress string, err error) {
2021-08-16 19:25:34 +02:00
if !INTERNAL_DNS {
return localLookupIP(address)
}
2022-04-25 15:25:25 +02:00
type Result struct {
s string
err error
}
2022-12-05 20:21:04 +01:00
result := make(chan Result, len(publicDNS))
for _, dns := range publicDNS {
2021-02-19 19:16:58 +01:00
go func(dns string) {
2022-04-25 15:25:25 +02:00
var r Result
r.s, r.err = remoteLookupIP(address, dns)
result <- r
2021-02-19 19:16:58 +01:00
}(dns)
}
2022-12-05 20:21:04 +01:00
for i := 0; i < len(publicDNS); i++ {
2022-04-25 15:25:25 +02:00
ipaddress = (<-result).s
2021-04-29 18:11:29 +02:00
if ipaddress != "" {
2021-02-19 19:16:58 +01:00
return
}
}
2021-08-16 19:39:42 +02:00
err = fmt.Errorf("failed to resolve %s: all DNS servers exhausted", address)
return
}
// localLookupIP returns a host's IP address based on the local resolver.
func localLookupIP(address string) (ipaddress string, err error) {
2021-08-16 19:32:55 +02:00
ip, err := net.LookupHost(address)
if err != nil {
return
}
ipaddress = ip[0]
2021-02-19 19:16:58 +01:00
return
}
// remoteLookupIP returns a host's IP address based on a remote DNS server.
func remoteLookupIP(address, dns string) (ipaddress string, err error) {
2020-11-17 19:29:52 +01:00
r := &net.Resolver{
PreferGo: true,
2022-12-05 20:21:04 +01:00
Dial: func(ctx context.Context, network, _ string) (net.Conn, error) {
2021-08-16 19:32:55 +02:00
d := new(net.Dialer)
return d.DialContext(ctx, network, dns+":53")
2020-11-17 19:29:52 +01:00
},
2020-10-13 21:26:11 +02:00
}
2020-11-17 19:29:52 +01:00
ip, err := r.LookupHost(context.Background(), address)
if err != nil {
return
2020-10-13 21:26:11 +02:00
}
2020-11-17 19:29:52 +01:00
ipaddress = ip[0]
return
2020-10-13 21:26:11 +02:00
}