如何使用 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 是:
以管理员用户身份正常登录您的 openstack 部署。
列出所有端点:openstack endpoint list
将 keystone
的 public
和 internal
端点更改为本地主机:
openstack endpoint set --url http://127.0.0.1:5000 <ID_OF_INTERNAL_KEYSTONE_ENDPOINT>
更改内部端点后,它会暂时破坏远程系统上的 openstack-login,但请不要担心。
现在你可以在本地电脑上通过openstack-client登录openstack了。在这里你必须授权本地主机。如果您使用 rc 文件登录,则必须将 auth-url 更改为 export OS_AUTH_URL=http://127.0.0.1:5000/v3
通过 运行ning 在您的本地电脑 openstack endpoint set --url "http://127.0.0.1:8774/v2.1" <ID>
上将 nova 的 internal
和 public
端点更改为 运行 通过你的 ssh-tunnel(当然你还需要一个用于端口 8774 的 ssh-tunnel)之类的命令 openstack server list
来做到这一点。
3。针对 openstack-deployment
授权
当您在没有 openstack-client 的情况下发送 HTTP 请求时,您必须从部署中手动请求身份验证令牌:
在您的 openstack 部署上正常登录
发出令牌请求:
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
- 使用令牌发出请求。
例如 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
我正在使用 .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 是:
以管理员用户身份正常登录您的 openstack 部署。
列出所有端点:
openstack endpoint list
将
keystone
的public
和internal
端点更改为本地主机:
openstack endpoint set --url http://127.0.0.1:5000 <ID_OF_INTERNAL_KEYSTONE_ENDPOINT>
更改内部端点后,它会暂时破坏远程系统上的 openstack-login,但请不要担心。
现在你可以在本地电脑上通过openstack-client登录openstack了。在这里你必须授权本地主机。如果您使用 rc 文件登录,则必须将 auth-url 更改为
export OS_AUTH_URL=http://127.0.0.1:5000/v3
通过 运行ning 在您的本地电脑
openstack endpoint set --url "http://127.0.0.1:8774/v2.1" <ID>
上将 nova 的internal
和public
端点更改为 运行 通过你的 ssh-tunnel(当然你还需要一个用于端口 8774 的 ssh-tunnel)之类的命令openstack server list
来做到这一点。
3。针对 openstack-deployment
授权当您在没有 openstack-client 的情况下发送 HTTP 请求时,您必须从部署中手动请求身份验证令牌:
在您的 openstack 部署上正常登录
发出令牌请求:
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
- 使用令牌发出请求。
例如 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