我想使用谷歌应用程序引擎向防火墙/路由器/NAT后面的设备发起http流量。这些设备将接收来自GAE的命令。我可以让设备轮询GAE以寻找新消息,但这需要大量流量。或者,我可以尝试永久打开连接,但这是非常昂贵和糟糕的。
设备将没有静态IP地址。然而,他们将定期与谷歌应用程序引擎通信,然后设备可以监听他们刚刚为任何传入通信打开的端口。如果我理解TCP打孔,因为设备已经向GAE发送了流量,他们将分配一个端口,该端口转换为设备正在侦听的端口,相应地,GAE在防火墙中有一个可用的孔。
但是,为了让GAE向设备发送流量,它需要知道设备在其公共IP上分配的端口。问题就在这里,因为GAE不能为传入流量提供源/远程端口。在不知道设备刚刚使用的端口的情况下,我无法向设备发送除http响应消息之外的任何其他消息。我实际上无法向该设备发起http/tcp消息。
那么,有人知道获得GAE传入源/远程端口的方法吗?或者知道启动防火墙后设备流量的另一种方法吗?
TL;DR:你到底是如何获得发送到GAE应用程序的http消息的远程端口的?
由于不赞成使用安全数据连接器,因此最好的选择是部署一个代理传入请求的服务。您有许多选项,如配置防火墙和设置端口转发或apache反向代理。
如果你的内部地址发生了变化,那么这也是处理这个问题的地方。例如,您可以让DHCP服务器触发您的apache反向代理中的配置更改。
对于未来的搜索者来说,要跟进koma的响应,这里是nginx组合反向代理和正向代理的配置,应该可以做到这一点。这些设备在端口80上向其发送所有流量,端口80被反向代理到应用程序引擎。相反,应用程序引擎使用端口8080上的前向代理向防火墙设备发送请求,以便所有GAE流量看起来都来自同一IP。远程ip和远程端口被添加为代理请求的头。
worker_processes 2;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 8080;
location / {
resolver 8.8.8.8;
proxy_pass http://$http_host$uri$is_args$args;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
location / {
proxy_pass http://something.appspot.com;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host something.appspot.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-Port $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}