无法设置到私有 AWS API 网关 API 的 SSH 隧道
Posted
技术标签:
【中文标题】无法设置到私有 AWS API 网关 API 的 SSH 隧道【英文标题】:Failing to set up SSH tunnel to private AWS API gateway API 【发布时间】:2020-04-12 04:29:31 【问题描述】:我有一个私有 AWS API Gateway REST API,这意味着它只能在我的 VPC 中访问。 我有一个在 VPC 中运行的堡垒 SSH 实例,这意味着我可以执行以下操作:
ssh -J ec2-user@<bastion> ec2-user@<ip of EC2 instance within my VPC>
从那个实例中,我可以使用https://<api-id>.execute-api.eu-west-1.amazonaws.com/dev/<my endpoint>
URL curl
我的 API。
现在,为了进行本地测试,我想将此实例隧道传输到本地端口,所以我尝试
ssh -J ec2-user@<bastion> -L 8888:<api-id>.execute-api.eu-west-1.amazonaws.com:443 ec2-user@<ip of EC2 instance within my VPC>
此命令返回正常,但是当我尝试执行 curl localhost:8888/dev/<my endpoint>
时,我首先得到一个证书错误,这是很自然的,但是当我尝试使用 curl -k localhost:8888/dev/<my endpoint>
忽略证书时,我只是得到一个 403 Forbidden 响应AWS。对于这些请求,我的 REST API 访问日志中没有任何内容。
403 是否与我忽略 TLS 证书或其他原因有关? 有可能建立这样的隧道吗? 不幸的是,API 网关 REST API:s 似乎无法使用纯 HTTP,否则我更喜欢这种类型的东西。
【问题讨论】:
您是否有任何与 API 网关关联的 WAF? @Nayeem 不,没有 WAF! 【参考方案1】:API Gateway 要求主机标头与 API 端点 URL 匹配。将主机名添加到您的 /etc/hosts
<api-id>.execute-api.eu-west-1.amazonaws.com 127.0.0.1
然后正常调用curl https://<api-id>.execute-api.eu-west-1.amazonaws.com:8888/dev/<my endpoint>
或使用 curl 的 --resolve
标志
curl \
--resolve <api-id>.execute-api.eu-west-1.amazonaws.com:443:localhost:8888 \
localhost:8888/dev/<my endpoint>
或者,如果您的堡垒配置为允许,您可以使用ssh
作为 SOCKS5 代理并通过堡垒代理您的请求。
在一个 shell 会话中启动代理
ssh -D 8888 ec2-user@<bastion>
然后在另一个 shell 中使用它
export HTTPS_PROXY=socks5://localhost:8888
curl https://<api-id>.execute-api.eu-west-1.amazonaws.com/dev/<my endpoint>
【讨论】:
这听起来很有希望,谢谢。假期后我会试试这个。 后期跟进:resolve 标志对我不起作用,但是使用 /etc/hosts 就像一个魅力。这为我节省了很多痛苦,谢谢! (至于为什么这个问题被否决,我不确定人们是否认为它应该被发布在 Serverfault 上——我不太同意。这与 AWS 中的开发有关。) 最近遇到了完全相同的问题 ---resolve
标志为我工作,通过我们的堡垒主机在两端的端口 443 上打开了一条隧道。然后 curl 命令:curl https://[api-id].execute-api.[region].amazonaws.com/blah --resolve [api-id].execute-api.[region].amazonaws.com:443:127.0.0.1
【参考方案2】:
会对所选答案发表评论,但我没有足够的声誉,所以这对我有用。
通过跳转服务器进行端口转发:
ssh -o ExitOnForwardFailure=yes -f -N \
-L 127.0.0.1:<PORT>:<api-id>.execute-api.<region>.amazonaws.com:443 -p <PORT> <user>@<ip_address>
使用 -k 将主机添加到 curl
curl -H "Host: <api-id>.execute-api.<region>.amazonaws.com" https://127.0.0.1:<PORT>/<my_endpoint> -k
【讨论】:
以上是关于无法设置到私有 AWS API 网关 API 的 SSH 隧道的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 cloudformation 创建私有 AWS Api 网关?
用于微服务的私有子网 ecs 连接上负载均衡器的 AWS API 网关
使用 AWS api 网关 + lambda + Nodejs 的私有和公共 ip