使用SSH连接不能通过公网访问的机器

众所周知,如果给定一个公网IP,我们只需要接入互联网即可访问;那么如果我想访问不处于公网、且不在同一局域网下的机器,可以做到吗?可能直觉告诉我们,不行。但是这里想说的是,可以,且只需要一条ssh命令即可。场景通俗点描述为:A不能访问B,但是A能连接到外网,并且B也能访问外网,即A、B可以同时连接上公

众所周知,如果给定一个公网IP,我们只需要接入互联网即可访问;那么如果我想访问不处于公网、且不在同一局域网下的机器,可以做到吗?可能直觉告诉我们,不行。但是这里想说的是,可以,且只需要一条ssh命令即可

场景

在这里插入图片描述

通俗点描述为:A不能访问B,但是A能连接到外网,并且B也能访问外网,即A、B可以同时连接上公网主机。

认识ssh的端口转发

对于这个命令,我们用的最多的可能就是用它来连服务器,然后看服务器的log。对于此文章相关的主题,我相信,知道ssh可以实现的并不多。在这里分享这部分内容的同时,也将自己的理解记录下来。

远程端口转发

既然A能连通公网主机,那么A肯定能与公网主机建立ssh连接。所以我们可以先在B上运行下面的命令,命令的意思为,在ec2-ip.ap-northeast-1.compute.amazonaws.com上以ubuntu身份登录,然后将2222端口的数据,转发到B,然后B再将数据转发到localhost:22。其中这个localhost:22的意思为是,localhost的22端口,当然这个localhost可以为127.0.0.1,也可以为任何B可以访问到的ip,至于这个22端口,可以更具需要,改变成相应的端口也是没问题的。

ssh -R 2222:localhost:22 [email protected] -Nf

然后我们在A上,连接上公网主机,如下:

在这里插入图片描述

然后再执行:

ssh -p 2222 feiyu@localhost

这句命令是在公网主机上执行的,所以localhost也就是公网主机本身,而2222端口,就是上一条命令中的2222端口,因为公网主机的2222端口,会把数据都转发到B的22端口上去。而这个feiyu就是B机器上的某个用户。

整个流程即如上所示。

本地端口转发

如果A想访问C,但是不能访问,此时B可以访问C并且A能访问B,即条件如下: A->B B->C 此时A应当也能连通到C。好像传递性啊。然后这条命令就是ssh -L。详细如下:

ssh -L 2121:C:21 B

就是A指定SSH绑定本地端口2121,然后指定B将所有的数据,转发到目标主机C的21端口。

隧道的维持

SSH 连接是会超时关闭的,如果连接关闭,隧道无法维持。这里推荐一个小工具,叫做autossh,官网的链接为:http://www.harding.motd.ca/autossh/。其编译比较简单,跟着逛网的教程做即可,过程如下:

在这里插入图片描述

至于使用,参考

# 其中 -M 参数指定的端口用来监听隧道的状态,与端口转发无关。
autossh -p 22 -M 6777 -NR 6766:127.0.0.1:22 [email protected]
# 之后你可以在A上通过6766 端口访问B 了:
ssh -p 6766 [email protected]

参考资料: http://www.ruanyifeng.com/blog/2011/12/ssh_port_forwarding.htmlhttps://blog.csdn.net/lidongshengajz/article/details/73482908https://www.cnblogs.com/keerya/p/7612715.html

Read more

Volcano 与 Kubernetes GPU 调度学习笔记

本笔记系统整理 Volcano 调度器、Kubernetes 调度框架、GPU Device Plugin、HAMi 等云原生 AI 调度领域的核心知识,适合用于学习、复习和工程实践参考。 目录 * 第一部分:Volcano 入门 * 1. Volcano 是什么 * 2. 安装与快速使用 * 3. 核心特性一览 * 第二部分:Volcano 整体架构 * 4. Volcano 解决的核心问题 * 5. 整体架构与数据流 * 6. 三层抽象模型 * 第三部分:Volcano 核心实现原理 * 7. Session 机制 * 8. Gang Scheduling 实现 * 9. Queue 与 DRF 公平调度

容器镜像(4):镜像的常用工具箱

容器镜像(4):镜像的常用工具箱

前几篇在讲多架构镜像时已经用过 skopeo 和 crane 做镜像复制,这篇系统整理这两个工具的完整能力,同时介绍几个日常操作镜像时同样好用的工具。 一、skopeo:不依赖 Daemon 的镜像瑞士军刀 skopeo 的核心价值是绕过 Docker daemon,直接与 Registry API 交互。上一篇用它做镜像复制和离线传输,但它的能力远不止于此。 1.1 安装 # Ubuntu / Debian sudo apt install -y skopeo skopeo --version # skopeo version 1.15.1 1.2 inspect:免拉取检查镜像元数据 docker inspect 需要先把镜像拉到本地,skopeo inspect 直接向 Registry

容器镜像(3):多架构镜像构建

容器镜像(3):多架构镜像构建

一、什么是多架构镜像 1.1 OCI Image Index 上一篇介绍了单平台镜像的结构:一个 Manifest 指向 Config 和若干 Layer blob。多架构镜像在此之上多了一层——OCI Image Index(也叫 Manifest List),是一个轻量的索引文件,把多个单平台 Manifest 组织在一起: $ docker manifest inspect golang:1.22-alpine { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.index.v1+json", "manifests&

容器镜像(2):containerd 视角下的镜像

容器镜像(2):containerd 视角下的镜像

一、为什么需要了解 containerd 如果你只用 docker run 跑容器,从来不关心底层,那可以不了解 containerd。但如果你在用 Kubernetes,或者想真正理解"容器运行时"是什么,containerd 是绕不开的。 事实上,当你执行 docker run 的时候,containerd 早就在后台悄悄工作了——Docker 从 1.11 版本开始,就把核心运行时剥离出来交给 containerd 负责。 1.1 Docker 的架构演变 早期的 Docker(1.10 及之前)是一个"大一统"的单体程序:一个 dockerd