修改ip分配的错误

This commit is contained in:
bjdgyc 2023-04-21 18:27:49 +08:00
parent 91ce4752f3
commit fed9066f22
5 changed files with 38 additions and 13 deletions

View File

@ -2,6 +2,7 @@ package dbdata
import ( import (
"errors" "errors"
"net"
"time" "time"
) )
@ -25,6 +26,13 @@ func SetIpMap(v *IpMap) error {
return errors.New("IP或MAC错误") 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() v.UpdatedAt = time.Now()
if v.Id > 0 { if v.Id > 0 {
err = Set(v) err = Set(v)

View File

@ -108,7 +108,7 @@ func LinkAuth(w http.ResponseWriter, r *http.Request) {
sess := sessdata.NewSession("") sess := sessdata.NewSession("")
sess.Username = cr.Auth.Username sess.Username = cr.Auth.Username
sess.Group = cr.GroupSelect sess.Group = cr.GroupSelect
sess.MacAddr = strings.ToLower(cr.MacAddressList.MacAddress) oriMac := cr.MacAddressList.MacAddress
sess.UniqueIdGlobal = cr.DeviceId.UniqueIdGlobal sess.UniqueIdGlobal = cr.DeviceId.UniqueIdGlobal
sess.UserAgent = userAgent sess.UserAgent = userAgent
sess.DeviceType = ua.DeviceType sess.DeviceType = ua.DeviceType
@ -116,7 +116,7 @@ func LinkAuth(w http.ResponseWriter, r *http.Request) {
sess.RemoteAddr = r.RemoteAddr sess.RemoteAddr = r.RemoteAddr
// 获取客户端mac地址 // 获取客户端mac地址
sess.UniqueMac = true sess.UniqueMac = true
macHw, err := net.ParseMAC(sess.MacAddr) macHw, err := net.ParseMAC(oriMac)
if err != nil { if err != nil {
var sum [16]byte var sum [16]byte
if sess.UniqueIdGlobal != "" { if sess.UniqueIdGlobal != "" {
@ -130,6 +130,9 @@ func LinkAuth(w http.ResponseWriter, r *http.Request) {
sess.MacAddr = macHw.String() sess.MacAddr = macHw.String()
} }
sess.MacHw = macHw sess.MacHw = macHw
// 统一macAddr的格式
sess.MacAddr = macHw.String()
other := &dbdata.SettingOther{} other := &dbdata.SettingOther{}
_ = dbdata.SettingGet(other) _ = dbdata.SettingGet(other)
rd := RequestData{SessionId: sess.Sid, SessionToken: sess.Sid + "@" + sess.Token, rd := RequestData{SessionId: sess.Sid, SessionToken: sess.Sid + "@" + sess.Token,

View File

@ -13,7 +13,7 @@ func LinkHome(w http.ResponseWriter, r *http.Request) {
// fmt.Println(r.RemoteAddr) // fmt.Println(r.RemoteAddr)
// hu, _ := httputil.DumpRequest(r, true) // hu, _ := httputil.DumpRequest(r, true)
// fmt.Println("DumpHome: ", string(hu)) // fmt.Println("DumpHome: ", string(hu))
w.Header().Set("Server", "AnyLink") w.Header().Set("Server", "AnyLinkOpenSource")
connection := strings.ToLower(r.Header.Get("Connection")) connection := strings.ToLower(r.Header.Get("Connection"))
userAgent := strings.ToLower(r.UserAgent()) userAgent := strings.ToLower(r.UserAgent())
if connection == "close" && (strings.Contains(userAgent, "anyconnect") || strings.Contains(userAgent, "openconnect")) { if connection == "close" && (strings.Contains(userAgent, "anyconnect") || strings.Contains(userAgent, "openconnect")) {

View File

@ -6,6 +6,7 @@ import (
"log" "log"
"net" "net"
"net/http" "net/http"
"net/http/httputil"
"os" "os"
"strings" "strings"
"text/template" "text/template"
@ -34,8 +35,10 @@ func HttpAddHeader(w http.ResponseWriter, key string, value string) {
func LinkTunnel(w http.ResponseWriter, r *http.Request) { func LinkTunnel(w http.ResponseWriter, r *http.Request) {
// TODO 调试信息输出 // TODO 调试信息输出
//hd, _ := httputil.DumpRequest(r, true) if base.GetLogLevel() == base.LogLevelTrace {
//base.Debug("DumpRequest: ", string(hd)) hd, _ := httputil.DumpRequest(r, true)
base.Trace("LinkTunnel: ", string(hd))
}
// 判断session-token的值 // 判断session-token的值
cookie, err := r.Cookie("webvpn") cookie, err := r.Cookie("webvpn")

View File

@ -16,6 +16,8 @@ var (
// ipKeep and ipLease ipAddr => type // ipKeep and ipLease ipAddr => type
// ipLease = map[string]bool{} // ipLease = map[string]bool{}
ipPoolMux sync.Mutex ipPoolMux sync.Mutex
// 记录循环点
loopCurIp uint32
) )
type ipPoolConfig struct { type ipPoolConfig struct {
@ -36,7 +38,19 @@ func initIpPool() {
} }
IpPool.Ipv4IPNet = ipNet IpPool.Ipv4IPNet = ipNet
IpPool.Ipv4Mask = net.IP(ipNet.Mask) 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)) // zero := binary.BigEndian.Uint32(ip.Mask(mask))
@ -44,10 +58,6 @@ func initIpPool() {
// one, _ := ipNet.Mask.Size() // one, _ := ipNet.Mask.Size()
// max := min | uint32(math.Pow(2, float64(32-one))-1) // 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数据 // 获取IpLease数据
// go cronIpLease() // go cronIpLease()
} }
@ -80,6 +90,7 @@ func initIpPool() {
// AcquireIp 获取动态ip // AcquireIp 获取动态ip
func AcquireIp(username, macAddr string, uniqueMac bool) net.IP { func AcquireIp(username, macAddr string, uniqueMac bool) net.IP {
base.Trace("AcquireIp:", username, macAddr, uniqueMac)
ipPoolMux.Lock() ipPoolMux.Lock()
defer ipPoolMux.Unlock() defer ipPoolMux.Unlock()
@ -103,6 +114,7 @@ func AcquireIp(username, macAddr string, uniqueMac bool) net.IP {
} }
// 存在ip记录 // 存在ip记录
base.Trace("uniqueMac:", username, mi)
ipStr := mi.IpAddr ipStr := mi.IpAddr
ip := net.ParseIP(ipStr) ip := net.ParseIP(ipStr)
// 跳过活跃连接 // 跳过活跃连接
@ -120,6 +132,8 @@ func AcquireIp(username, macAddr string, uniqueMac bool) net.IP {
ipActive[ipStr] = true ipActive[ipStr] = true
return ip return ip
} }
// 删除当前macAddr
mi = &dbdata.IpMap{MacAddr: macAddr}
_ = dbdata.Del(mi) _ = dbdata.Del(mi)
} else { } else {
@ -167,9 +181,6 @@ func AcquireIp(username, macAddr string, uniqueMac bool) net.IP {
return loopIp(username, macAddr, uniqueMac) return loopIp(username, macAddr, uniqueMac)
} }
// 记录循环点
var loopCurIp = IpPool.IpLongMin
func loopIp(username, macAddr string, uniqueMac bool) net.IP { func loopIp(username, macAddr string, uniqueMac bool) net.IP {
var ( var (
i uint32 i uint32