如何实现GCP Compute Engine转发请求至内网API并作为本地代理?
解决GCE实例代理访问内网API的步骤与排错
我帮你梳理下解决思路,咱们一步步来搞定这个代理访问的问题~首先得确保基础连通性没问题,再选适合开发阶段的代理方案,最后排查常见坑点。
第一步:先确认GCE实例能自己访问内网API
代理的前提是GCE实例本身能通内网API,不然本地怎么转都没用。你先登录到Debian 10的GCE实例:
gcloud compute ssh [你的GCE实例名称] --zone [实例所在区域]
然后用curl或者ping测试内网API的连通性:
# 替换成你的内网API地址和端口 curl http://192.168.1.100:8080 # 或者ping内网IP ping 192.168.1.100
如果这里不通,先搞定VPN和路由问题:
- 去GCP控制台检查Cloud VPN隧道状态,确保是"已建立"状态,并且路由已经正确同步到GCE所在的VPC
- 确认GCE实例所在的子网有指向内网API网段的路由条目
- 检查内网API那边的防火墙,是否允许GCE实例的私有IP访问
第二步:选适合开发阶段的代理方案
方案一:SSH本地端口转发(快速临时用)
这个方案不用在GCE上装任何额外软件,适合开发时临时测试,非常方便。在你的本地电脑终端执行:
# 格式:gcloud compute ssh 实例名 --zone 区域 -- -L 本地端口:内网API地址:API端口 gcloud compute ssh my-dev-vm --zone us-central1-a -- -L 8080:192.168.1.100:8080
执行完之后,你本地访问http://localhost:8080,流量就会通过SSH隧道转发到GCE实例,再转到内网API了。
如果你的GCE实例有固定公网IP,也可以直接用普通SSH命令:
ssh -L 8080:192.168.1.100:8080 your-username@[GCE公网IP]
方案二:Nginx反向代理(长期稳定用)
如果需要多个同事一起用,或者长期保留代理服务,可以装Nginx做反向代理:
- 在GCE实例上安装Nginx:
sudo apt update && sudo apt install nginx -y
- 创建代理配置文件,比如
/etc/nginx/sites-available/api-proxy:
server { listen 80; # 可以改成你想要的端口,比如8080 server_name _; # 如果GCE有域名可以填这里,没有就用_ location / { # 替换成你的内网API地址和端口 proxy_pass http://192.168.1.100:8080; # 传递请求头给内网API proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
- 启用这个配置并重启Nginx:
sudo ln -s /etc/nginx/sites-available/api-proxy /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl restart nginx
- 开放GCE防火墙:去GCP控制台给VPC加一条防火墙规则,允许你的本地公网IP访问GCE的80端口(或者你设置的代理端口),别直接开0.0.0.0/0,不安全。
之后你本地直接访问http://[GCE公网IP]:80就能访问内网API了。
第三步:常见问题排错
- 端口转发没反应?
- 检查GCE实例的防火墙,是否允许对应的端口(SSH的22端口,或者Nginx的80端口)
- 再确认内网API的防火墙,是否放行了GCE的私有IP
- 在GCE上用
netstat -tulpn看看端口有没有被监听(比如Nginx的80端口)
- SSH隧道经常断连?
- 加几个参数保持连接:
ssh -L ... -o ServerAliveInterval=60 -o ServerAliveCountMax=3
- 加几个参数保持连接:
- 内网域名解析不了?
- 在GCE上用
nslookup [内网域名]测试,如果解析失败,要么在VPC配置私有DNS,要么在GCE的/etc/resolv.conf里添加内网DNS服务器
- 在GCE上用
额外小技巧
- 给GCE实例分配静态公网IP,避免重启后IP变了还要改配置
- 如果需要HTTPS访问,可以用Let's Encrypt给Nginx装免费SSL证书
- 要是想让所有本地流量都走GCE代理(不止API),可以用SOCKS5代理:
ssh -D 1080 your-username@[GCE公网IP],然后在浏览器或系统设置里把SOCKS代理设为localhost:1080
内容的提问来源于stack exchange,提问作者Alejandro Barone
相关产品推荐
相关产品推荐

