using netlink instead exec in ip-helper
This commit is contained in:
parent
c335a7cce6
commit
04c2cebba6
41
group.go
41
group.go
@ -1,22 +1,20 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/vishvananda/netlink"
|
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"kvas2-go/models"
|
"kvas2-go/models"
|
||||||
"kvas2-go/pkg/ip-helper"
|
"kvas2-go/pkg/ip-helper"
|
||||||
|
|
||||||
|
"github.com/vishvananda/netlink"
|
||||||
)
|
)
|
||||||
|
|
||||||
type GroupOptions struct {
|
type GroupOptions struct {
|
||||||
Enabled bool
|
Enabled bool
|
||||||
FWMark uint32
|
ipRule *netlink.Rule
|
||||||
Table int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type Group struct {
|
type Group struct {
|
||||||
@ -60,25 +58,22 @@ func (g *Group) Enable() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
fwmark, err := ipHelper.GetUnusedFwMark(1)
|
var err error
|
||||||
|
|
||||||
|
rule := netlink.NewRule()
|
||||||
|
rule.Mark, err = ipHelper.GetUnusedFwMark(1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error while getting free fwmark: %w", err)
|
return fmt.Errorf("error while getting free fwmark: %w", err)
|
||||||
}
|
}
|
||||||
|
rule.Table, err = ipHelper.GetUnusedTable(1)
|
||||||
table, err := ipHelper.GetUnusedTable(1)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error while getting free table: %w", err)
|
return fmt.Errorf("error while getting free table: %w", err)
|
||||||
}
|
}
|
||||||
|
err = netlink.RuleAdd(rule)
|
||||||
fwmarkStr := strconv.Itoa(int(fwmark))
|
|
||||||
tableStr := strconv.Itoa(int(table))
|
|
||||||
out, err := ipHelper.ExecIp("rule", "add", "fwmark", fwmarkStr, "table", tableStr)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("error while adding rule: %w", err)
|
||||||
}
|
|
||||||
if len(out) != 0 {
|
|
||||||
return errors.New(string(out))
|
|
||||||
}
|
}
|
||||||
|
g.options.ipRule = rule
|
||||||
|
|
||||||
defaultTimeout := uint32(300)
|
defaultTimeout := uint32(300)
|
||||||
err = netlink.IpsetDestroy(g.ipsetName)
|
err = netlink.IpsetDestroy(g.ipsetName)
|
||||||
@ -93,8 +88,6 @@ func (g *Group) Enable() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
g.options.Enabled = true
|
g.options.Enabled = true
|
||||||
g.options.FWMark = fwmark
|
|
||||||
g.options.Table = table
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -104,14 +97,9 @@ func (g *Group) Disable() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
fwmarkStr := strconv.Itoa(int(g.options.FWMark))
|
err := netlink.RuleDel(g.options.ipRule)
|
||||||
tableStr := strconv.Itoa(int(g.options.Table))
|
|
||||||
out, err := ipHelper.ExecIp("rule", "del", "fwmark", fwmarkStr, "table", tableStr)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return fmt.Errorf("error while deleting rule: %w", err)
|
||||||
}
|
|
||||||
if len(out) != 0 {
|
|
||||||
return errors.New(string(out))
|
|
||||||
}
|
}
|
||||||
|
|
||||||
err = netlink.IpsetDestroy(g.ipsetName)
|
err = netlink.IpsetDestroy(g.ipsetName)
|
||||||
@ -120,8 +108,7 @@ func (g *Group) Disable() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
g.options.Enabled = false
|
g.options.Enabled = false
|
||||||
g.options.FWMark = 0
|
g.options.ipRule = nil
|
||||||
g.options.Table = 0
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user