Implement NAT discover for go standalone proxies

This commit is contained in:
Cecylia Bocovich 2020-06-16 17:10:56 -04:00
parent bf924445e3
commit f6cf9a453b
4 changed files with 77 additions and 17 deletions

View file

@ -19,6 +19,7 @@ import (
"time"
"git.torproject.org/pluggable-transports/snowflake.git/common/messages"
"git.torproject.org/pluggable-transports/snowflake.git/common/nat"
"git.torproject.org/pluggable-transports/snowflake.git/common/safelog"
"git.torproject.org/pluggable-transports/snowflake.git/common/util"
"git.torproject.org/pluggable-transports/snowflake.git/common/websocketconn"
@ -30,6 +31,11 @@ const defaultBrokerURL = "https://snowflake-broker.bamsoftware.com/"
const defaultRelayURL = "wss://snowflake.bamsoftware.com/"
const defaultSTUNURL = "stun:stun.l.google.com:19302"
const pollInterval = 5 * time.Second
const (
NATUnknown = "unknown"
NATRestricted = "restricted"
NATUnrestricted = "unrestricted"
)
//amount of time after sending an SDP answer before the proxy assumes the
//client is not going to connect
@ -40,6 +46,8 @@ const readLimit = 100000 //Maximum number of bytes to be read from an HTTP reque
var broker *Broker
var relayURL string
var currentNATType = NATUnknown
const (
sessionIDLength = 16
)
@ -174,7 +182,7 @@ func (b *Broker) pollOffer(sid string) *webrtc.SessionDescription {
timeOfNextPoll = now
}
body, err := messages.EncodePollRequest(sid, "standalone")
body, err := messages.EncodePollRequest(sid, "standalone", currentNATType)
if err != nil {
log.Printf("Error encoding poll message: %s", err.Error())
return nil
@ -485,9 +493,35 @@ func main() {
tokens <- true
}
// determine NAT type before polling
updateNATType(config.ICEServers)
log.Printf("NAT type: %s", currentNATType)
for {
getToken()
sessionID := genSessionID()
runSession(sessionID)
}
}
// use provided STUN server(s) to determine NAT type
func updateNATType(servers []webrtc.ICEServer) {
var restrictedNAT bool
var err error
for _, server := range servers {
addr := strings.TrimPrefix(server.URLs[0], "stun:")
restrictedNAT, err = nat.CheckIfRestrictedNAT(addr)
if err == nil {
if restrictedNAT {
currentNATType = NATRestricted
} else {
currentNATType = NATUnrestricted
}
break
}
}
if err != nil {
currentNATType = NATUnknown
}
}