【问题标题】:Why am I Unable to Access a Google Compute Engine VM?为什么我无法访问 Google Compute Engine 虚拟机?
【发布时间】:2018-08-06 16:15:55
【问题描述】:

我无法使用 Google Cloud SDK (gcloud) 访问 Google Compute Engine (GCE) VM ($GCE_INSTANCE_NAME):

gcloud compute \
--project=$GCP_PROJECT_ID \
ssh \
--zone=$GCE_INSTANCE_ZONE \
$GCE_INSTANCE_NAME

#=>

Permission denied (publickey).
ERROR: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255].

我试过了:

  1. 撤销 SSH 密钥:

    gcloud auth revoke --all
    
  2. gcloud auth login
    
  3. 再次访问$GCE_INSTANCE_NAME:

    gcloud compute \
    --project=$GCP_PROJECT_ID \
    ssh \
    --zone=$GCE_INSTANCE_ZONE \
    $GCE_INSTANCE_NAME
    
    #=>
    
    ERROR: (gcloud.compute.ssh) Could not fetch resource:
     - Required 'compute.instances.get' permission for 'projects
    
    

我可以采取哪些步骤才能成功地将ssh 转换为$GCE_INSTANCE_NAME?

【问题讨论】:

    标签: ssh google-cloud-platform virtual-machine google-compute-engine gcloud


    【解决方案1】:

    使用 gcloud compute 命令行工具检查您的防火墙列表,并确保存在 default-allow-ssh 规则。见troubleshooting-ssh

    gcloud compute firewall-rules list 
    

    如果缺少防火墙规则,添加它

    gcloud compute firewall-rules create default-allow-ssh --allow tcp:22
    

    输出:

    Creating firewall...⠧Created [https://www.googleapis.com/compute/v1/projects/marketstore/global/firewalls/default-allow-ssh].
    Creating firewall...done.
    NAME               NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
    default-allow-ssh  default  INGRESS    1000      tcp:22        False
    

    【讨论】:

      【解决方案2】:

      我遇到了同样的错误('projects 需要 'compute.instances.get' 权限),然后我在 gcloud 命令中使用了项目 ID 而不是项目名称,并且它起作用了。 我为用户分配了“计算实例管理员”角色,我曾经使用 gcloud 登录。此角色包括“compute.instances.get”权限。

      【讨论】:

        【解决方案3】:

        权限被拒绝(公钥)。错误:(gcloud.compute.ssh) [/usr/bin/ssh] 退出并返回代码 [255]。

        此错误似乎与 SSH 密钥或不完整的 Linux 访客环境有关。

        我想知道运行gcloud auth revoke --all的目的是什么

        你能提供以下命令的输出吗?

        1. $ gcloud compute instances describe name-of-your-instance --zone
          zone-the-instance-is-in --project name-of-your-project
        2. $ gcloud compute instances get-serial-port-output name-of-your-instance --zone zone-the-instance-is-in --project name-of-your-project
        3. $ gcloud compute firewall-rules list --project name-of-your-project

        这些命令很有用,因为:

        1. 使用此命令,我们可以检查 ssh 密钥的状态 实例和在实例中启用的范围(连同 其他信息)
        2. 此命令提供来自实例的 serial output log entries,可以帮助解决您遇到的连接问题。请注意,此日志在实例重启后会被擦除,因此不要期望此处有持久日志,但此信息可能对您的情况有用。
        3. 这个命令在你的项目中输出firewall rules;应该有一个默认或策划的防火墙规则,允许端口 22 上的 TCP 入口流量,如果没有(您需要创建一个)。

        您是否在隐身模式下尝试过to SSH from the browser? 有时,浏览器扩展会阻止 SSH 通过浏览器功能正常运行,这就是我推荐隐身模式的原因。


        编辑 为了使这个帖子对社区有用(并且更容易阅读),我在这里总结了一些来自下面的 cmets:

        显示错误:

        无法获取资源:- 'projects//zones//instances/ 需要 'compute.instances.get' 权限

        怎么做:检查用户角色/权限

        $ gcloud beta iam roles list --account your-account-here
        
        > --- description: Full management of App Engine apps (but not storage).
        > etag: AA== name: roles/appengine.appAdmin stage: GA title: App Engine Admin
        > --- description: Ability to view App Engine app status. etag: AA== name: roles/appengine.appViewer stage: GA title: App Engine Viewer
        

        根据上面的输出:用户只有 App Engine 权限(但没有 Compute Engine 中的权限)

        做什么:要求项目所有者添加一个角色,授予用户访问 GCE 实例的权限(Instance Admin Role、Compute Admin Role) 可用角色列表:cloud.google.com/compute/docs/access/iam#instance_admin_role

        所需信息,运行 2 个命令:

        • 为了从实例中检查日志:

          $ gcloud 计算实例 get-serial-port-output name-of-your-instance --zone zone-the-instance-is-in --project name-of-your-project

          SeaBIOS(版本 1.8.2-20180102_145157-google)总 RAM 大小 = 0x000000006cc00000 = 找到 1740 MiB CPU:1 支持的最大 CPU: 256 在 0:3 找到 virtio-scsi virtio-scsi vendor='Google' product='PersistentDisk' rev='1' type=0 可移除=0 virtio-scsi blksize=512 扇区=20971520 = 10240 MiB 驱动器 0x000f2330:PCHS=0/0/0 翻译=lba LCHS=1024/255/63 s=20971520 从硬盘 0 引导... [0.000000] 初始化 cgroup 子系统 cpuset [0.000000] 初始化 cgroup subsys cpu [0.000000] 初始化 cgroup 子系统 cpuacct [0.000000] Linux 版本 3.16.0-0.bpo.4-amd

        • 确认有一个防火墙规则允许端口 22 上的入口流量:

          $ gcloud compute firewall-rules list --project name-of-your-project 名称网络方向优先级允许 默认允许 ssh 默认 INGRESS 65534 tcp:22

        根据上面的输出,允许 SSH 流量的防火墙规则具有优先级 65534。 优先级是从 0 到 65535 的整数,包括 0 到 65535。 较低的优先级值意味着较高的优先级。 换句话说,1 的优先级高于 2。 您可以阅读this document了解更多说明

        更新防火墙规则以设置更高的优先级。 为此,请运行以下命令:

        $ gcloud compute firewall-rules update --priority 1000 default-allow-ssh
        

        问题: 我尝试通过 SSH 连接到实例,但仍然遇到同样的旧错误:ssh: connect to host X.XX.XX.XX port 22: Operation timed out ERROR: (gcloud. compute.ssh) [/usr/bin/ssh] 退出并返回代码 [255]

        检查 ssh 服务 是否在实例中运行。 运行以下命令获取实例的IP:

        $ gcloud compute instances describe [NAME_OF_YOUR_INSTANCE] --format='get(networkInterfaces[0].accessConfigs[0].natIP)' 
        

        安装 netcat => 是一个用于读取/写入网络连接的计算机网络实用程序:

        $ sudo apt-get install netcat
        

        运行以下命令来检查命令的输出:

        $ nc [EXTERNAL_IP] 22 
        > 
        

        问题:运行 nc [EXTERNAL_IP] 22 没有返回任何内容

        检查您的实例中是否启用了 Linux 访客环境。 为此,您应该在 GCE 实例上添加一个启动脚本。 将启动脚本添加到实例:

        1. 点击实例名称
        2. 点击编辑
        3. 转到“自定义元数据”部分
        4. 在“Key”文本字段中添加:startup-script
        5. 在“值”文本字段中添加:#! /bin/bash sudo systemctl list-unit-files | grep google | grep enabled
        6. 保存更改

        More detailed info on startup scripts 也可用。

        然后重新启动实例以允许脚本执行。 验证 Linux 来宾环境脚本是否已安装并正在运行。 为此,请在 GCE 实例的串行日志控制台中检查启动脚本的输出。 您可以查看the expected outputs for the different Operating Systems。

        如果未安装 Linux 来宾环境,请重新安装。 您可以关注this documentation安装LGE。

        【讨论】:

        • 感谢您的来信。以下是命令的结果: 1. 错误:(gcloud.compute.instances.describe) 无法获取资源:- 'projects//zones//instances/' 2. 错误:(gcloud.compute.instances.get-serial-port-output) 无法获取串行端口输出:必需 'projects//zones/ /instances/' 3. 错误:(gcloud.compute.firewall-rules.list) 一些请求未成功:- 'projects/'
        • 您用来运行命令的用户在 GCE 实例中没有权限。您正在使用的用户是项目的所有者吗?
        • 您能否提供此命令的输出以查看您的用户当前拥有的权限是什么? $ gcloud beta iam 角色列表 --account your-account-here
        • --- 描述:App Engine 应用的完全管理(但不是存储)。 etag:AA== 名称:roles/appengine.appAdmin 阶段:GA 标题:App Engine Admin --- 描述:能够查看 App Engine 应用程序状态。 etag:AA== 名称:roles/appengine.appViewer 阶段:GA 标题:App Engine Viewer ---
        • 我运行了这个命令: gcloud compute --project project-name ssh --zone name-zone name-of-instance 结果如下: ssh: connect to host XX.XXX.XXX port 22 : 操作超时错误: (gcloud.compute.ssh) [/usr/bin/ssh] exited with return code [255].
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-18
        • 2015-03-19
        • 2018-12-27
        • 2020-09-13
        • 2017-01-05
        • 2020-11-07
        • 2014-10-25
        相关资源
        最近更新 更多