|
|
@@ -60,6 +60,12 @@ type Server struct {
|
|
|
pubKey key.MachinePublic
|
|
|
privKey key.ControlPrivate // not strictly needed vs. MachinePrivate, but handy to test type interactions.
|
|
|
|
|
|
+ // masquerades is the set of masquerades that should be applied to
|
|
|
+ // MapResponses sent to clients. It is keyed by the requesting nodes
|
|
|
+ // public key, and then the peer node's public key. The value is the
|
|
|
+ // masquerade address to use for that peer.
|
|
|
+ masquerades map[key.NodePublic]map[key.NodePublic]netip.Addr // node => peer => SelfNodeV4MasqAddrForThisPeer IP
|
|
|
+
|
|
|
noisePubKey key.MachinePublic
|
|
|
noisePrivKey key.ControlPrivate // not strictly needed vs. MachinePrivate, but handy to test type interactions.
|
|
|
|
|
|
@@ -288,6 +294,48 @@ func (s *Server) serveMachine(w http.ResponseWriter, r *http.Request) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// MasqueradePair is a pair of nodes and the IP address that the
|
|
|
+// Node masquerades as for the Peer.
|
|
|
+//
|
|
|
+// Setting this will have future MapResponses for Node to have
|
|
|
+// Peer.SelfNodeV4MasqAddrForThisPeer set to NodeMasqueradesAs.
|
|
|
+// MapResponses for the Peer will now see Node.Addresses as
|
|
|
+// NodeMasqueradesAs.
|
|
|
+type MasqueradePair struct {
|
|
|
+ Node key.NodePublic
|
|
|
+ Peer key.NodePublic
|
|
|
+ NodeMasqueradesAs netip.Addr
|
|
|
+}
|
|
|
+
|
|
|
+// SetMasqueradeAddresses sets the masquerade addresses for the server.
|
|
|
+// See MasqueradePair for more details.
|
|
|
+func (s *Server) SetMasqueradeAddresses(pairs []MasqueradePair) {
|
|
|
+ m := make(map[key.NodePublic]map[key.NodePublic]netip.Addr)
|
|
|
+ for _, p := range pairs {
|
|
|
+ if m[p.Node] == nil {
|
|
|
+ m[p.Node] = make(map[key.NodePublic]netip.Addr)
|
|
|
+ }
|
|
|
+ m[p.Node][p.Peer] = p.NodeMasqueradesAs
|
|
|
+ }
|
|
|
+ s.mu.Lock()
|
|
|
+ defer s.mu.Unlock()
|
|
|
+ s.masquerades = m
|
|
|
+ s.updateLocked("SetMasqueradeAddresses", s.nodeIDsLocked(0))
|
|
|
+}
|
|
|
+
|
|
|
+// nodeIDsLocked returns the node IDs of all nodes in the server, except
|
|
|
+// for the node with the given ID.
|
|
|
+func (s *Server) nodeIDsLocked(except tailcfg.NodeID) []tailcfg.NodeID {
|
|
|
+ var ids []tailcfg.NodeID
|
|
|
+ for _, n := range s.nodes {
|
|
|
+ if n.ID == except {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ ids = append(ids, n.ID)
|
|
|
+ }
|
|
|
+ return ids
|
|
|
+}
|
|
|
+
|
|
|
// Node returns the node for nodeKey. It's always nil or cloned memory.
|
|
|
func (s *Server) Node(nodeKey key.NodePublic) *tailcfg.Node {
|
|
|
s.mu.Lock()
|
|
|
@@ -588,12 +636,7 @@ func (s *Server) UpdateNode(n *tailcfg.Node) (peersToUpdate []tailcfg.NodeID) {
|
|
|
panic("zero nodekey")
|
|
|
}
|
|
|
s.nodes[n.Key] = n.Clone()
|
|
|
- for _, n2 := range s.nodes {
|
|
|
- if n.ID != n2.ID {
|
|
|
- peersToUpdate = append(peersToUpdate, n2.ID)
|
|
|
- }
|
|
|
- }
|
|
|
- return peersToUpdate
|
|
|
+ return s.nodeIDsLocked(n.ID)
|
|
|
}
|
|
|
|
|
|
func (s *Server) incrInServeMap(delta int) {
|
|
|
@@ -791,11 +834,28 @@ func (s *Server) MapResponse(req *tailcfg.MapRequest) (res *tailcfg.MapResponse,
|
|
|
DNSConfig: dns,
|
|
|
ControlTime: &t,
|
|
|
}
|
|
|
+
|
|
|
+ s.mu.Lock()
|
|
|
+ nodeMasqs := s.masquerades[node.Key]
|
|
|
+ s.mu.Unlock()
|
|
|
for _, p := range s.AllNodes() {
|
|
|
- if p.StableID != node.StableID {
|
|
|
- res.Peers = append(res.Peers, p)
|
|
|
+ if p.StableID == node.StableID {
|
|
|
+ continue
|
|
|
}
|
|
|
+ if masqIP := nodeMasqs[p.Key]; masqIP.IsValid() {
|
|
|
+ p.SelfNodeV4MasqAddrForThisPeer = masqIP
|
|
|
+ }
|
|
|
+
|
|
|
+ s.mu.Lock()
|
|
|
+ peerAddress := s.masquerades[p.Key][node.Key]
|
|
|
+ s.mu.Unlock()
|
|
|
+ if peerAddress.IsValid() {
|
|
|
+ p.Addresses[0] = netip.PrefixFrom(peerAddress, peerAddress.BitLen())
|
|
|
+ p.AllowedIPs[0] = netip.PrefixFrom(peerAddress, peerAddress.BitLen())
|
|
|
+ }
|
|
|
+ res.Peers = append(res.Peers, p)
|
|
|
}
|
|
|
+
|
|
|
sort.Slice(res.Peers, func(i, j int) bool {
|
|
|
return res.Peers[i].ID < res.Peers[j].ID
|
|
|
})
|