mirror of
https://github.com/qdm12/gluetun.git
synced 2026-05-07 04:20:12 +02:00
70 lines
1.4 KiB
Go
70 lines
1.4 KiB
Go
package netlink
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/jsimonetti/rtnetlink"
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
const (
|
|
FlagInvert = unix.FIB_RULE_INVERT
|
|
ActionToTable = unix.FR_ACT_TO_TBL
|
|
)
|
|
|
|
func (n *NetLink) RuleList(family uint8) (rules []Rule, err error) {
|
|
switch family {
|
|
case FamilyAll:
|
|
n.debugLogger.Debug("ip -4 rule list")
|
|
n.debugLogger.Debug("ip -6 rule list")
|
|
case FamilyV4:
|
|
n.debugLogger.Debug("ip -4 rule list")
|
|
case FamilyV6:
|
|
n.debugLogger.Debug("ip -6 rule list")
|
|
}
|
|
|
|
conn, err := rtnetlink.Dial(nil)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("dialing netlink: %w", err)
|
|
}
|
|
defer conn.Close()
|
|
|
|
ruleMessages, err := conn.Rule.List()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
rules = make([]Rule, 0, len(ruleMessages))
|
|
for _, message := range ruleMessages {
|
|
if family != FamilyAll && family != message.Family {
|
|
continue
|
|
}
|
|
var rule Rule
|
|
rule.fromMessage(message)
|
|
rules = append(rules, rule)
|
|
}
|
|
return rules, nil
|
|
}
|
|
|
|
func (n *NetLink) RuleAdd(rule Rule) error {
|
|
n.debugLogger.Debug(rule.debugMessage(true))
|
|
|
|
conn, err := rtnetlink.Dial(nil)
|
|
if err != nil {
|
|
return fmt.Errorf("dialing netlink: %w", err)
|
|
}
|
|
defer conn.Close()
|
|
return conn.Rule.Add(rule.message())
|
|
}
|
|
|
|
func (n *NetLink) RuleDel(rule Rule) error {
|
|
n.debugLogger.Debug(rule.debugMessage(false))
|
|
|
|
conn, err := rtnetlink.Dial(nil)
|
|
if err != nil {
|
|
return fmt.Errorf("dialing netlink: %w", err)
|
|
}
|
|
defer conn.Close()
|
|
return conn.Rule.Delete(rule.message())
|
|
}
|