75 lines
1.5 KiB
Go
Raw Normal View History

2024-09-06 14:24:55 +03:00
package netfilterHelper
import (
"fmt"
"github.com/vishvananda/netlink"
"net"
"os"
)
type IPSet struct {
SetName string
}
2024-10-21 00:18:42 +03:00
func (r *IPSet) AddIP(addr net.IP, timeout *uint32) error {
2024-09-06 14:24:55 +03:00
err := netlink.IpsetAdd(r.SetName, &netlink.IPSetEntry{
IP: addr,
Timeout: timeout,
Replace: true,
})
if err != nil {
return fmt.Errorf("failed to add address: %w", err)
}
return nil
}
2024-09-14 18:20:44 +03:00
func (r *IPSet) Del(addr net.IP) error {
err := netlink.IpsetDel(r.SetName, &netlink.IPSetEntry{
IP: addr,
})
2024-09-06 14:24:55 +03:00
if err != nil {
2024-09-14 18:20:44 +03:00
return fmt.Errorf("failed to delete address: %w", err)
2024-09-06 14:24:55 +03:00
}
2024-09-14 18:20:44 +03:00
return nil
}
2024-09-06 14:24:55 +03:00
2024-09-14 18:20:44 +03:00
func (r *IPSet) List() (map[string]*uint32, error) {
list, err := netlink.IpsetList(r.SetName)
2024-09-06 14:24:55 +03:00
if err != nil {
2024-09-14 18:20:44 +03:00
return nil, err
2024-09-06 14:24:55 +03:00
}
2024-09-14 18:20:44 +03:00
addresses := make(map[string]*uint32)
for _, entry := range list.Entries {
addresses[string(entry.IP)] = entry.Timeout
}
return addresses, nil
2024-09-06 14:24:55 +03:00
}
func (r *IPSet) Destroy() error {
err := netlink.IpsetDestroy(r.SetName)
if err != nil && !os.IsNotExist(err) {
return fmt.Errorf("failed to destroy ipset: %w", err)
}
return nil
}
2024-09-14 18:20:44 +03:00
func (nh *NetfilterHelper) IPSet(name string) (*IPSet, error) {
ipset := &IPSet{
2024-09-06 14:24:55 +03:00
SetName: name,
}
2024-09-14 18:20:44 +03:00
err := ipset.Destroy()
if err != nil {
return nil, err
}
defaultTimeout := uint32(300)
2024-10-21 00:18:42 +03:00
err = netlink.IpsetCreate(ipset.SetName, "hash:net", netlink.IpsetCreateOptions{
2024-09-14 18:20:44 +03:00
Timeout: &defaultTimeout,
})
if err != nil {
return nil, fmt.Errorf("failed to create ipset: %w", err)
}
return ipset, nil
2024-09-06 14:24:55 +03:00
}