From f2eb638b9179b2d0c3312abd45d97500f5180350 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Sat, 29 Jan 2022 21:10:09 +0800 Subject: [PATCH] chore: optimize dhcpd and dns and more --- dns/client.go | 11 ++++++----- dns/message.go | 8 ++++---- go.mod | 4 ++-- go.sum | 8 ++++---- ipset/ipset_linux.go | 36 +++++++++++++++++++----------------- pkg/log/log.go | 8 ++++---- proxy/vless/addr.go | 9 +++------ proxy/vmess/addr.go | 9 +++------ service/dhcpd/pool.go | 17 +++++++++++------ 9 files changed, 56 insertions(+), 54 deletions(-) diff --git a/dns/client.go b/dns/client.go index 85383da..32cbda4 100644 --- a/dns/client.go +++ b/dns/client.go @@ -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 { - for _, h := range c.handlers { - h(resp.Question.QNAME, answer.IP) - } - if answer.IP != "" { - ips = append(ips, answer.IP) + if answer.IP.IsValid() { + ip := answer.IP.String() + for _, h := range c.handlers { + h(resp.Question.QNAME, ip) + } + ips = append(ips, ip) } if answer.TTL != 0 { ttl = int(answer.TTL) diff --git a/dns/message.go b/dns/message.go index b1b0907..88b1485 100644 --- a/dns/message.go +++ b/dns/message.go @@ -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) diff --git a/go.mod b/go.mod index 8311f24..90c17c6 100644 --- a/go.mod +++ b/go.mod @@ -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 ( diff --git a/go.sum b/go.sum index 191ada2..854d5aa 100644 --- a/go.sum +++ b/go.sum @@ -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= diff --git a/ipset/ipset_linux.go b/ipset/ipset_linux.go index fed4902..894fed2 100644 --- a/ipset/ipset_linux.go +++ b/ipset/ipset_linux.go @@ -32,24 +32,26 @@ func NewManager(rules []*rule.Config) (*Manager, error) { sets := make(map[string]struct{}) for _, r := range rules { - if r.IPSet != "" { - if _, ok := sets[r.IPSet]; !ok { - sets[r.IPSet] = struct{}{} - ipset.Create(r.IPSet) - ipset.Flush(r.IPSet) - ipset.Create(r.IPSet+"6", ipset.OptIPv6()) - ipset.Flush(r.IPSet + "6") - } + if r.IPSet == "" { + continue + } - for _, domain := range r.Domain { - m.domainSet.Store(domain, r.IPSet) - } - for _, ip := range r.IP { - addToSet(r.IPSet, ip) - } - for _, cidr := range r.CIDR { - addToSet(r.IPSet, cidr) - } + if _, ok := sets[r.IPSet]; !ok { + sets[r.IPSet] = struct{}{} + ipset.Create(r.IPSet) + ipset.Flush(r.IPSet) + ipset.Create(r.IPSet+"6", ipset.OptIPv6()) + ipset.Flush(r.IPSet + "6") + } + + for _, domain := range r.Domain { + m.domainSet.Store(domain, r.IPSet) + } + for _, ip := range r.IP { + addToSet(r.IPSet, ip) + } + for _, cidr := range r.CIDR { + addToSet(r.IPSet, cidr) } } diff --git a/pkg/log/log.go b/pkg/log/log.go index 65536f4..a5cd879 100644 --- a/pkg/log/log.go +++ b/pkg/log/log.go @@ -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...)) } } diff --git a/proxy/vless/addr.go b/proxy/vless/addr.go index 525d5d1..2a5471d 100644 --- a/proxy/vless/addr.go +++ b/proxy/vless/addr.go @@ -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() diff --git a/proxy/vmess/addr.go b/proxy/vmess/addr.go index 02ed7a0..6985e79 100644 --- a/proxy/vmess/addr.go +++ b/proxy/vmess/addr.go @@ -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() diff --git a/service/dhcpd/pool.go b/service/dhcpd/pool.go index 7d3bfd7..50240f8 100644 --- a/service/dhcpd/pool.go +++ b/service/dhcpd/pool.go @@ -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) }