ipset: support ipv6

This commit is contained in:
nadoo 2022-01-22 23:33:08 +08:00
parent a919ac3469
commit faae2a9e22
4 changed files with 27 additions and 12 deletions

View File

@ -67,7 +67,7 @@ func (c *Client) Exchange(reqBytes []byte, clientAddr string, preferTCP bool) ([
} }
if c.config.NoAAAA && req.Question.QTYPE == QTypeAAAA { if c.config.NoAAAA && req.Question.QTYPE == QTypeAAAA {
reqBytes[2] |= uint8(Response) << 7 reqBytes[2] |= uint8(ResponseMsg) << 7
return reqBytes, nil return reqBytes, nil
} }
@ -321,7 +321,7 @@ func MakeResponse(domain, ip string, ttl uint32) (*Message, error) {
rdata = ipb rdata = ipb
} }
m := NewMessage(0, Response) m := NewMessage(0, ResponseMsg)
m.SetQuestion(NewQuestion(qtype, domain)) m.SetQuestion(NewQuestion(qtype, domain))
rr := &RR{NAME: domain, TYPE: qtype, CLASS: ClassINET, rr := &RR{NAME: domain, TYPE: qtype, CLASS: ClassINET,
TTL: ttl, RDLENGTH: rdlen, RDATA: rdata} TTL: ttl, RDLENGTH: rdlen, RDATA: rdata}

View File

@ -20,10 +20,13 @@ const UDPMaxLen = 512
// HeaderLen is the length of dns msg header. // HeaderLen is the length of dns msg header.
const HeaderLen = 12 const HeaderLen = 12
// MsgType is the dns Message type.
type MsgType byte
// Message types. // Message types.
const ( const (
Query = 0 QueryMsg MsgType = 0
Response = 1 ResponseMsg MsgType = 1
) )
// Query types. // Query types.
@ -64,7 +67,7 @@ type Message struct {
} }
// NewMessage returns a new message. // NewMessage returns a new message.
func NewMessage(id uint16, msgType int) *Message { func NewMessage(id uint16, msgType MsgType) *Message {
if id == 0 { if id == 0 {
id = uint16(rand.Uint32()) id = uint16(rand.Uint32())
} }
@ -194,7 +197,7 @@ type Header struct {
} }
// SetMsgType sets the message type. // SetMsgType sets the message type.
func (h *Header) SetMsgType(qr int) { func (h *Header) SetMsgType(qr MsgType) {
h.Bits |= uint16(qr) << 15 h.Bits |= uint16(qr) << 15
} }

View File

@ -30,8 +30,7 @@ func NewManager(rules []*rule.Config) (*Manager, error) {
} }
for set := range sets { for set := range sets {
ipset.Create(set) createSet(set)
ipset.Flush(set)
} }
// init ipset // init ipset
@ -42,10 +41,10 @@ func NewManager(rules []*rule.Config) (*Manager, error) {
m.domainSet.Store(domain, r.IPSet) m.domainSet.Store(domain, r.IPSet)
} }
for _, ip := range r.IP { for _, ip := range r.IP {
ipset.Add(r.IPSet, ip) addToSet(r.IPSet, ip)
} }
for _, cidr := range r.CIDR { for _, cidr := range r.CIDR {
ipset.Add(r.IPSet, cidr) addToSet(r.IPSet, cidr)
} }
} }
} }
@ -63,9 +62,23 @@ func (m *Manager) AddDomainIP(domain, ip string) error {
for i := len(domain); i != -1; { for i := len(domain); i != -1; {
i = strings.LastIndexByte(domain[:i], '.') i = strings.LastIndexByte(domain[:i], '.')
if setName, ok := m.domainSet.Load(domain[i+1:]); ok { if setName, ok := m.domainSet.Load(domain[i+1:]); ok {
ipset.Add(setName.(string), ip) addToSet(setName.(string), ip)
} }
} }
return nil return nil
} }
func createSet(s string) {
ipset.Create(s)
ipset.Flush(s)
ipset.Create(s+"6", ipset.OptIPv6())
ipset.Flush(s + "6")
}
func addToSet(s, item string) error {
if strings.IndexByte(item, '.') == -1 {
return ipset.Add(s+"6", item)
}
return ipset.Add(s, item)
}

View File

@ -72,7 +72,6 @@ func main() {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
go local.ListenAndServe() go local.ListenAndServe()
} }