mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-06 01:07:41 +08:00
146 lines
4.2 KiB
Go
146 lines
4.2 KiB
Go
package models
|
|
|
|
import (
|
|
"context"
|
|
"crypto/md5"
|
|
"fmt"
|
|
"net"
|
|
"sync"
|
|
"time"
|
|
|
|
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
|
)
|
|
|
|
// ProxyAction - type for proxy action
|
|
type ProxyAction string
|
|
|
|
const (
|
|
// default proxy port
|
|
NmProxyPort = 51722
|
|
// default CIDR for proxy peers
|
|
DefaultCIDR = "127.0.0.1/8"
|
|
// PersistentKeepaliveInterval - default keepalive for wg peer
|
|
DefaultPersistentKeepaliveInterval = time.Duration(time.Second * 20)
|
|
|
|
// ProxyUpdate - constant for proxy update action
|
|
ProxyUpdate ProxyAction = "PROXY_UPDATE"
|
|
// ProxyDeletePeers - constant for proxy delete peers action
|
|
ProxyDeletePeers ProxyAction = "PROXY_DELETE"
|
|
// ProxyDeleteAllPeers - constant for proxy delete all peers action
|
|
ProxyDeleteAllPeers ProxyAction = "PROXY_DELETE_ALL"
|
|
// NoProxy - constant for no ProxyAction
|
|
NoProxy ProxyAction = "NO_PROXY"
|
|
)
|
|
|
|
// PeerConnMap - type for peer conn config map
|
|
type PeerConnMap map[string]*Conn
|
|
|
|
// Proxy - struct for proxy config
|
|
type Proxy struct {
|
|
PeerPublicKey wgtypes.Key
|
|
IsExtClient bool
|
|
PeerConf wgtypes.PeerConfig
|
|
PeerEndpoint *net.UDPAddr
|
|
RemoteConnAddr *net.UDPAddr
|
|
LocalConnAddr *net.UDPAddr
|
|
ListenPort int
|
|
ProxyStatus bool
|
|
}
|
|
|
|
// Conn is a peer Connection configuration
|
|
type Conn struct {
|
|
// Key is a public key of a remote peer
|
|
Key wgtypes.Key
|
|
IsExtClient bool
|
|
IsRelayed bool
|
|
RelayedEndpoint *net.UDPAddr
|
|
Config Proxy
|
|
StopConn func()
|
|
ResetConn func()
|
|
LocalConn net.Conn
|
|
Mutex *sync.RWMutex
|
|
NetworkSettings map[string]Settings
|
|
ServerMap map[string]struct{}
|
|
}
|
|
|
|
// RemotePeer - struct remote peer data
|
|
type RemotePeer struct {
|
|
PeerKey string
|
|
Endpoint *net.UDPAddr
|
|
IsExtClient bool
|
|
LocalConn net.Conn
|
|
CancelFunc context.CancelFunc
|
|
CommChan chan *net.UDPAddr
|
|
}
|
|
|
|
// HostInfo - struct for host information
|
|
type HostInfo struct {
|
|
PublicIp net.IP
|
|
PrivIp net.IP
|
|
PubPort int
|
|
PrivPort int
|
|
ProxyEnabled bool
|
|
}
|
|
|
|
// RelayedConf - struct relayed peers config
|
|
type RelayedConf struct {
|
|
RelayedPeerEndpoint *net.UDPAddr `json:"relayed_peer_endpoint"`
|
|
RelayedPeerPubKey string `json:"relayed_peer_pub_key"`
|
|
Peers []wgtypes.PeerConfig `json:"relayed_peers"`
|
|
}
|
|
|
|
// PeerConf - struct for peer config in the network
|
|
type PeerConf struct {
|
|
Proxy bool `json:"proxy"`
|
|
PublicListenPort int32 `json:"public_listen_port"`
|
|
IsExtClient bool `json:"is_ext_client"`
|
|
Address net.IP `json:"address"`
|
|
ExtInternalIp net.IP `json:"ext_internal_ip"`
|
|
IsRelayed bool `json:"is_relayed"`
|
|
RelayedTo *net.UDPAddr `json:"relayed_to"`
|
|
}
|
|
|
|
// ConvPeerKeyToHash - converts peer key to a md5 hash
|
|
func ConvPeerKeyToHash(peerKey string) string {
|
|
return fmt.Sprintf("%x", md5.Sum([]byte(peerKey)))
|
|
}
|
|
|
|
// IsPublicIP indicates whether IP is public or not.
|
|
func IsPublicIP(ip net.IP) bool {
|
|
if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() || ip.IsPrivate() {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// ProxyManagerPayload - struct for proxy manager payload
|
|
type ProxyManagerPayload struct {
|
|
Action ProxyAction `json:"action"`
|
|
InterfaceName string `json:"interface_name"`
|
|
Server string `json:"server"`
|
|
//WgAddr string `json:"wg_addr"`
|
|
Peers []wgtypes.PeerConfig `json:"peers"`
|
|
PeerMap map[string]PeerConf `json:"peer_map"`
|
|
IsIngress bool `json:"is_ingress"`
|
|
IsRelayed bool `json:"is_relayed"`
|
|
RelayedTo *net.UDPAddr `json:"relayed_to"`
|
|
IsRelay bool `json:"is_relay"`
|
|
RelayedPeerConf map[string]RelayedConf `json:"relayed_conf"`
|
|
}
|
|
|
|
// Metric - struct for metric data
|
|
type ProxyMetric struct {
|
|
NodeConnectionStatus map[string]bool `json:"node_connection_status"`
|
|
LastRecordedLatency uint64 `json:"last_recorded_latency"`
|
|
TrafficSent int64 `json:"traffic_sent"` // stored in MB
|
|
TrafficRecieved int64 `json:"traffic_recieved"` // stored in MB
|
|
}
|
|
|
|
// Settings - struct for host settings
|
|
type Settings struct {
|
|
IsRelay bool
|
|
IsIngressGateway bool
|
|
IsRelayed bool
|
|
RelayedTo *net.UDPAddr
|
|
}
|