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
|
||||
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)
|
||||
|
@ -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
4
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 (
|
||||
|
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-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=
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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...))
|
||||
}
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user