2019-11-19 10:00:20 -07:00
|
|
|
package nebula
|
|
|
|
|
2021-11-03 19:54:04 -06:00
|
|
|
import (
|
|
|
|
"github.com/slackhq/nebula/header"
|
|
|
|
"github.com/slackhq/nebula/udp"
|
2019-11-19 10:00:20 -07:00
|
|
|
)
|
|
|
|
|
2023-04-07 12:28:37 -06:00
|
|
|
func HandleIncomingHandshake(f *Interface, addr *udp.Addr, via *ViaSender, packet []byte, h *header.H, hostinfo *HostInfo) {
|
2021-10-19 08:54:30 -06:00
|
|
|
// First remote allow list check before we know the vpnIp
|
2022-06-21 12:35:23 -06:00
|
|
|
if addr != nil {
|
|
|
|
if !f.lightHouse.GetRemoteAllowList().AllowUnknownVpnIp(addr.IP) {
|
|
|
|
f.l.WithField("udpAddr", addr).Debug("lighthouse.remote_allow_list denied incoming handshake")
|
|
|
|
return
|
|
|
|
}
|
Add lighthouse.{remoteAllowList,localAllowList} (#217)
These settings make it possible to blacklist / whitelist IP addresses
that are used for remote connections.
`lighthouse.remoteAllowList` filters which remote IPs are allow when
fetching from the lighthouse (or, if you are the lighthouse, which IPs
you store and forward to querying hosts). By default, any remote IPs are
allowed. You can provide CIDRs here with `true` to allow and `false` to
deny. The most specific CIDR rule applies to each remote. If all rules
are "allow", the default will be "deny", and vice-versa. If both "allow"
and "deny" rules are present, then you MUST set a rule for "0.0.0.0/0"
as the default.
lighthouse:
remoteAllowList:
# Example to block IPs from this subnet from being used for remote IPs.
"172.16.0.0/12": false
# A more complicated example, allow public IPs but only private IPs from a specific subnet
"0.0.0.0/0": true
"10.0.0.0/8": false
"10.42.42.0/24": true
`lighthouse.localAllowList` has the same logic as above, but it applies
to the local addresses we advertise to the lighthouse. Additionally, you
can specify an `interfaces` map of regular expressions to match against
interface names. The regexp must match the entire name. All interface
rules must be either true or false (and the default rule will be the
inverse). CIDR rules are matched after interface name rules.
Default is all local IP addresses.
lighthouse:
localAllowList:
# Example to blacklist docker interfaces.
interfaces:
'docker.*': false
# Example to only advertise IPs in this subnet to the lighthouse.
"10.0.0.0/8": true
2020-04-08 13:36:43 -06:00
|
|
|
}
|
|
|
|
|
2019-11-19 10:00:20 -07:00
|
|
|
switch h.Subtype {
|
2021-11-03 19:54:04 -06:00
|
|
|
case header.HandshakeIXPSK0:
|
2019-11-19 10:00:20 -07:00
|
|
|
switch h.MessageCounter {
|
|
|
|
case 1:
|
2022-06-21 12:35:23 -06:00
|
|
|
ixHandshakeStage1(f, addr, via, packet, h)
|
2019-11-19 10:00:20 -07:00
|
|
|
case 2:
|
2023-07-24 11:37:52 -06:00
|
|
|
newHostinfo := f.handshakeManager.QueryIndex(h.RemoteIndex)
|
2022-06-21 12:35:23 -06:00
|
|
|
tearDown := ixHandshakeStage2(f, addr, via, newHostinfo, packet, h)
|
2021-03-12 12:16:25 -07:00
|
|
|
if tearDown && newHostinfo != nil {
|
|
|
|
f.handshakeManager.DeleteHostInfo(newHostinfo)
|
|
|
|
}
|
2019-11-19 10:00:20 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|