【问题标题】:How to Programmatically communicate with Restful API using SSH tunnelling如何使用 SSH 隧道以编程方式与 Restful API 通信
【发布时间】:2020-11-09 13:10:58
【问题描述】:

我正在使用 .NET 核心框架构建一个 Restful API 客户端。 API 是 OpenStack API,但是,由于网络配置,我无法从本地计算机(也是开发计算机)访问 API,我必须 ssh 到可以 ssh 到 OpenStack 基础架构的机器上才能正常访问 OpenStack。

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

【问题讨论】:

    标签: api asp.net-core openstack ssh-tunnel


    【解决方案1】:

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

    重要提示:您只能使用以下步骤,当您拥有 openstack-deployment 的管理员登录名并且您应该只使用!!!使用这种方式,当 openstack-deployment 是 test-deployment 时,中断部署不会影响其他用户。

    1。 SSH 隧道

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

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

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

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

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

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

    您可以通过本地电脑上的 curl 或 webbrowser 测试访问:

    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 部署,您必须更改端点以监听远程系统上的 localhost,您的 openstack 部署在哪里:

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

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

    3. keystonepublicinternal-endpoint改为localhost:

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

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

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

    2. 通过在本地电脑上运行 openstack endpoint set --url "http://127.0.0.1:8774/v2.1" <ID> 来更改 nova 端点,为 nova 的 internalpublic 端点通过你的 ssh-tunnel 运行像 openstack server list 这样的命令(当然你还需要一个 ssh-tunnel对于端口 8774) 来执行此操作。

    3。对 openstack-deployment 进行授权

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

    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 后面的 Value 是来自 Keystone 的 token。复制此值并将令牌导出为环境变量OS_TOKEN。比如下面这行

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

    例如带有 curl 的 GET 请求:

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

    【讨论】:

    • 非常感谢您的评论。我之前完全按照您在答案第 1 部分中的解释进行了操作,但是,我使用 Putty 进行了操作,因为我使用的是 Windows 7 系统。现在的问题是,我没有 OpenStack 的管理员权限,其他人使用它,所以我无法更改端点。有解决方法吗?我相信我对 API 端点的调用不起作用的原因是我没有实现你在第 2 部分中描述的内容。
    • 嗯,是的,还有另一种解决方案。您可以在本地 PC 上使用端口转发。在 linux 中,它也适用于 sudo iptables -t nat -I OUTPUT --dst <IP_OF_REMOTE> -p tcp --dport <PORT> -j REDIRECT --to-ports <PORT>(抱歉,我不知道如何在 Windows 中做到这一点)。在我的测试中,它与 openstack-client 配合得很好。 <IP_OF_REMOTE> 必须匹配 openstack-deployment 的 IP 地址。这样你就可以强制所有针对部署的请求进入 ssh 隧道。
    • Arrr,这是我的愚蠢错误。仅当您使用 openstack-client 时,才需要第 2 节的重定向/端点内容,因为它通过 openstack-deployment 的端点列表获取请求的地址。当您像第 3 节的步骤一样使用自己的 HTTP 请求调用 API 时,即使没有第 2 节的更改,它也可以工作。抱歉:(
    • 谢谢。我正要给你发消息说我刚刚开始工作了。我不需要执行第 2 步。我想知道为什么它以前不起作用,因为我没有更改我的设置,我只更改了一些代码。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 2022-01-07
    • 2016-10-11
    • 1970-01-01
    • 2020-02-09
    • 2014-12-12
    • 2020-06-21
    相关资源
    最近更新 更多