golang_正则表达式_匹配局域网

做一个微服务,需要对http头域里的remoteip做访问限制:所有局域网都要鉴权,其中一些特殊ip,如网关地址,直接拒绝,防止公网访问。正则表达式很好的解决了这个,直接贴代码,读者拿来直接改改就能用了。

核心正则:

10.*.*.*
10\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])

172.16.*.* - 172.31.*.*
172\.((1[6-9])|(2[0-9])|(3[0-1]))\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])

192.168.*.*
192\.168\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])

  

golang的代码也很简单了,如下:

func IPAddrAcl(ip string) (RetStr string){
	//本地环回地址属于白名单,允许访问
	if match0, _ := regexp.MatchString(`127\.0\.0\.1`, ip); match0 {
		RetStr = "white"
		return
	}
	//局域网地址:10.*.*.*需要鉴权,其中网关地址10.10.30.1,直接拒绝
	if match2, _ := regexp.MatchString(`10\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])`, ip); match2 {
		if match3, _ := regexp.MatchString(`10\.10\.30\.1`, ip); match3 {
			RetStr = "black"
			return
		}
		RetStr = "auth"
		return
	}
	//局域网地址:172.16.*.* - 172.31.*.* 需要鉴权
	if match4, _ := regexp.MatchString(`172\.((1[6-9])|(2[0-9])|(3[0-1]))\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])`, ip); match4 {
		RetStr = "auth"
		return
	}
	//局域网地址:192.168.*.* 需要鉴权
	if match5, _ := regexp.MatchString(
		`192\.168\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|[0-1]?[0-9]?[0-9])`, ip); match5 {
		RetStr = "auth"
		return
	}
    //其余地址或非法字符串或入参为空,均为非法,直接拒绝。如果对上层调用者不信任,这里可以再细化区别处理。
	RetStr = "black"
	return RetStr
}

  

  

猜你喜欢

转载自www.cnblogs.com/brave-xin/p/9277181.html