前言

因为工作关系,需要使用ipset,但是截止目前,golang社区中对ipset的支持并不好。之前用的是go-ipset,只能满足基础的使用,而且只支持hash类型以及部分选项。所以萌生了全面封装golang版本ipset的想法,才有了gonetx/ipset的诞生。

功能

支持所有的ispet常用命令、类型以及实用的选项。

常用命令

支持增删改查导入导出等常用命令,用法可以参见快速开始进阶使用

全类型支持

支持所有ipset的方法类型

  • bitmap
  • hash
  • list

和数据类型

  • ip
  • net
  • mac
  • port
  • iface

灵活的选项

每种set类型都会有各自的选项,主要集中在创建和新增操作上。目前支持22个选项,常用的有

  • func Exist(exist bool) Option:创建set或添加entry时,若数据已存在报不报错;删除entry时不存在数据报不报错;
  • func Timeout(timeout time.Duration) Option:创建set或者添加entry时可以指定超时时间;
  • func MaxElem(maxElem uint) Option:指定hash方法类型的set容量;
  • func Family(family NetFamily) Option:指定hash方法类型的set网络协议簇;
  • func HashSize(hashSize uint) Option:指定hash方法类型的set初始化hash大小。

更多选项详情可以查看文档

示例

通过示例可以更快地了解该包的使用。需要注意的是,使用该包之前,必须调用ispet.Check检查系统是否支持ispet操作以及版本是否大于v6.0

快速开始

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package main

import (
	"log"
	"time"

	"github.com/kiyonlin/gonetx/ipset"
)

func init() {
	if err := ipset.Check(); err != nil {
		panic(err)
	}
}

func main() {
	// create test set even it's exist
	set, _ := ipset.New("test", ipset.HashIp, ipset.Exist(true), ipset.Timeout(time.Hour))
	// output: test
	log.Println(set.Name())

	_ = set.Flush()

	_ = set.Add("1.1.1.1", ipset.Timeout(time.Hour))

	ok, _ := set.Test("1.1.1.1")
	// output: true
	log.Println(ok)

	ok, _ = set.Test("1.1.1.2")
	// output: false
	log.Println(ok)

	info, _ := set.List()
	// output: &{test hash:ip 4 family inet hashsize 1024 maxelem 65536 timeout 3600 216 0 [1.1.1.1 timeout 3599]}
	log.Println(info)

	_ = set.Del("1.1.1.1")

	_ = set.Destroy()
}

进阶使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package main

import (
	"bytes"
	"io/ioutil"
	"log"
	"time"

	"github.com/kiyonlin/gonetx/ipset"
)

func init() {
	if err := ipset.Check(); err != nil {
		panic(err)
	}
}

func main() {
	// create test set even it's exist
	set, _ := ipset.New("test", ipset.HashIp,
		ipset.Exist(true), ipset.Timeout(time.Hour*3),
		ipset.Family(ipset.Inet), ipset.HashSize(1024),
		ipset.MaxElem(100000),
	)

	// Saved content:
	_ = ioutil.WriteFile("saved",
		[]byte("add test 1.1.1.1 timeout 3600 -exist\nadd test 1.1.1.2 timeout 3600 -exist\n"),
		0600)
	_ = set.RestoreFromFile("saved")

	data := &bytes.Buffer{}
	data.WriteString("add test 1.1.1.3 timeout 3600 -exist\n")
	data.WriteString("add test 1.1.1.4 timeout 3600 -exist\n")

	_ = set.Restore(data)

	info, _ := set.List()
	// output: &{test hash:ip 4 family inet hashsize 1024 maxelem 100000 timeout 10800 504 0 [1.1.1.3 timeout 3599 1.1.1.2 timeout 3599 1.1.1.1 timeout 3599 1.1.1.4 timeout 3599]}
	log.Println(info)

	_ = set.SaveToFile("saved")
	// cat saved:
	//create test hash:ip family inet hashsize 1024 maxelem 100000 timeout 10800
	//add test 1.1.1.3 timeout 3599
	//add test 1.1.1.2 timeout 3599
	//add test 1.1.1.1 timeout 3599
	//add test 1.1.1.4 timeout 3599
}

最后

有任何疑问或者改进,请提交issue或者PR