handshake_ix.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. package nebula
  2. import (
  3. "time"
  4. "github.com/flynn/noise"
  5. "github.com/slackhq/nebula/header"
  6. "github.com/slackhq/nebula/iputil"
  7. "github.com/slackhq/nebula/udp"
  8. )
  9. // NOISE IX Handshakes
  10. // This function constructs a handshake packet, but does not actually send it
  11. // Sending is done by the handshake manager
  12. func ixHandshakeStage0(f *Interface, vpnIp iputil.VpnIp, hostinfo *HostInfo) {
  13. // This queries the lighthouse if we don't know a remote for the host
  14. // We do it here to provoke the lighthouse to preempt our timer wheel and trigger the stage 1 packet to send
  15. // more quickly, effect is a quicker handshake.
  16. if hostinfo.remote == nil {
  17. f.lightHouse.QueryServer(vpnIp, f)
  18. }
  19. err := f.handshakeManager.AddIndexHostInfo(hostinfo)
  20. if err != nil {
  21. f.l.WithError(err).WithField("vpnIp", vpnIp).
  22. WithField("handshake", m{"stage": 0, "style": "ix_psk0"}).Error("Failed to generate index")
  23. return
  24. }
  25. ci := hostinfo.ConnectionState
  26. hsProto := &NebulaHandshakeDetails{
  27. InitiatorIndex: hostinfo.localIndexId,
  28. Time: uint64(time.Now().UnixNano()),
  29. Cert: ci.certState.rawCertificateNoKey,
  30. }
  31. hsBytes := []byte{}
  32. hs := &NebulaHandshake{
  33. Details: hsProto,
  34. }
  35. hsBytes, err = hs.Marshal()
  36. if err != nil {
  37. f.l.WithError(err).WithField("vpnIp", vpnIp).
  38. WithField("handshake", m{"stage": 0, "style": "ix_psk0"}).Error("Failed to marshal handshake message")
  39. return
  40. }
  41. h := header.Encode(make([]byte, header.Len), header.Version, header.Handshake, header.HandshakeIXPSK0, 0, 1)
  42. ci.messageCounter.Add(1)
  43. msg, _, _, err := ci.H.WriteMessage(h, hsBytes)
  44. if err != nil {
  45. f.l.WithError(err).WithField("vpnIp", vpnIp).
  46. WithField("handshake", m{"stage": 0, "style": "ix_psk0"}).Error("Failed to call noise.WriteMessage")
  47. return
  48. }
  49. // We are sending handshake packet 1, so we don't expect to receive
  50. // handshake packet 1 from the responder
  51. ci.window.Update(f.l, 1)
  52. hostinfo.HandshakePacket[0] = msg
  53. hostinfo.HandshakeReady = true
  54. hostinfo.handshakeStart = time.Now()
  55. }
  56. func ixHandshakeStage1(f *Interface, addr *udp.Addr, via interface{}, packet []byte, h *header.H) {
  57. ci := f.newConnectionState(f.l, false, noise.HandshakeIX, []byte{}, 0)
  58. // Mark packet 1 as seen so it doesn't show up as missed
  59. ci.window.Update(f.l, 1)
  60. msg, _, _, err := ci.H.ReadMessage(nil, packet[header.Len:])
  61. if err != nil {
  62. f.l.WithError(err).WithField("udpAddr", addr).
  63. WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).Error("Failed to call noise.ReadMessage")
  64. return
  65. }
  66. hs := &NebulaHandshake{}
  67. err = hs.Unmarshal(msg)
  68. /*
  69. l.Debugln("GOT INDEX: ", hs.Details.InitiatorIndex)
  70. */
  71. if err != nil || hs.Details == nil {
  72. f.l.WithError(err).WithField("udpAddr", addr).
  73. WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).Error("Failed unmarshal handshake message")
  74. return
  75. }
  76. remoteCert, err := RecombineCertAndValidate(ci.H, hs.Details.Cert, f.caPool)
  77. if err != nil {
  78. f.l.WithError(err).WithField("udpAddr", addr).
  79. WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).WithField("cert", remoteCert).
  80. Info("Invalid certificate from host")
  81. return
  82. }
  83. vpnIp := iputil.Ip2VpnIp(remoteCert.Details.Ips[0].IP)
  84. certName := remoteCert.Details.Name
  85. fingerprint, _ := remoteCert.Sha256Sum()
  86. issuer := remoteCert.Details.Issuer
  87. if vpnIp == f.myVpnIp {
  88. f.l.WithField("vpnIp", vpnIp).WithField("udpAddr", addr).
  89. WithField("certName", certName).
  90. WithField("fingerprint", fingerprint).
  91. WithField("issuer", issuer).
  92. WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).Error("Refusing to handshake with myself")
  93. return
  94. }
  95. if addr != nil {
  96. if !f.lightHouse.GetRemoteAllowList().Allow(vpnIp, addr.IP) {
  97. f.l.WithField("vpnIp", vpnIp).WithField("udpAddr", addr).Debug("lighthouse.remote_allow_list denied incoming handshake")
  98. return
  99. }
  100. }
  101. myIndex, err := generateIndex(f.l)
  102. if err != nil {
  103. f.l.WithError(err).WithField("vpnIp", vpnIp).WithField("udpAddr", addr).
  104. WithField("certName", certName).
  105. WithField("fingerprint", fingerprint).
  106. WithField("issuer", issuer).
  107. WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).Error("Failed to generate index")
  108. return
  109. }
  110. hostinfo := &HostInfo{
  111. ConnectionState: ci,
  112. localIndexId: myIndex,
  113. remoteIndexId: hs.Details.InitiatorIndex,
  114. vpnIp: vpnIp,
  115. HandshakePacket: make(map[uint8][]byte, 0),
  116. lastHandshakeTime: hs.Details.Time,
  117. relayState: RelayState{
  118. relays: map[iputil.VpnIp]struct{}{},
  119. relayForByIp: map[iputil.VpnIp]*Relay{},
  120. relayForByIdx: map[uint32]*Relay{},
  121. },
  122. }
  123. hostinfo.Lock()
  124. defer hostinfo.Unlock()
  125. f.l.WithField("vpnIp", vpnIp).WithField("udpAddr", addr).
  126. WithField("certName", certName).
  127. WithField("fingerprint", fingerprint).
  128. WithField("issuer", issuer).
  129. WithField("initiatorIndex", hs.Details.InitiatorIndex).WithField("responderIndex", hs.Details.ResponderIndex).
  130. WithField("remoteIndex", h.RemoteIndex).WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).
  131. Info("Handshake message received")
  132. hs.Details.ResponderIndex = myIndex
  133. hs.Details.Cert = ci.certState.rawCertificateNoKey
  134. // Update the time in case their clock is way off from ours
  135. hs.Details.Time = uint64(time.Now().UnixNano())
  136. hsBytes, err := hs.Marshal()
  137. if err != nil {
  138. f.l.WithError(err).WithField("vpnIp", hostinfo.vpnIp).WithField("udpAddr", addr).
  139. WithField("certName", certName).
  140. WithField("fingerprint", fingerprint).
  141. WithField("issuer", issuer).
  142. WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).Error("Failed to marshal handshake message")
  143. return
  144. }
  145. nh := header.Encode(make([]byte, header.Len), header.Version, header.Handshake, header.HandshakeIXPSK0, hs.Details.InitiatorIndex, 2)
  146. msg, dKey, eKey, err := ci.H.WriteMessage(nh, hsBytes)
  147. if err != nil {
  148. f.l.WithError(err).WithField("vpnIp", hostinfo.vpnIp).WithField("udpAddr", addr).
  149. WithField("certName", certName).
  150. WithField("fingerprint", fingerprint).
  151. WithField("issuer", issuer).
  152. WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).Error("Failed to call noise.WriteMessage")
  153. return
  154. } else if dKey == nil || eKey == nil {
  155. f.l.WithField("vpnIp", hostinfo.vpnIp).WithField("udpAddr", addr).
  156. WithField("certName", certName).
  157. WithField("fingerprint", fingerprint).
  158. WithField("issuer", issuer).
  159. WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).Error("Noise did not arrive at a key")
  160. return
  161. }
  162. hostinfo.HandshakePacket[0] = make([]byte, len(packet[header.Len:]))
  163. copy(hostinfo.HandshakePacket[0], packet[header.Len:])
  164. // Regardless of whether you are the sender or receiver, you should arrive here
  165. // and complete standing up the connection.
  166. hostinfo.HandshakePacket[2] = make([]byte, len(msg))
  167. copy(hostinfo.HandshakePacket[2], msg)
  168. // We are sending handshake packet 2, so we don't expect to receive
  169. // handshake packet 2 from the initiator.
  170. ci.window.Update(f.l, 2)
  171. ci.peerCert = remoteCert
  172. ci.dKey = NewNebulaCipherState(dKey)
  173. ci.eKey = NewNebulaCipherState(eKey)
  174. hostinfo.remotes = f.lightHouse.QueryCache(vpnIp)
  175. hostinfo.SetRemote(addr)
  176. hostinfo.CreateRemoteCIDR(remoteCert)
  177. existing, err := f.handshakeManager.CheckAndComplete(hostinfo, 0, f)
  178. if err != nil {
  179. switch err {
  180. case ErrAlreadySeen:
  181. // Update remote if preferred (Note we have to switch to locking
  182. // the existing hostinfo, and then switch back so the defer Unlock
  183. // higher in this function still works)
  184. hostinfo.Unlock()
  185. existing.Lock()
  186. // Update remote if preferred
  187. if existing.SetRemoteIfPreferred(f.hostMap, addr) {
  188. // Send a test packet to ensure the other side has also switched to
  189. // the preferred remote
  190. f.SendMessageToVpnIp(header.Test, header.TestRequest, vpnIp, []byte(""), make([]byte, 12, 12), make([]byte, mtu))
  191. }
  192. existing.Unlock()
  193. hostinfo.Lock()
  194. msg = existing.HandshakePacket[2]
  195. f.messageMetrics.Tx(header.Handshake, header.MessageSubType(msg[1]), 1)
  196. if addr != nil {
  197. err := f.outside.WriteTo(msg, addr)
  198. if err != nil {
  199. f.l.WithField("vpnIp", existing.vpnIp).WithField("udpAddr", addr).
  200. WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).WithField("cached", true).
  201. WithError(err).Error("Failed to send handshake message")
  202. } else {
  203. f.l.WithField("vpnIp", existing.vpnIp).WithField("udpAddr", addr).
  204. WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).WithField("cached", true).
  205. Info("Handshake message sent")
  206. }
  207. return
  208. } else {
  209. via2 := via.(*ViaSender)
  210. if via2 == nil {
  211. f.l.Error("Handshake send failed: both addr and via are nil.")
  212. return
  213. }
  214. hostinfo.relayState.InsertRelayTo(via2.relayHI.vpnIp)
  215. f.SendVia(via2.relayHI, via2.relay, msg, make([]byte, 12), make([]byte, mtu), false)
  216. f.l.WithField("vpnIp", existing.vpnIp).WithField("relay", via2.relayHI.vpnIp).
  217. WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).WithField("cached", true).
  218. Info("Handshake message sent")
  219. return
  220. }
  221. case ErrExistingHostInfo:
  222. // This means there was an existing tunnel and this handshake was older than the one we are currently based on
  223. f.l.WithField("vpnIp", vpnIp).WithField("udpAddr", addr).
  224. WithField("certName", certName).
  225. WithField("oldHandshakeTime", existing.lastHandshakeTime).
  226. WithField("newHandshakeTime", hostinfo.lastHandshakeTime).
  227. WithField("fingerprint", fingerprint).
  228. WithField("issuer", issuer).
  229. WithField("initiatorIndex", hs.Details.InitiatorIndex).WithField("responderIndex", hs.Details.ResponderIndex).
  230. WithField("remoteIndex", h.RemoteIndex).WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).
  231. Info("Handshake too old")
  232. // Send a test packet to trigger an authenticated tunnel test, this should suss out any lingering tunnel issues
  233. f.SendMessageToVpnIp(header.Test, header.TestRequest, vpnIp, []byte(""), make([]byte, 12, 12), make([]byte, mtu))
  234. return
  235. case ErrLocalIndexCollision:
  236. // This means we failed to insert because of collision on localIndexId. Just let the next handshake packet retry
  237. f.l.WithField("vpnIp", vpnIp).WithField("udpAddr", addr).
  238. WithField("certName", certName).
  239. WithField("fingerprint", fingerprint).
  240. WithField("issuer", issuer).
  241. WithField("initiatorIndex", hs.Details.InitiatorIndex).WithField("responderIndex", hs.Details.ResponderIndex).
  242. WithField("remoteIndex", h.RemoteIndex).WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).
  243. WithField("localIndex", hostinfo.localIndexId).WithField("collision", existing.vpnIp).
  244. Error("Failed to add HostInfo due to localIndex collision")
  245. return
  246. default:
  247. // Shouldn't happen, but just in case someone adds a new error type to CheckAndComplete
  248. // And we forget to update it here
  249. f.l.WithError(err).WithField("vpnIp", vpnIp).WithField("udpAddr", addr).
  250. WithField("certName", certName).
  251. WithField("fingerprint", fingerprint).
  252. WithField("issuer", issuer).
  253. WithField("initiatorIndex", hs.Details.InitiatorIndex).WithField("responderIndex", hs.Details.ResponderIndex).
  254. WithField("remoteIndex", h.RemoteIndex).WithField("handshake", m{"stage": 1, "style": "ix_psk0"}).
  255. Error("Failed to add HostInfo to HostMap")
  256. return
  257. }
  258. }
  259. // Do the send
  260. f.messageMetrics.Tx(header.Handshake, header.MessageSubType(msg[1]), 1)
  261. if addr != nil {
  262. err = f.outside.WriteTo(msg, addr)
  263. if err != nil {
  264. f.l.WithField("vpnIp", vpnIp).WithField("udpAddr", addr).
  265. WithField("certName", certName).
  266. WithField("fingerprint", fingerprint).
  267. WithField("issuer", issuer).
  268. WithField("initiatorIndex", hs.Details.InitiatorIndex).WithField("responderIndex", hs.Details.ResponderIndex).
  269. WithField("remoteIndex", h.RemoteIndex).WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).
  270. WithError(err).Error("Failed to send handshake")
  271. } else {
  272. f.l.WithField("vpnIp", vpnIp).WithField("udpAddr", addr).
  273. WithField("certName", certName).
  274. WithField("fingerprint", fingerprint).
  275. WithField("issuer", issuer).
  276. WithField("initiatorIndex", hs.Details.InitiatorIndex).WithField("responderIndex", hs.Details.ResponderIndex).
  277. WithField("remoteIndex", h.RemoteIndex).WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).
  278. WithField("sentCachedPackets", len(hostinfo.packetStore)).
  279. Info("Handshake message sent")
  280. }
  281. } else {
  282. via2 := via.(*ViaSender)
  283. if via2 == nil {
  284. f.l.Error("Handshake send failed: both addr and via are nil.")
  285. return
  286. }
  287. hostinfo.relayState.InsertRelayTo(via2.relayHI.vpnIp)
  288. f.SendVia(via2.relayHI, via2.relay, msg, make([]byte, 12), make([]byte, mtu), false)
  289. f.l.WithField("vpnIp", vpnIp).WithField("relay", via2.relayHI.vpnIp).
  290. WithField("certName", certName).
  291. WithField("fingerprint", fingerprint).
  292. WithField("issuer", issuer).
  293. WithField("initiatorIndex", hs.Details.InitiatorIndex).WithField("responderIndex", hs.Details.ResponderIndex).
  294. WithField("remoteIndex", h.RemoteIndex).WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).
  295. WithField("sentCachedPackets", len(hostinfo.packetStore)).
  296. Info("Handshake message sent")
  297. }
  298. if existing != nil {
  299. // Make sure we are tracking the old primary if there was one, it needs to go away eventually
  300. f.connectionManager.Out(existing.localIndexId)
  301. }
  302. f.connectionManager.Out(hostinfo.localIndexId)
  303. hostinfo.handshakeComplete(f.l, f.cachedPacketMetrics)
  304. return
  305. }
  306. func ixHandshakeStage2(f *Interface, addr *udp.Addr, via interface{}, hostinfo *HostInfo, packet []byte, h *header.H) bool {
  307. if hostinfo == nil {
  308. // Nothing here to tear down, got a bogus stage 2 packet
  309. return true
  310. }
  311. hostinfo.Lock()
  312. defer hostinfo.Unlock()
  313. if addr != nil {
  314. if !f.lightHouse.GetRemoteAllowList().Allow(hostinfo.vpnIp, addr.IP) {
  315. f.l.WithField("vpnIp", hostinfo.vpnIp).WithField("udpAddr", addr).Debug("lighthouse.remote_allow_list denied incoming handshake")
  316. return false
  317. }
  318. }
  319. ci := hostinfo.ConnectionState
  320. if ci.ready {
  321. f.l.WithField("vpnIp", hostinfo.vpnIp).WithField("udpAddr", addr).
  322. WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).WithField("header", h).
  323. Info("Handshake is already complete")
  324. // Update remote if preferred
  325. if hostinfo.SetRemoteIfPreferred(f.hostMap, addr) {
  326. // Send a test packet to ensure the other side has also switched to
  327. // the preferred remote
  328. f.SendMessageToVpnIp(header.Test, header.TestRequest, hostinfo.vpnIp, []byte(""), make([]byte, 12, 12), make([]byte, mtu))
  329. }
  330. // We already have a complete tunnel, there is nothing that can be done by processing further stage 1 packets
  331. return false
  332. }
  333. msg, eKey, dKey, err := ci.H.ReadMessage(nil, packet[header.Len:])
  334. if err != nil {
  335. f.l.WithError(err).WithField("vpnIp", hostinfo.vpnIp).WithField("udpAddr", addr).
  336. WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).WithField("header", h).
  337. Error("Failed to call noise.ReadMessage")
  338. // We don't want to tear down the connection on a bad ReadMessage because it could be an attacker trying
  339. // to DOS us. Every other error condition after should to allow a possible good handshake to complete in the
  340. // near future
  341. return false
  342. } else if dKey == nil || eKey == nil {
  343. f.l.WithField("vpnIp", hostinfo.vpnIp).WithField("udpAddr", addr).
  344. WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).
  345. Error("Noise did not arrive at a key")
  346. // This should be impossible in IX but just in case, if we get here then there is no chance to recover
  347. // the handshake state machine. Tear it down
  348. return true
  349. }
  350. hs := &NebulaHandshake{}
  351. err = hs.Unmarshal(msg)
  352. if err != nil || hs.Details == nil {
  353. f.l.WithError(err).WithField("vpnIp", hostinfo.vpnIp).WithField("udpAddr", addr).
  354. WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).Error("Failed unmarshal handshake message")
  355. // The handshake state machine is complete, if things break now there is no chance to recover. Tear down and start again
  356. return true
  357. }
  358. remoteCert, err := RecombineCertAndValidate(ci.H, hs.Details.Cert, f.caPool)
  359. if err != nil {
  360. f.l.WithError(err).WithField("vpnIp", hostinfo.vpnIp).WithField("udpAddr", addr).
  361. WithField("cert", remoteCert).WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).
  362. Error("Invalid certificate from host")
  363. // The handshake state machine is complete, if things break now there is no chance to recover. Tear down and start again
  364. return true
  365. }
  366. vpnIp := iputil.Ip2VpnIp(remoteCert.Details.Ips[0].IP)
  367. certName := remoteCert.Details.Name
  368. fingerprint, _ := remoteCert.Sha256Sum()
  369. issuer := remoteCert.Details.Issuer
  370. // Ensure the right host responded
  371. if vpnIp != hostinfo.vpnIp {
  372. f.l.WithField("intendedVpnIp", hostinfo.vpnIp).WithField("haveVpnIp", vpnIp).
  373. WithField("udpAddr", addr).WithField("certName", certName).
  374. WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).
  375. Info("Incorrect host responded to handshake")
  376. // Release our old handshake from pending, it should not continue
  377. f.handshakeManager.pendingHostMap.DeleteHostInfo(hostinfo)
  378. // Create a new hostinfo/handshake for the intended vpn ip
  379. //TODO: this adds it to the timer wheel in a way that aggressively retries
  380. newHostInfo := f.getOrHandshake(hostinfo.vpnIp)
  381. newHostInfo.Lock()
  382. // Block the current used address
  383. newHostInfo.remotes = hostinfo.remotes
  384. newHostInfo.remotes.BlockRemote(addr)
  385. // Get the correct remote list for the host we did handshake with
  386. hostinfo.remotes = f.lightHouse.QueryCache(vpnIp)
  387. f.l.WithField("blockedUdpAddrs", newHostInfo.remotes.CopyBlockedRemotes()).WithField("vpnIp", vpnIp).
  388. WithField("remotes", newHostInfo.remotes.CopyAddrs(f.hostMap.preferredRanges)).
  389. Info("Blocked addresses for handshakes")
  390. // Swap the packet store to benefit the original intended recipient
  391. hostinfo.ConnectionState.queueLock.Lock()
  392. newHostInfo.packetStore = hostinfo.packetStore
  393. hostinfo.packetStore = []*cachedPacket{}
  394. hostinfo.ConnectionState.queueLock.Unlock()
  395. // Finally, put the correct vpn ip in the host info, tell them to close the tunnel, and return true to tear down
  396. hostinfo.vpnIp = vpnIp
  397. f.sendCloseTunnel(hostinfo)
  398. newHostInfo.Unlock()
  399. return true
  400. }
  401. // Mark packet 2 as seen so it doesn't show up as missed
  402. ci.window.Update(f.l, 2)
  403. duration := time.Since(hostinfo.handshakeStart).Nanoseconds()
  404. f.l.WithField("vpnIp", vpnIp).WithField("udpAddr", addr).
  405. WithField("certName", certName).
  406. WithField("fingerprint", fingerprint).
  407. WithField("issuer", issuer).
  408. WithField("initiatorIndex", hs.Details.InitiatorIndex).WithField("responderIndex", hs.Details.ResponderIndex).
  409. WithField("remoteIndex", h.RemoteIndex).WithField("handshake", m{"stage": 2, "style": "ix_psk0"}).
  410. WithField("durationNs", duration).
  411. WithField("sentCachedPackets", len(hostinfo.packetStore)).
  412. Info("Handshake message received")
  413. hostinfo.remoteIndexId = hs.Details.ResponderIndex
  414. hostinfo.lastHandshakeTime = hs.Details.Time
  415. // Store their cert and our symmetric keys
  416. ci.peerCert = remoteCert
  417. ci.dKey = NewNebulaCipherState(dKey)
  418. ci.eKey = NewNebulaCipherState(eKey)
  419. // Make sure the current udpAddr being used is set for responding
  420. if addr != nil {
  421. hostinfo.SetRemote(addr)
  422. } else {
  423. via2 := via.(*ViaSender)
  424. hostinfo.relayState.InsertRelayTo(via2.relayHI.vpnIp)
  425. }
  426. // Build up the radix for the firewall if we have subnets in the cert
  427. hostinfo.CreateRemoteCIDR(remoteCert)
  428. // Complete our handshake and update metrics, this will replace any existing tunnels for this vpnIp
  429. existing := f.handshakeManager.Complete(hostinfo, f)
  430. if existing != nil {
  431. // Make sure we are tracking the old primary if there was one, it needs to go away eventually
  432. f.connectionManager.Out(existing.localIndexId)
  433. }
  434. hostinfo.handshakeComplete(f.l, f.cachedPacketMetrics)
  435. f.metricHandshakes.Update(duration)
  436. return false
  437. }