如何为App Engine API配置防火墙,仅允许指定网站与IP访问
解决App Engine Flex API的IP与网站访问限制问题
我完全懂你的需求——既要锁定特定IP访问,又要让指定网站能调用API,还不想用密钥认证(毕竟前端公开的话密钥太容易泄露了)。下面分两步给你落地解决方案:
一、配置IP地址防火墙
这部分你已经查过相关文档,我直接给你实操步骤:
- 用gcloud命令添加允许特定IP的规则(优先级要设得比默认规则高,确保先匹配):
gcloud app firewall-rules create 100 --action allow --source-range 1.2.3.4 --description "Allow trusted IP" - 再把默认规则设为拒绝所有未被允许的IP:
嫌命令行麻烦的话,也可以直接去Google Cloud控制台的App Engine -> 防火墙页面手动配置,可视化操作更直观。gcloud app firewall-rules update default --action deny
二、限制仅允许foo.com发起请求
防火墙没法直接校验请求来源的网站,这一步得在你的API代码里做Referer请求头校验:
- 核心逻辑:每次请求进来时,检查
Referer头的值是否属于foo.com(包括它的子域名,比如www.foo.com)。 - 给你写个Go语言的示例(毕竟你看的是Go相关文档):
func apiHandler(w http.ResponseWriter, r *http.Request) { referer := r.Referer() // 定义允许的域名列表 allowedDomains := []string{"foo.com", "www.foo.com"} isDomainAllowed := false for _, domain := range allowedDomains { if strings.Contains(referer, domain) { isDomainAllowed = true break } } // 同时兼容IP校验:要么是指定IP,要么是允许的域名来源 clientIP := strings.Split(r.RemoteAddr, ":")[0] // 提取IP部分,去掉端口 if !isDomainAllowed && clientIP != "1.2.3.4" { w.WriteHeader(http.StatusForbidden) fmt.Fprintf(w, "Access denied: unauthorized source") return } // 正常处理API请求逻辑 fmt.Fprintf(w, "Request processed successfully") } - 注意点:
Referer头可能被部分浏览器或代理禁用,如果你的API是给特定前端用的,可以提前和前端团队确认浏览器设置,或者给这种情况留个IP兜底的口子。- 虽然
Referer存在被伪造的可能,但对于前端公开的场景,这是成本最低且有效的限制方式,比密钥更适合公开环境。
三、双重保障
把IP防火墙和代码里的Referer校验结合起来,就能同时满足你的两个需求:指定IP直接放行,其他请求只有来自foo.com的才允许访问。
内容的提问来源于stack exchange,提问作者user147529
相关产品推荐
相关产品推荐

