如何使用 SSH 隧道以编程方式与 Restful API 通信

How to Programmatically communicate with Restful API using SSH tunnelling

我正在使用 .NET 核心框架构建 Restful API 客户端。 APIs 是 OpenStack API,然而,由于网络配置,我无法从我的本地计算机(也是开发计算机)访问 API,我必须通过 ssh 进入一台机器正常访问OpenStack时可以ssh进入OpenStack基础设施。

考虑到这一点,是否可以为 API 端点使用 SSH 隧道,然后在实现的 Web API 客户端中调用它?我曾尝试这样做,但调用端点 returns 错误 401 - 需要内容长度。

基本上可以通过 SSH 隧道调用 Openstack API 端点,而无需任何 public 可访问的 API 端点。因为我没有使用 .NET 核心框架的经验,所以这个答案在没有 C# 代码的情况下真的很通用。希望对你有帮助。

重要提示:您只能使用以下步骤,当您以管理员身份登录到 openstack-deployment 时,您应该只使用!!!使用这种方式,当 openstack-deployment 是测试部署时,破坏部署不会影响其他用户。

1。 SSH 隧道

您可以使用以下命令转发端口:

ssh -L 127.0.0.1:<PORT>:<IP_REMOTE>:<PORT> <USER_JUMPHOST>@<IP_JUMPHOST> -fN

  • <PORT> = 您要远程访问的 Openstack 组件的端口(例如 5000 用于 keystone)
  • <IP_REMOTE> =主机的IP,你的openstack部署在运行ning
  • <USER_JUMPHOST>@<IP_JUMPHOST> = ssh 访问跳转主机,它位于您和您的 openstack 部署之间

必须为每个 openstack 组件完成此操作。如果您不希望在后组中使用此命令,请删除末尾的 -fN

这里首先你要用端口5000转发Keystone。

示例:ssh -L 127.0.0.1:5000:192.168.62.1:5000 deployer@192.168.67.1 -fN

您可以通过本地电脑上的 curl 或网络浏览器测试访问:

curl http://127.0.0.1:5000
{"versions": {"values": [{"id": "v3.13", "status": "stable", "updated": "2019-07-19T00:00:00Z", "links": [{"rel": "self", "href": "http://127.0.0.1:5000/v3/"}], "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}]}]}}

2。更改 openstack-endpoints

为了也能够通过隧道登录 openstack 部署,您还必须更改端点以侦听远程系统上的本地主机,您的 openstack depoyment 是:

  1. 以管理员用户身份正常登录您的 openstack 部署。

  2. 列出所有端点:openstack endpoint list

  3. keystonepublicinternal 端点更改为本地主机:

openstack endpoint set --url http://127.0.0.1:5000 <ID_OF_INTERNAL_KEYSTONE_ENDPOINT>

更改内部端点后,它会暂时破坏远程系统上的 openstack-login,但请不要担心。

  1. 现在你可以在本地电脑上通过openstack-client登录openstack了。在这里你必须授权本地主机。如果您使用 rc 文件登录,则必须将 auth-url 更改为 export OS_AUTH_URL=http://127.0.0.1:5000/v3

  2. 通过 运行ning 在您的本地电脑 openstack endpoint set --url "http://127.0.0.1:8774/v2.1" <ID> 上将 nova 的 internalpublic 端点更改为 运行 通过你的 ssh-tunnel(当然你还需要一个用于端口 8774 的 ssh-tunnel)之类的命令 openstack server list 来做到这一点。

3。针对 openstack-deployment

授权

当您在没有 openstack-client 的情况下发送 HTTP 请求时,您必须从部署中手动请求身份验证令牌:

  1. 在您的 openstack 部署上正常登录

  2. 发出令牌请求:

curl -v -s -X POST "$OS_AUTH_URL/auth/tokens?nocatalog" -H "Content-Type: application/json" -d '{ "auth": { "identity": { "methods": ["password"],"password": {"user": {"domain": {"name": "'"$OS_USER_DOMAIN_NAME"'"},"name": "'"$OS_USERNAME"'", "password": "'"$OS_PASSWORD"'"} } }, "scope": { "project": { "domain": { "name": "'"$OS_PROJECT_DOMAIN_NAME"'" }, "name": "'"$OS_PROJECT_NAME"'" } } }}' --stderr - | grep X-Subject-Token

此命令无需更改即可使用。 Key X-Subject-Token 之后的值是来自 Keystone 的令牌。复制此值并将令牌导出为环境变量 OS_TOKEN。例如像下面的行

export OS_TOKEN=gAAAAABZuj0GZ6g05tKJ0hvihAKXNJgzfoT4TSCgR7cgWaKvIvbD66StJK6cS3FqzR2DosmqofnR_N-HztJXUcVhwF04HQsY9CBqQC7pblGnNIDWCXxnJiCH_jc4W-uMPNA6FBK9TT27vE5q5AIa487GcLLkeJxdchXiDJvw6wHty680eJx3kL4
  1. 使用令牌发出请求。

例如 GET-Requests with curl:

curl -s -X GET -H "X-Auth-Token: $OS_TOKEN" http://127.0.0.1:5000/v3/users | python -m json.tool