change 128 bit IDs to 32 bit

This commit is contained in:
Vladimir Avtsenov 2025-02-11 23:19:01 +03:00
parent 184956829b
commit 60e1f4c540
4 changed files with 17 additions and 12 deletions

View File

@ -167,13 +167,13 @@ func (g *Group) LinkUpdateHook(event netlink.LinkUpdate) error {
} }
func NewGroup(group *models.Group, nh4 *netfilterHelper.NetfilterHelper, chainPrefix, ipsetNamePrefix string) (*Group, error) { func NewGroup(group *models.Group, nh4 *netfilterHelper.NetfilterHelper, chainPrefix, ipsetNamePrefix string) (*Group, error) {
ipsetName := fmt.Sprintf("%s%8x", ipsetNamePrefix, group.ID.ID()) ipsetName := fmt.Sprintf("%s%8x", ipsetNamePrefix, group.ID)
ipset, err := nh4.IPSet(ipsetName) ipset, err := nh4.IPSet(ipsetName)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to initialize ipset: %w", err) return nil, fmt.Errorf("failed to initialize ipset: %w", err)
} }
ipsetToLink := nh4.IPSetToLink(fmt.Sprintf("%s%8x", chainPrefix, group.ID.ID()), group.Interface, ipsetName) ipsetToLink := nh4.IPSetToLink(fmt.Sprintf("%s%8x", chainPrefix, group.ID), group.Interface, ipsetName)
return &Group{ return &Group{
Group: group, Group: group,
iptables: nh4.IPTables, iptables: nh4.IPTables,

View File

@ -2,8 +2,11 @@ package main
import ( import (
"context" "context"
"encoding/binary"
"encoding/hex"
"errors" "errors"
"fmt" "fmt"
"math/rand"
"net" "net"
"os" "os"
"strconv" "strconv"
@ -16,7 +19,6 @@ import (
"kvas2-go/netfilter-helper" "kvas2-go/netfilter-helper"
"kvas2-go/records" "kvas2-go/records"
"github.com/google/uuid"
"github.com/miekg/dns" "github.com/miekg/dns"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/vishvananda/netlink" "github.com/vishvananda/netlink"
@ -28,6 +30,12 @@ var (
ErrGroupIDConflict = errors.New("group id conflict") ErrGroupIDConflict = errors.New("group id conflict")
) )
func randomId() [4]byte {
id := make([]byte, 4)
binary.BigEndian.PutUint32(id, rand.Uint32())
return [4]byte(id)
}
type Config struct { type Config struct {
AdditionalTTL uint32 AdditionalTTL uint32
ChainPrefix string ChainPrefix string
@ -45,7 +53,7 @@ type App struct {
NetfilterHelper4 *netfilterHelper.NetfilterHelper NetfilterHelper4 *netfilterHelper.NetfilterHelper
NetfilterHelper6 *netfilterHelper.NetfilterHelper NetfilterHelper6 *netfilterHelper.NetfilterHelper
Records *records.Records Records *records.Records
Groups map[uuid.UUID]*group.Group Groups map[[4]byte]*group.Group
Link netlink.Link Link netlink.Link
@ -72,7 +80,7 @@ func (a *App) handleLink(event netlink.LinkUpdate) {
err := group.LinkUpdateHook(event) err := group.LinkUpdateHook(event)
if err != nil { if err != nil {
log.Error().Str("group", group.ID.String()).Err(err).Msg("error while handling interface up") log.Error().Str("group", hex.EncodeToString(group.ID[:])).Err(err).Msg("error while handling interface up")
} }
} }
} }
@ -460,7 +468,7 @@ func New(config Config) (*App, error) {
} }
app.Records = records.New() app.Records = records.New()
app.Groups = make(map[uuid.UUID]*group.Group) app.Groups = make(map[[4]byte]*group.Group)
link, err := netlink.LinkByName(app.Config.LinkName) link, err := netlink.LinkByName(app.Config.LinkName)
if err != nil { if err != nil {
@ -488,7 +496,7 @@ func New(config Config) (*App, error) {
return nil, fmt.Errorf("failed to clear iptables: %w", err) return nil, fmt.Errorf("failed to clear iptables: %w", err)
} }
app.Groups = make(map[uuid.UUID]*group.Group) app.Groups = make(map[[4]byte]*group.Group)
return app, nil return app, nil
} }

View File

@ -1,9 +1,7 @@
package models package models
import "github.com/google/uuid"
type Group struct { type Group struct {
ID uuid.UUID ID [4]byte
Name string Name string
Interface string Interface string
Rules []*Rule Rules []*Rule

View File

@ -4,11 +4,10 @@ import (
"regexp" "regexp"
"github.com/IGLOU-EU/go-wildcard/v2" "github.com/IGLOU-EU/go-wildcard/v2"
"github.com/google/uuid"
) )
type Rule struct { type Rule struct {
ID uuid.UUID ID [4]byte
Name string Name string
Type string Type string
Rule string Rule string