Golang 绑定mac和ip地址,限制服务器

Python023

Golang 绑定mac和ip地址,限制服务器,第1张

实际业务:go 二进制文件在私有化部署中,需要对客户的服务器mac和ip进行绑定,系统只能运行在绑定的服务器上。把mac和ip地址配置到config中。

运行效果:系统可正常编译,正常访问,在用户Auth接口进行核对。

//检验Mac和内网IP,测试环境不做校验

func (c *CommonBase)CheckMacAndIp()error {

ipCfg :=g.Cfg().GetString("machine.Ipaddr")

macCfg :=g.Cfg().GetString("machine.Macip")

if ipCfg =="127.0.0.1" {

return nil

}

macArray,_ :=gipv4.GetMacArray()

if len(macArray) ==0 {

return gerror.New("mac地址获取失败")

}

if garray.NewStrArrayFrom(macArray).Contains(macCfg) ==false {

return gerror.New("示授权的应用MAC,请联系")

}

ipArray,_ :=gipv4.GetIpArray()

ipIntranetArray,_ :=gipv4.GetIntranetIpArray()

if len(ipArray) ==0 &&len(ipIntranetArray) ==0 {

return gerror.New("ip地址获取失败")

}

if garray.NewStrArrayFrom(ipArray).Merge(ipIntranetArray).Contains(ipCfg) ==false {

return gerror.New("示授权的应用IP,请联系")

}

return nil

}

项目使用GoFrame框架1.6。考虑到客户可能会对内存数据做分析破解,可以把mac和ip地址做AES加密。

获取本机ip的方法:

//获取ip

func externalIP() (net.IP, error) {

ifaces, err := net.Interfaces()

if err != nil {

return nil, err

}

for _, iface := range ifaces {

if iface.Flags&net.FlagUp == 0 {

continue // interface down

}

if iface.Flags&net.FlagLoopback != 0 {

continue // loopback interface

}

addrs, err := iface.Addrs()

if err != nil {

return nil, err

}

for _, addr := range addrs {

ip := getIpFromAddr(addr)

if ip == nil {

continue

}

return ip, nil

}

}

return nil, errors.New("connected to the network?")

}

//获取ip

func getIpFromAddr(addr net.Addr) net.IP {

var ip net.IP

switch v := addr.(type) {

case *net.IPNet:

ip = v.IP

case *net.IPAddr:

ip = v.IP

}

if ip == nil || ip.IsLoopback() {

return nil

}

ip = ip.To4()

if ip == nil {

return nil // not an ipv4 address

}

return ip

}

调用:

func main() {

ip, err := externalIP()

if err != nil {

fmt.Println(err)

}

fmt.Printf(ip.String())

}

结果:

导致获取出来的IP可能不一定是想要的。需要通过判断net.FlagUp标志进行确... 才能调用stop接口,不然有几率崩溃,asio的关闭流程的线程安全性,貌似需要使...

#include #include #pragma comment(lib,"ws2_32.lib") // 静态库 void findIP(char *ip, int size) { WORD v = MAKEWORD(1, 1)WSADATA wsaDataWSAStartup(v, &wsaData)// 加载套接字库 struct hostent *phostinfo = gethostbyname("")c...