v2.6.6
v2.6.6
This commit is contained in:
parent
805610421a
commit
7d68f8cccc
69
web/web.go
69
web/web.go
@ -42,6 +42,9 @@ var i18nFS embed.FS
|
|||||||
|
|
||||||
var startTime = time.Now()
|
var startTime = time.Now()
|
||||||
|
|
||||||
|
// 预定义 IPv4 私网和回环网段
|
||||||
|
var privateIPv4Nets []*net.IPNet
|
||||||
|
|
||||||
type wrapAssetsFS struct {
|
type wrapAssetsFS struct {
|
||||||
embed.FS
|
embed.FS
|
||||||
}
|
}
|
||||||
@ -331,6 +334,12 @@ func (s *Server) Start() (err error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if certFile == "" || keyFile == "" {
|
||||||
|
// 如果没有证书,强制检查 listen 是否内部 IP,否则回退到本地
|
||||||
|
if !isInternalIP(listen) {
|
||||||
|
listen = fallbackToLocalhost(listen)
|
||||||
|
}
|
||||||
|
}
|
||||||
listenAddr := net.JoinHostPort(listen, strconv.Itoa(port))
|
listenAddr := net.JoinHostPort(listen, strconv.Itoa(port))
|
||||||
listener, err := net.Listen("tcp", listenAddr)
|
listener, err := net.Listen("tcp", listenAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -400,3 +409,63 @@ func (s *Server) GetCtx() context.Context {
|
|||||||
func (s *Server) GetCron() *cron.Cron {
|
func (s *Server) GetCron() *cron.Cron {
|
||||||
return s.cron
|
return s.cron
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// isInternalIP 判断是否为私网或回环IP(支持IPv4和IPv6)
|
||||||
|
func isInternalIP(ipStr string) bool {
|
||||||
|
ip := net.ParseIP(ipStr)
|
||||||
|
if ip == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if ip4 := ip.To4(); ip4 != nil {
|
||||||
|
// IPv4 判断是否在私网/回环网段内
|
||||||
|
for _, privateNet := range privateIPv4Nets {
|
||||||
|
if privateNet.Contains(ip4) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// IPv6 判断回环或链路本地地址
|
||||||
|
if ip.IsLoopback() || ip.IsLinkLocalUnicast() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// 判断 IPv6 fc00::/7 私网地址段
|
||||||
|
if ip[0]&0xfe == 0xfc {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// fallbackToLocalhost 根据传入地址返回对应的本地回环地址
|
||||||
|
func fallbackToLocalhost(listen string) string {
|
||||||
|
ip := net.ParseIP(listen)
|
||||||
|
if ip == nil {
|
||||||
|
// 无法解析则默认回退 IPv4 回环
|
||||||
|
return "127.0.0.1"
|
||||||
|
}
|
||||||
|
if ip.To4() != nil {
|
||||||
|
// IPv4 回退 IPv4 回环
|
||||||
|
return "127.0.0.1"
|
||||||
|
}
|
||||||
|
// IPv6 回退 IPv6 回环
|
||||||
|
return "::1"
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
for _, cidr := range []string{
|
||||||
|
"10.0.0.0/8", // A类私网
|
||||||
|
"172.16.0.0/12", // B类私网
|
||||||
|
"192.168.0.0/16", // C类私网
|
||||||
|
"100.64.0.0/10", // CGNAT地址段
|
||||||
|
"127.0.0.0/8", // 回环
|
||||||
|
} {
|
||||||
|
_, netw, err := net.ParseCIDR(cidr)
|
||||||
|
if err == nil {
|
||||||
|
privateIPv4Nets = append(privateIPv4Nets, netw)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user