@@ -3,14 +3,22 @@ package logic
3
3
import (
4
4
"errors"
5
5
"fmt"
6
+ "net"
6
7
"slices"
7
8
"sort"
8
9
"time"
9
10
11
+ "github.com/google/uuid"
10
12
"github.com/gravitl/netmaker/database"
11
13
"github.com/gravitl/netmaker/logger"
12
14
"github.com/gravitl/netmaker/models"
13
15
"github.com/gravitl/netmaker/servercfg"
16
+ "golang.org/x/exp/slog"
17
+ )
18
+
19
+ var (
20
+ IPv4Network = "0.0.0.0/0"
21
+ IPv6Network = "::/0"
14
22
)
15
23
16
24
// IsInternetGw - checks if node is acting as internet gw
@@ -267,9 +275,6 @@ func DeleteIngressGateway(nodeid string) (models.Node, []models.ExtClient, error
267
275
logger .Log (3 , "deleting ingress gateway" )
268
276
node .LastModified = time .Now ().UTC ()
269
277
node .IsIngressGateway = false
270
- if ! servercfg .IsPro {
271
- node .IsInternetGateway = false
272
- }
273
278
delete (node .Tags , models .TagID (fmt .Sprintf ("%s.%s" , node .Network , models .GwTagName )))
274
279
node .IngressGatewayRange = ""
275
280
node .Metadata = ""
@@ -316,3 +321,157 @@ func IsUserAllowedAccessToExtClient(username string, client models.ExtClient) bo
316
321
}
317
322
return true
318
323
}
324
+
325
+ func ValidateInetGwReq (inetNode models.Node , req models.InetNodeReq , update bool ) error {
326
+ inetHost , err := GetHost (inetNode .HostID .String ())
327
+ if err != nil {
328
+ return err
329
+ }
330
+ if inetHost .FirewallInUse == models .FIREWALL_NONE {
331
+ return errors .New ("iptables or nftables needs to be installed" )
332
+ }
333
+ if inetNode .InternetGwID != "" {
334
+ return fmt .Errorf ("node %s is using a internet gateway already" , inetHost .Name )
335
+ }
336
+ if inetNode .IsRelayed {
337
+ return fmt .Errorf ("node %s is being relayed" , inetHost .Name )
338
+ }
339
+
340
+ for _ , clientNodeID := range req .InetNodeClientIDs {
341
+ clientNode , err := GetNodeByID (clientNodeID )
342
+ if err != nil {
343
+ return err
344
+ }
345
+ if clientNode .IsFailOver {
346
+ return errors .New ("failover node cannot be set to use internet gateway" )
347
+ }
348
+ clientHost , err := GetHost (clientNode .HostID .String ())
349
+ if err != nil {
350
+ return err
351
+ }
352
+ if clientHost .IsDefault {
353
+ return errors .New ("default host cannot be set to use internet gateway" )
354
+ }
355
+ if clientHost .OS != models .OS_Types .Linux && clientHost .OS != models .OS_Types .Windows {
356
+ return errors .New ("can only attach linux or windows machine to a internet gateway" )
357
+ }
358
+ if clientNode .IsInternetGateway {
359
+ return fmt .Errorf ("node %s acting as internet gateway cannot use another internet gateway" , clientHost .Name )
360
+ }
361
+ if update {
362
+ if clientNode .InternetGwID != "" && clientNode .InternetGwID != inetNode .ID .String () {
363
+ return fmt .Errorf ("node %s is already using a internet gateway" , clientHost .Name )
364
+ }
365
+ } else {
366
+ if clientNode .InternetGwID != "" {
367
+ return fmt .Errorf ("node %s is already using a internet gateway" , clientHost .Name )
368
+ }
369
+ }
370
+ if clientNode .FailedOverBy != uuid .Nil {
371
+ ResetFailedOverPeer (& clientNode )
372
+ }
373
+
374
+ if clientNode .IsRelayed && clientNode .RelayedBy != inetNode .ID .String () {
375
+ return fmt .Errorf ("node %s is being relayed" , clientHost .Name )
376
+ }
377
+
378
+ for _ , nodeID := range clientHost .Nodes {
379
+ node , err := GetNodeByID (nodeID )
380
+ if err != nil {
381
+ continue
382
+ }
383
+ if node .InternetGwID != "" && node .InternetGwID != inetNode .ID .String () {
384
+ return errors .New ("nodes on same host cannot use different internet gateway" )
385
+ }
386
+
387
+ }
388
+ }
389
+ return nil
390
+ }
391
+
392
+ // SetInternetGw - sets the node as internet gw based on flag bool
393
+ func SetInternetGw (node * models.Node , req models.InetNodeReq ) {
394
+ node .IsInternetGateway = true
395
+ node .InetNodeReq = req
396
+ for _ , clientNodeID := range req .InetNodeClientIDs {
397
+ clientNode , err := GetNodeByID (clientNodeID )
398
+ if err != nil {
399
+ continue
400
+ }
401
+ clientNode .InternetGwID = node .ID .String ()
402
+ UpsertNode (& clientNode )
403
+ }
404
+
405
+ }
406
+
407
+ func UnsetInternetGw (node * models.Node ) {
408
+ nodes , err := GetNetworkNodes (node .Network )
409
+ if err != nil {
410
+ slog .Error ("failed to get network nodes" , "network" , node .Network , "error" , err )
411
+ return
412
+ }
413
+ for _ , clientNode := range nodes {
414
+ if node .ID .String () == clientNode .InternetGwID {
415
+ clientNode .InternetGwID = ""
416
+ UpsertNode (& clientNode )
417
+ }
418
+
419
+ }
420
+ node .IsInternetGateway = false
421
+ node .InetNodeReq = models.InetNodeReq {}
422
+
423
+ }
424
+
425
+ func SetDefaultGwForRelayedUpdate (relayed , relay models.Node , peerUpdate models.HostPeerUpdate ) models.HostPeerUpdate {
426
+ if relay .InternetGwID != "" {
427
+ relayedHost , err := GetHost (relayed .HostID .String ())
428
+ if err != nil {
429
+ return peerUpdate
430
+ }
431
+ peerUpdate .ChangeDefaultGw = true
432
+ peerUpdate .DefaultGwIp = relay .Address .IP
433
+ if peerUpdate .DefaultGwIp == nil || relayedHost .EndpointIP == nil {
434
+ peerUpdate .DefaultGwIp = relay .Address6 .IP
435
+ }
436
+
437
+ }
438
+ return peerUpdate
439
+ }
440
+
441
+ func SetDefaultGw (node models.Node , peerUpdate models.HostPeerUpdate ) models.HostPeerUpdate {
442
+ if node .InternetGwID != "" {
443
+
444
+ inetNode , err := GetNodeByID (node .InternetGwID )
445
+ if err != nil {
446
+ return peerUpdate
447
+ }
448
+ host , err := GetHost (node .HostID .String ())
449
+ if err != nil {
450
+ return peerUpdate
451
+ }
452
+
453
+ peerUpdate .ChangeDefaultGw = true
454
+ peerUpdate .DefaultGwIp = inetNode .Address .IP
455
+ if peerUpdate .DefaultGwIp == nil || host .EndpointIP == nil {
456
+ peerUpdate .DefaultGwIp = inetNode .Address6 .IP
457
+ }
458
+ }
459
+ return peerUpdate
460
+ }
461
+
462
+ // GetAllowedIpForInetNodeClient - get inet cidr for node using a inet gw
463
+ func GetAllowedIpForInetNodeClient (node , peer * models.Node ) []net.IPNet {
464
+ var allowedips = []net.IPNet {}
465
+
466
+ if peer .Address .IP != nil {
467
+ _ , ipnet , _ := net .ParseCIDR (IPv4Network )
468
+ allowedips = append (allowedips , * ipnet )
469
+ }
470
+
471
+ if peer .Address6 .IP != nil {
472
+ _ , ipnet , _ := net .ParseCIDR (IPv6Network )
473
+ allowedips = append (allowedips , * ipnet )
474
+ }
475
+
476
+ return allowedips
477
+ }
0 commit comments