From fed9066f22b8eb4058d034633aa1420b656de19e Mon Sep 17 00:00:00 2001 From: bjdgyc Date: Fri, 21 Apr 2023 18:27:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9ip=E5=88=86=E9=85=8D=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/dbdata/ip_map.go | 8 ++++++++ server/handler/link_auth.go | 7 +++++-- server/handler/link_home.go | 2 +- server/handler/link_tunnel.go | 7 +++++-- server/sessdata/ip_pool.go | 27 +++++++++++++++++++-------- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/server/dbdata/ip_map.go b/server/dbdata/ip_map.go index 106902a..e9474dc 100644 --- a/server/dbdata/ip_map.go +++ b/server/dbdata/ip_map.go @@ -2,6 +2,7 @@ package dbdata import ( "errors" + "net" "time" ) @@ -25,6 +26,13 @@ func SetIpMap(v *IpMap) error { return errors.New("IP或MAC错误") } + macHw, err := net.ParseMAC(v.MacAddr) + if err != nil { + return errors.New("MAC错误") + } + // 统一macAddr的格式 + v.MacAddr = macHw.String() + v.UpdatedAt = time.Now() if v.Id > 0 { err = Set(v) diff --git a/server/handler/link_auth.go b/server/handler/link_auth.go index d5e2fba..2e9bf8f 100644 --- a/server/handler/link_auth.go +++ b/server/handler/link_auth.go @@ -108,7 +108,7 @@ func LinkAuth(w http.ResponseWriter, r *http.Request) { sess := sessdata.NewSession("") sess.Username = cr.Auth.Username sess.Group = cr.GroupSelect - sess.MacAddr = strings.ToLower(cr.MacAddressList.MacAddress) + oriMac := cr.MacAddressList.MacAddress sess.UniqueIdGlobal = cr.DeviceId.UniqueIdGlobal sess.UserAgent = userAgent sess.DeviceType = ua.DeviceType @@ -116,7 +116,7 @@ func LinkAuth(w http.ResponseWriter, r *http.Request) { sess.RemoteAddr = r.RemoteAddr // 获取客户端mac地址 sess.UniqueMac = true - macHw, err := net.ParseMAC(sess.MacAddr) + macHw, err := net.ParseMAC(oriMac) if err != nil { var sum [16]byte if sess.UniqueIdGlobal != "" { @@ -130,6 +130,9 @@ func LinkAuth(w http.ResponseWriter, r *http.Request) { sess.MacAddr = macHw.String() } sess.MacHw = macHw + // 统一macAddr的格式 + sess.MacAddr = macHw.String() + other := &dbdata.SettingOther{} _ = dbdata.SettingGet(other) rd := RequestData{SessionId: sess.Sid, SessionToken: sess.Sid + "@" + sess.Token, diff --git a/server/handler/link_home.go b/server/handler/link_home.go index 5bab6f6..a2dc30b 100644 --- a/server/handler/link_home.go +++ b/server/handler/link_home.go @@ -13,7 +13,7 @@ func LinkHome(w http.ResponseWriter, r *http.Request) { // fmt.Println(r.RemoteAddr) // hu, _ := httputil.DumpRequest(r, true) // fmt.Println("DumpHome: ", string(hu)) - w.Header().Set("Server", "AnyLink") + w.Header().Set("Server", "AnyLinkOpenSource") connection := strings.ToLower(r.Header.Get("Connection")) userAgent := strings.ToLower(r.UserAgent()) if connection == "close" && (strings.Contains(userAgent, "anyconnect") || strings.Contains(userAgent, "openconnect")) { diff --git a/server/handler/link_tunnel.go b/server/handler/link_tunnel.go index c004081..4550854 100644 --- a/server/handler/link_tunnel.go +++ b/server/handler/link_tunnel.go @@ -6,6 +6,7 @@ import ( "log" "net" "net/http" + "net/http/httputil" "os" "strings" "text/template" @@ -34,8 +35,10 @@ func HttpAddHeader(w http.ResponseWriter, key string, value string) { func LinkTunnel(w http.ResponseWriter, r *http.Request) { // TODO 调试信息输出 - //hd, _ := httputil.DumpRequest(r, true) - //base.Debug("DumpRequest: ", string(hd)) + if base.GetLogLevel() == base.LogLevelTrace { + hd, _ := httputil.DumpRequest(r, true) + base.Trace("LinkTunnel: ", string(hd)) + } // 判断session-token的值 cookie, err := r.Cookie("webvpn") diff --git a/server/sessdata/ip_pool.go b/server/sessdata/ip_pool.go index ec71e90..63140dd 100644 --- a/server/sessdata/ip_pool.go +++ b/server/sessdata/ip_pool.go @@ -16,6 +16,8 @@ var ( // ipKeep and ipLease ipAddr => type // ipLease = map[string]bool{} ipPoolMux sync.Mutex + // 记录循环点 + loopCurIp uint32 ) type ipPoolConfig struct { @@ -36,7 +38,19 @@ func initIpPool() { } IpPool.Ipv4IPNet = ipNet IpPool.Ipv4Mask = net.IP(ipNet.Mask) - IpPool.Ipv4Gateway = net.ParseIP(base.Cfg.Ipv4Gateway) + + ipv4Gateway := net.ParseIP(base.Cfg.Ipv4Gateway) + ipStart := net.ParseIP(base.Cfg.Ipv4Start) + ipEnd := net.ParseIP(base.Cfg.Ipv4End) + if !ipNet.Contains(ipv4Gateway) || !ipNet.Contains(ipStart) || !ipNet.Contains(ipEnd) { + panic("ip段 设置错误") + } + // ip地址池 + IpPool.Ipv4Gateway = ipv4Gateway + IpPool.IpLongMin = utils.Ip2long(ipStart) + IpPool.IpLongMax = utils.Ip2long(ipEnd) + + loopCurIp = IpPool.IpLongMin // 网络地址零值 // zero := binary.BigEndian.Uint32(ip.Mask(mask)) @@ -44,10 +58,6 @@ func initIpPool() { // one, _ := ipNet.Mask.Size() // max := min | uint32(math.Pow(2, float64(32-one))-1) - // ip地址池 - IpPool.IpLongMin = utils.Ip2long(net.ParseIP(base.Cfg.Ipv4Start)) - IpPool.IpLongMax = utils.Ip2long(net.ParseIP(base.Cfg.Ipv4End)) - // 获取IpLease数据 // go cronIpLease() } @@ -80,6 +90,7 @@ func initIpPool() { // AcquireIp 获取动态ip func AcquireIp(username, macAddr string, uniqueMac bool) net.IP { + base.Trace("AcquireIp:", username, macAddr, uniqueMac) ipPoolMux.Lock() defer ipPoolMux.Unlock() @@ -103,6 +114,7 @@ func AcquireIp(username, macAddr string, uniqueMac bool) net.IP { } // 存在ip记录 + base.Trace("uniqueMac:", username, mi) ipStr := mi.IpAddr ip := net.ParseIP(ipStr) // 跳过活跃连接 @@ -120,6 +132,8 @@ func AcquireIp(username, macAddr string, uniqueMac bool) net.IP { ipActive[ipStr] = true return ip } + // 删除当前macAddr + mi = &dbdata.IpMap{MacAddr: macAddr} _ = dbdata.Del(mi) } else { @@ -167,9 +181,6 @@ func AcquireIp(username, macAddr string, uniqueMac bool) net.IP { return loopIp(username, macAddr, uniqueMac) } -// 记录循环点 -var loopCurIp = IpPool.IpLongMin - func loopIp(username, macAddr string, uniqueMac bool) net.IP { var ( i uint32