如何 运行 本地 Jupyter,仅使用内部 IP 地址连接到 Google 云虚拟机?

How to run Jupyter, locally, connecting to Google Cloud VM using only internal IP address?

我配置了一个只有内部 IP (10.X.X.10) 的 Compute Engine 实例。我可以通过带有隧道的 IAP 通过 gcloud ssh 进入它,通过私有访问和复制文件存储 Google 访问和 VPC 设置没有冲突的 IP 范围:

gcloud compute ssh --zone "us-central1-c" "vm_name"  --tunnel-through-iap --project "projectXXX"

现在我想在不在虚拟机中创建外部 IP 的情况下打开 Jupyter notebook。

Identity-Aware Proxy (IAP) 运行良好,Private Google Access 也很好。之后我启用了 NAT 网关,生成了一个外部 IP (35.X.X.155).

我通过 运行ning jupyter notebook --generate-config 配置了 Jupyter,设置了密码 "sha"

现在我 运行 Jupyter 通过在 gcloud SSH 上输入这个:

python /usr/local/bin/jupyter-notebook --ip=0.0.0.0 --port=8080 --no-browser &

正在替换:http://instance-XXX/?token=abcd

作者:http://35.X.X.155/?token=abcd

但是外网IP访问不到,浏览器访问不了,http访问不了,https访问也访问不了。请注意,我不考虑使用网络负载平衡,因为没有必要。

Ping 35.X.X.155 完美运行

我也试过了jupyter notebook --gateway-url=http://NAT-gateway:8888 没有成功

将此视为堡垒(具有外部 IP 的 VM)的替代方案

关于如何解决这个问题有什么想法吗?

更新:看来我必须找到一种通过 SSH 进入 NAT 网关的方法。

你想做的事情都可以完成using IAP for TCP forwarding,这种情况下根本不需要使用NAT。以下是要遵循的步骤:

  1. 确保项目防火墙允许端口 22 和 8080:
gcloud compute firewall-rules list
NAME                         NETWORK  DIRECTION  PRIORITY  ALLOW                         DENY  DISABLED
allow-8080-ingress-from-iap  default  INGRESS    1000      tcp:8080                            False
allow-ssh-ingress-from-iap   default  INGRESS    1000      tcp:22                              False
  1. 在您端点的 gcloud CLI 上,登录 GCP 并将项目设置为实例所在的位置 运行:
gcloud config set project $GCP_PROJECT_NAME
  1. 检查您的系统中是否已经生成了 SSH 密钥:
ls -1 ~/.ssh/*

#=>

/. . ./id_rsa
/. . ./id_rsa.pub

如果没有,可以使用以下命令生成它们:ssh-keygen -t rsa -f ~/.ssh/id_rsa -C id_rsa

  1. 将 SSH 密钥添加到项目的元数据中:
gcloud compute project-info add-metadata \
--metadata ssh-keys="$(gcloud compute project-info describe \
--format="value(commonInstanceMetadata.items.filter(key:ssh-keys).firstof(value))")
$(whoami):$(cat ~/.ssh/id_rsa.pub)"

#=>

Updated [https://www.googleapis.com/compute/v1/projects/$GCP_PROJECT_NAME].
  1. iap.tunnelResourceAccessor 角色分配给用户:
gcloud projects add-iam-policy-binding $GCP_PROJECT_NAME \
    --member=user:$USER_ID \
    --role=roles/iap.tunnelResourceAccessor
  1. 启动指向您的 instance:port 的 IAP 隧道并将其绑定到您想要的本地主机端口(在本例中为 9000):
gcloud compute start-iap-tunnel $INSTANCE_NAME 8080 \
    --local-host-port=localhost:9000

Testing if tunnel connection works.
Listening on port [9000].

此时,您应该可以在 http://127.0.0.1:9000?token=abcd 中访问您的 Jupyter Notebook。

注意:start-iap-tunnel 命令不是 one-time 运行 命令,每次要访问 Jupyter Notebook 实现时都应发出并保留 运行。