chore: optimize dhcpd and dns and more

This commit is contained in:
nadoo 2022-01-29 21:10:09 +08:00
parent 7e7c7553cc
commit f2eb638b91
9 changed files with 56 additions and 54 deletions

View File

@ -138,11 +138,12 @@ func (c *Client) extractAnswer(resp *Message) ([]string, int) {
ttl := c.config.MinTTL
for _, answer := range resp.Answers {
if answer.TYPE == QTypeA || answer.TYPE == QTypeAAAA {
if answer.IP.IsValid() {
ip := answer.IP.String()
for _, h := range c.handlers {
h(resp.Question.QNAME, answer.IP)
h(resp.Question.QNAME, ip)
}
if answer.IP != "" {
ips = append(ips, answer.IP)
ips = append(ips, ip)
}
if answer.TTL != 0 {
ttl = int(answer.TTL)

View File

@ -6,7 +6,7 @@ import (
"errors"
"io"
"math/rand"
"net"
"net/netip"
"strings"
)
@ -360,7 +360,7 @@ type RR struct {
RDLENGTH uint16
RDATA []byte
IP string
IP netip.Addr
}
// NewRR returns a new dns rr.
@ -441,9 +441,9 @@ func (m *Message) UnmarshalRR(start int, rr *RR) (n int, err error) {
rr.RDATA = p[n+10 : n+10+int(rr.RDLENGTH)]
if rr.TYPE == QTypeA {
rr.IP = net.IP(rr.RDATA[:net.IPv4len]).String()
rr.IP = netip.AddrFrom4(*(*[4]byte)(rr.RDATA[:4]))
} else if rr.TYPE == QTypeAAAA {
rr.IP = net.IP(rr.RDATA[:net.IPv6len]).String()
rr.IP = netip.AddrFrom16(*(*[16]byte)(rr.RDATA[:16]))
}
n = n + 10 + int(rr.RDLENGTH)

4
go.mod
View File

@ -11,8 +11,8 @@ require (
github.com/nadoo/conflag v0.2.3
github.com/nadoo/ipset v0.4.0
github.com/xtaci/kcp-go/v5 v5.6.1
golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9
golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27
)
require (

8
go.sum
View File

@ -104,8 +104,8 @@ golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8 h1:kACShD3qhmr/3rLmg1yXyt+N4HcwutKyPRB93s54TIU=
golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed h1:YoWVYYAfvQ4ddHv3OKmIvX7NCAhFGTj62VP2l2kfBbA=
golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
@ -152,8 +152,8 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201009025420-dfb3f7c4e634/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201101102859-da207088b7d1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210525143221-35b2ab0089ea/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0=
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo=
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=

View File

@ -32,7 +32,10 @@ func NewManager(rules []*rule.Config) (*Manager, error) {
sets := make(map[string]struct{})
for _, r := range rules {
if r.IPSet != "" {
if r.IPSet == "" {
continue
}
if _, ok := sets[r.IPSet]; !ok {
sets[r.IPSet] = struct{}{}
ipset.Create(r.IPSet)
@ -51,7 +54,6 @@ func NewManager(rules []*rule.Config) (*Manager, error) {
addToSet(r.IPSet, cidr)
}
}
}
return m, nil
}

View File

@ -5,17 +5,17 @@ import (
stdlog "log"
)
var verbose = false
var enable = false
// Set sets the logger's verbose mode and output flags.
func Set(v bool, flag int) {
verbose = v
func Set(verbose bool, flag int) {
enable = verbose
stdlog.SetFlags(flag)
}
// F prints debug log.
func F(f string, v ...any) {
if verbose {
if enable {
stdlog.Output(2, fmt.Sprintf(f, v...))
}
}

View File

@ -32,18 +32,15 @@ type Port uint16
// ParseAddr parses the address in string s.
func ParseAddr(s string) (Atyp, Addr, Port, error) {
var atyp Atyp
var addr Addr
host, port, err := net.SplitHostPort(s)
if err != nil {
return 0, nil, 0, err
}
var addr Addr
var atyp Atyp = AtypIP4
if ip, err := netip.ParseAddr(host); err == nil {
if ip.Is4() {
atyp = AtypIP4
} else {
if ip.Is6() {
atyp = AtypIP6
}
addr = ip.AsSlice()

View File

@ -28,18 +28,15 @@ type Port uint16
// ParseAddr parses the address in string s.
func ParseAddr(s string) (Atyp, Addr, Port, error) {
var atyp Atyp
var addr Addr
host, port, err := net.SplitHostPort(s)
if err != nil {
return 0, nil, 0, err
}
var addr Addr
var atyp Atyp = AtypIP4
if ip, err := netip.ParseAddr(host); err == nil {
if ip.Is4() {
atyp = AtypIP4
} else {
if ip.Is6() {
atyp = AtypIP6
}
addr = ip.AsSlice()

View File

@ -25,14 +25,18 @@ type item struct {
// NewPool returns a new dhcp ip pool.
func NewPool(lease time.Duration, start, end netip.Addr) (*Pool, error) {
s, e := ip2num(start), ip2num(end)
if start.IsUnspecified() || end.IsUnspecified() || start.Is6() || end.Is6() {
return nil, errors.New("start ip or end ip is wrong/nil, please check your config, note only ipv4 is supported")
}
s, e := ipv4ToNum(start), ipv4ToNum(end)
if e < s {
return nil, errors.New("start ip larger than end ip")
}
items := make([]*item, 0, e-s+1)
for n := s; n <= e; n++ {
items = append(items, &item{ip: num2ip(n)})
items = append(items, &item{ip: numToIPv4(n)})
}
rand.Seed(time.Now().Unix())
@ -110,12 +114,13 @@ func (p *Pool) ReleaseIP(mac net.HardwareAddr) {
}
}
func ip2num(addr netip.Addr) uint32 {
ip := addr.As4()
func ipv4ToNum(addr netip.Addr) uint32 {
ip := addr.AsSlice()
n := uint32(ip[0])<<24 + uint32(ip[1])<<16
return n + uint32(ip[2])<<8 + uint32(ip[3])
}
func num2ip(n uint32) netip.Addr {
return netip.AddrFrom4([4]byte{byte(n >> 24), byte(n >> 16), byte(n >> 8), byte(n)})
func numToIPv4(n uint32) netip.Addr {
ip := [4]byte{byte(n >> 24), byte(n >> 16), byte(n >> 8), byte(n)}
return netip.AddrFrom4(ip)
}