mirror of
https://github.com/nadoo/glider.git
synced 2025-02-23 01:15:41 +08:00
chore: optimize dhcpd and dns and more
This commit is contained in:
parent
7e7c7553cc
commit
f2eb638b91
@ -138,11 +138,12 @@ func (c *Client) extractAnswer(resp *Message) ([]string, int) {
|
|||||||
ttl := c.config.MinTTL
|
ttl := c.config.MinTTL
|
||||||
for _, answer := range resp.Answers {
|
for _, answer := range resp.Answers {
|
||||||
if answer.TYPE == QTypeA || answer.TYPE == QTypeAAAA {
|
if answer.TYPE == QTypeA || answer.TYPE == QTypeAAAA {
|
||||||
for _, h := range c.handlers {
|
if answer.IP.IsValid() {
|
||||||
h(resp.Question.QNAME, answer.IP)
|
ip := answer.IP.String()
|
||||||
}
|
for _, h := range c.handlers {
|
||||||
if answer.IP != "" {
|
h(resp.Question.QNAME, ip)
|
||||||
ips = append(ips, answer.IP)
|
}
|
||||||
|
ips = append(ips, ip)
|
||||||
}
|
}
|
||||||
if answer.TTL != 0 {
|
if answer.TTL != 0 {
|
||||||
ttl = int(answer.TTL)
|
ttl = int(answer.TTL)
|
||||||
|
@ -6,7 +6,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net"
|
"net/netip"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -360,7 +360,7 @@ type RR struct {
|
|||||||
RDLENGTH uint16
|
RDLENGTH uint16
|
||||||
RDATA []byte
|
RDATA []byte
|
||||||
|
|
||||||
IP string
|
IP netip.Addr
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewRR returns a new dns rr.
|
// 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)]
|
rr.RDATA = p[n+10 : n+10+int(rr.RDLENGTH)]
|
||||||
|
|
||||||
if rr.TYPE == QTypeA {
|
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 {
|
} 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)
|
n = n + 10 + int(rr.RDLENGTH)
|
||||||
|
4
go.mod
4
go.mod
@ -11,8 +11,8 @@ require (
|
|||||||
github.com/nadoo/conflag v0.2.3
|
github.com/nadoo/conflag v0.2.3
|
||||||
github.com/nadoo/ipset v0.4.0
|
github.com/nadoo/ipset v0.4.0
|
||||||
github.com/xtaci/kcp-go/v5 v5.6.1
|
github.com/xtaci/kcp-go/v5 v5.6.1
|
||||||
golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8
|
golang.org/x/crypto v0.0.0-20220128200615-198e4374d7ed
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9
|
golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
8
go.sum
8
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-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-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-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-20220128200615-198e4374d7ed h1:YoWVYYAfvQ4ddHv3OKmIvX7NCAhFGTj62VP2l2kfBbA=
|
||||||
golang.org/x/crypto v0.0.0-20220126234351-aa10faf2a1f8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
|
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/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-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
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-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-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-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-20220128215802-99c3d69c2c27 h1:XDXtA5hveEEV8JB2l7nhMTp3t3cHp9ZpwcdjqyEWLlo=
|
||||||
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
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/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.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
|
@ -32,24 +32,26 @@ func NewManager(rules []*rule.Config) (*Manager, error) {
|
|||||||
sets := make(map[string]struct{})
|
sets := make(map[string]struct{})
|
||||||
|
|
||||||
for _, r := range rules {
|
for _, r := range rules {
|
||||||
if r.IPSet != "" {
|
if r.IPSet == "" {
|
||||||
if _, ok := sets[r.IPSet]; !ok {
|
continue
|
||||||
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 {
|
if _, ok := sets[r.IPSet]; !ok {
|
||||||
m.domainSet.Store(domain, r.IPSet)
|
sets[r.IPSet] = struct{}{}
|
||||||
}
|
ipset.Create(r.IPSet)
|
||||||
for _, ip := range r.IP {
|
ipset.Flush(r.IPSet)
|
||||||
addToSet(r.IPSet, ip)
|
ipset.Create(r.IPSet+"6", ipset.OptIPv6())
|
||||||
}
|
ipset.Flush(r.IPSet + "6")
|
||||||
for _, cidr := range r.CIDR {
|
}
|
||||||
addToSet(r.IPSet, cidr)
|
|
||||||
}
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,17 +5,17 @@ import (
|
|||||||
stdlog "log"
|
stdlog "log"
|
||||||
)
|
)
|
||||||
|
|
||||||
var verbose = false
|
var enable = false
|
||||||
|
|
||||||
// Set sets the logger's verbose mode and output flags.
|
// Set sets the logger's verbose mode and output flags.
|
||||||
func Set(v bool, flag int) {
|
func Set(verbose bool, flag int) {
|
||||||
verbose = v
|
enable = verbose
|
||||||
stdlog.SetFlags(flag)
|
stdlog.SetFlags(flag)
|
||||||
}
|
}
|
||||||
|
|
||||||
// F prints debug log.
|
// F prints debug log.
|
||||||
func F(f string, v ...any) {
|
func F(f string, v ...any) {
|
||||||
if verbose {
|
if enable {
|
||||||
stdlog.Output(2, fmt.Sprintf(f, v...))
|
stdlog.Output(2, fmt.Sprintf(f, v...))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -32,18 +32,15 @@ type Port uint16
|
|||||||
|
|
||||||
// ParseAddr parses the address in string s.
|
// ParseAddr parses the address in string s.
|
||||||
func ParseAddr(s string) (Atyp, Addr, Port, error) {
|
func ParseAddr(s string) (Atyp, Addr, Port, error) {
|
||||||
var atyp Atyp
|
|
||||||
var addr Addr
|
|
||||||
|
|
||||||
host, port, err := net.SplitHostPort(s)
|
host, port, err := net.SplitHostPort(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, nil, 0, err
|
return 0, nil, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var addr Addr
|
||||||
|
var atyp Atyp = AtypIP4
|
||||||
if ip, err := netip.ParseAddr(host); err == nil {
|
if ip, err := netip.ParseAddr(host); err == nil {
|
||||||
if ip.Is4() {
|
if ip.Is6() {
|
||||||
atyp = AtypIP4
|
|
||||||
} else {
|
|
||||||
atyp = AtypIP6
|
atyp = AtypIP6
|
||||||
}
|
}
|
||||||
addr = ip.AsSlice()
|
addr = ip.AsSlice()
|
||||||
|
@ -28,18 +28,15 @@ type Port uint16
|
|||||||
|
|
||||||
// ParseAddr parses the address in string s.
|
// ParseAddr parses the address in string s.
|
||||||
func ParseAddr(s string) (Atyp, Addr, Port, error) {
|
func ParseAddr(s string) (Atyp, Addr, Port, error) {
|
||||||
var atyp Atyp
|
|
||||||
var addr Addr
|
|
||||||
|
|
||||||
host, port, err := net.SplitHostPort(s)
|
host, port, err := net.SplitHostPort(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, nil, 0, err
|
return 0, nil, 0, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var addr Addr
|
||||||
|
var atyp Atyp = AtypIP4
|
||||||
if ip, err := netip.ParseAddr(host); err == nil {
|
if ip, err := netip.ParseAddr(host); err == nil {
|
||||||
if ip.Is4() {
|
if ip.Is6() {
|
||||||
atyp = AtypIP4
|
|
||||||
} else {
|
|
||||||
atyp = AtypIP6
|
atyp = AtypIP6
|
||||||
}
|
}
|
||||||
addr = ip.AsSlice()
|
addr = ip.AsSlice()
|
||||||
|
@ -25,14 +25,18 @@ type item struct {
|
|||||||
|
|
||||||
// NewPool returns a new dhcp ip pool.
|
// NewPool returns a new dhcp ip pool.
|
||||||
func NewPool(lease time.Duration, start, end netip.Addr) (*Pool, error) {
|
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 {
|
if e < s {
|
||||||
return nil, errors.New("start ip larger than end ip")
|
return nil, errors.New("start ip larger than end ip")
|
||||||
}
|
}
|
||||||
|
|
||||||
items := make([]*item, 0, e-s+1)
|
items := make([]*item, 0, e-s+1)
|
||||||
for n := s; n <= e; n++ {
|
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())
|
rand.Seed(time.Now().Unix())
|
||||||
|
|
||||||
@ -110,12 +114,13 @@ func (p *Pool) ReleaseIP(mac net.HardwareAddr) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ip2num(addr netip.Addr) uint32 {
|
func ipv4ToNum(addr netip.Addr) uint32 {
|
||||||
ip := addr.As4()
|
ip := addr.AsSlice()
|
||||||
n := uint32(ip[0])<<24 + uint32(ip[1])<<16
|
n := uint32(ip[0])<<24 + uint32(ip[1])<<16
|
||||||
return n + uint32(ip[2])<<8 + uint32(ip[3])
|
return n + uint32(ip[2])<<8 + uint32(ip[3])
|
||||||
}
|
}
|
||||||
|
|
||||||
func num2ip(n uint32) netip.Addr {
|
func numToIPv4(n uint32) netip.Addr {
|
||||||
return netip.AddrFrom4([4]byte{byte(n >> 24), byte(n >> 16), byte(n >> 8), byte(n)})
|
ip := [4]byte{byte(n >> 24), byte(n >> 16), byte(n >> 8), byte(n)}
|
||||||
|
return netip.AddrFrom4(ip)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user