【问题标题】:Can I use Azure Bastion to tunnel into my CosmosDB?我可以使用 Azure Bastion 隧道进入我的 CosmosDB 吗?
【发布时间】:2023-01-09 07:25:05
【问题描述】:

我正在尝试通过 Azure Bastion 连接到我的 Mongo CosmosDB 实例。我们的 IT 部门会阻止所有不在端口 443 上的出站流量,因此为了让我能够访问任何内容,我必须先通过端口 443 进行隧道传输。

我有一些看起来像这样的脚本:

  COSMOS_ID=$(az cosmosdb list --resource-group $RES_NAME | jq -r '.[] | .id')
  az network bastion tunnel \
    --resource-group $RES_NAME \
    --name $RES_NAME \
    --target-resource-id $COSMOS_ID \
    --resource-port 10255 \
    --port 10255 \
    --debug

发出此输出:

Opening tunnel on port: 10255
Tunnel is ready, connect on port 10255
Ctrl + C to close

然后我使用 mongo compass 和在 azure 门户中找到的连接字符串,将 cosmosdb 主机名替换为 localhost,尝试连接后立即在终端中看到此错误,隧道进程退出:

Exception in thread Thread-1 (_start_tunnel):
Traceback (most recent call last):
  File "/usr/local/Cellar/python@3.10/3.10.4/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 1009, in _bootstrap_inner
    self.run()
  File "/usr/local/Cellar/python@3.10/3.10.4/Frameworks/Python.framework/Versions/3.10/lib/python3.10/threading.py", line 946, in run
    self._target(*self._args, **self._kwargs)
  File "/usr/local/Cellar/azure-cli/2.37.0/libexec/lib/python3.10/site-packages/azure/cli/command_modules/network/custom.py", line 8482, in _start_tunnel
    tunnel_server.start_server()
  File "/usr/local/Cellar/azure-cli/2.37.0/libexec/lib/python3.10/site-packages/azure/cli/command_modules/network/tunnel.py", line 184, in start_server
    self._listen()
  File "/usr/local/Cellar/azure-cli/2.37.0/libexec/lib/python3.10/site-packages/azure/cli/command_modules/network/tunnel.py", line 117, in _listen
    auth_token = self._get_auth_token()
  File "/usr/local/Cellar/azure-cli/2.37.0/libexec/lib/python3.10/site-packages/azure/cli/command_modules/network/tunnel.py", line 104, in _get_auth_token
    raise exp
msrestazure.azure_exceptions.CloudError: Unexpected internal error

如果我启用调试日志记录,我会得到很多输出,但这些是异常发生前的最后 3 行:

urllib3.connectionpool: Starting new HTTPS connection (1): bst-210816cd-d967-41ee-8f90-31ee6af4574d.bastion.azure.com:443
urllib3.connectionpool: https://bst-210816cd-d967-41ee-8f90-31ee6af4574d.bastion.azure.com:443 "POST /api/tokens HTTP/1.1" 500 None
msrest.exceptions: Unexpected internal error

我已将堡垒子网添加到 cosmosdb 的防火墙,并将端口添加到 NSG……我想。我遇到的问题只是不知道我是否配置错误或者是否完全不支持。

我应该能够直接隧道到宇宙吗?如果不是,那为什么不呢,或者还有哪些其他解决方案可供我连接到通过端口 443 隧道连接的 cosmos?

【问题讨论】:

  • 我没有看到这方面的提及,但是您是否也向该 cosmosDB 添加了一个私有端点?可能值得研究?我没有使用 Azure Bastion 的经验,但如果我在此处阅读的内容:learn.microsoft.com/en-us/azure/bastion/connect-ip-address 是正确的,那么几乎任何可从部署堡垒的 VNET 访问的内容都可以使用。也许连接 IP 而不是 ID 效果更好?不幸的是,500 错误并没有多大帮助。
  • 它给我一个错误,说“AzureBastionSubnet 受到限制,不能与专用端点一起使用”。

标签: azure azure-cosmosdb-mongoapi azure-bastion


【解决方案1】:

答案是否定的,你不能。它仅适用于虚拟机。

我想出的解决方案是创建一个 VM,在其上运行 sockd,使用 bastion 建立端口转发,然后配置您的本地客户端使用 socks5 代理到本地主机。

【讨论】:

    【解决方案2】:

    当我在搜索具有相同问题的解决方案时发现这个问题,并且经过一些摆弄之后,答案是,是的,你可以!

    它进行了一些试验,但它适用于 2 个隧道。通过另一个更复杂的 ssh 客户端连接到堡垒主机(它也是一个 VM),启用到自身的 ssh 隧道连接,然后使用这个 ssh 客户端“铺设”到数据库的隧道:

    • 您需要堡垒主机上的 ssh 功能,如果您可以通过az network bastion ssh 连接,您应该已经具备该功能
    • 也许将您的 pub ssh-key 放入 ~/.ssh/authorized_keys(具有通常的受限目录和文件权限)以启用 pwd less 身份验证
    • 登录方式:

    az network bastion tunnel --name $the_bastion_host_name --resource-group $your_resource_group --target-resource-id /subscriptions/$your_subscription_id/resourceGroups/$the_resource_group_name/providers/Microsoft.Compute/virtualMachines/$the_jumphost_resource_name --resource-port "22" --port "2222"

    • 根据您的设置、订阅和资源名称替换变量
    • 最后一个命令应该连接到你的堡垒/跳转主机,并打开一个隧道@port 2222@localhost 以通过另一个 ssh 客户端连接!
    • 保持这个运行/打开
    • 准备好您的 (cosmos) 数据库连接字符串(来自 azure 门户)
    • 通过标准 ssh 客户端登录(或使用 putty 或类似工具进行调整):

    ssh -L 20255:$your_db_name.mongo.cosmos.azure.com:10255 -p 2222 the_bastion_host_account_name@localhost

    • 所以我们通过 ssh 在本地主机的端口 2222 上连接(实际上是通过之前的命令在堡垒主机上的 sshd)与我们的堡垒主机用户名(+凭据)并打开本地端口20255由堡垒主机 ssh 隧道连接到 (cosmos) 数据库实例端口10255在远程 vnet 中
    • 可以通过更改 -L 后的第一个端口来使用其他本地端口,但在下一步中调整连接字符串
    • 根据您的数据库名称/主机和端口进行调整(默认为 10255)
    • (再次)准备好数据库连接字符串
    • 现在使用您的本地客户端连接到: mongodb://azure_dbname:leaveTheBase64CodedCredentialsfromAzurePortalHere==@localhost:10255/?ssl=true&replicaSet=globaldb&retrywrites=false&maxIdleTimeMS=120000&appName=@db_app_name_from_azure_portal@
    • 在 nosql-booster 中,我不得不取消选择副本集并使用“单一服务器”,即使在 azure 门户数据库连接字符串中使用“replicaSet=global”也是如此。但是在使用副本集设置时连接启动失败并出现一些协议错误

    【讨论】:

      猜你喜欢
      • 2022-12-11
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-19
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      • 2019-12-13
      相关资源
      最近更新 更多