在客户端访问远程Linux服务器的私有IP地址的URL

文章目录

  • 环境
  • 背景
  • SSH tunnel和正向/反向代理
  • 步骤
    • 第一步
    • 第二步
    • 效果
    • 考一考
  • 其它
    • 多次跳转
    • 另一种方法:正向代理
  • 参考

环境

  • 服务器:Ubuntu 22.04
  • 客户端:Mac 14.2.1

背景

在远程Linux服务器上搭建了minikube环境。minikube提供了dashboard功能,可以在浏览器里以图形化的方式和Kubernetes集群交互。访问的URL为 http://127.0.0.1:45891/xxxxx

注:关于minikube,参见我另一篇文档( https://mp.csdn.net/mp_blog/creation/success/135585639 )。

但是,远程服务器只有命令行,没有图形界面。而且由于网络设置问题,服务器里的服务并没有暴露在公有IP上,在客户端无法直接访问服务器的URL。

client ⇒ (inaccessible) ⇒ server(private IP)

一种解决办法是给远程服务器安装图形界面,然后用VNC或远程桌面连接等工具连接,打开浏览器。通过私有IP访问URL,但是这样会消耗大量资源,而且巨慢无比,点一下鼠标好几秒都没反应。

另一种解决办法是,通过mobaxterm等软件,在客户端打开服务器的浏览器(注意是在客户端显示),和在服务器桌面上打开浏览器的效果一样,同样在浏览器里通过私有IP访问URL。我没有试过,是否需要在服务器安装图形界面。但是同样会消耗大量资源,而且网络也很慢,貌似还有字符集等乱七八糟的问题。此外,mobaxterm貌似只有Windows版,没有Mac版。我没有深入研究,应该也有别的替代工具或者手工方法。

本文介绍的SSH tunnel方法,简单直观,只用几条SSH命令,不需要借助其它工具和命令,就能在客户端浏览器通过访问localhost,达到访问远程服务器URL的效果。

SSH tunnel和正向/反向代理

首先需要了解一下SSH tunnel和正向/反向代理,可参见我另外两篇文档:

  • ssh端口转发实例: https://blog.csdn.net/duke_ding2/article/details/106878081
  • Nginx正向代理与反向代理的简单例子: https://blog.csdn.net/duke_ding2/article/details/107108962

本文使用的是SSH正向tunnel(ssh连接的方向和tunnel的方向是一致的)和反向代理(代理的是服务器,客户端无需知道服务器,只需访问代理)。

创建tunnel的命令为:

ssh -qTfnN -L <source port>:<dest host>:<dest port> <ssh server>

其中:

  • -L :表示local,也就是正向tunnel,tunnel的方向和ssh的方向是一致的。
  • <source port> :tunnel的client端的端口,对于正向tunnel,tunnel的client端就是SSH的client端,所以也就是运行ssh命令的主机的端口。
  • <dest host> :把请求转发到哪个主机,可以是localhost(注意是tunnel的server端),也可以是指定的主机(比如github)。
  • <dest port> :把请求转发到目的主机的哪个端口上。
  • <ssh server> :ssh命令登录的server,对于正向tunnel,ssh的server端就是tunnel的server端。

所以,该命令会把tunnel client端(也就是运行该ssh命令的机器)的 <source port> 的请求转发 <dest host>:<dest> 上。

注意: <dest host> 是从tunnel server端(也就是 <ssh server> )指定的(所以localhost指的是tunnel server端本身),从tunnel server到 <dest host>应该确保是可访问的。

步骤

网络拓扑结构如下:

client ⇒ server (public IP) ⇒ server(private IP)

说白了就是,客户端无法直接访问服务器的私有IP地址,所以通过服务器的公有IP地址转发一下。

所以,需要两步走:

  1. 在服务器上,创建一个tunnel,把公有IP地址特定端口(为了方便,也用45891)的请求转发到私有IP地址的45891端口上。
  2. 在客户端上,创建一个tunnel,把访问本地(localhost)特定端口(为了方便,也用45891)的请求转发到服务器的公有IP地址的45891端口上。

第一步实现了网络拓扑结构里的右边箭头,第二步实现了网络拓扑结构里的左边箭头。

你可能觉得,第二步貌似是多余的,只需要第一步搭建好转发规则,然后在客户端直接访问服务器的公有IP地址不就行了。但是,第二步还是必需的,因为做完第一步之后,在客户端nc服务器的公有IP地址和45891是nc不通的:

➜  ~ nc -zv 9.30.123.105 31578
nc: connectx to 9.30.123.105 port 31578 (tcp) failed: Connection refused

原因我也不太明白,有待研究。总之,需要在客户端本机上再转一道才行。

第一步

首先,在服务器上,创建一个tunnel,把公有IP地址45891端口的请求转发到127.0.0.1的45891端口上:

ssh -qTfnN -L 45891:127.0.0.1:45891 127.0.0.1

注意:该命令里有两个 127.0.0.1

  • 第一个 127.0.0.1 是转发的目的地址,因为在服务器本机上能访问的URL是 http://127.0.0.1:45891/xxxxx ,所以转发的目的地址就是 127.0.0.1 。记住,此处和URL保持一致就对了。
  • 第二个 127.0.0.1 是SSH的登录地址,因为登录的是本机,所以这个地方只要写 127.0.0.1 就行了。

第二步

接下来,在客户端,创建一个tunnel,把localhost的45891端口的请求转发到服务器公有IP地址的45891端口上:

ssh -qTfnN -L 45891:localhost:45891 root@9.30.123.105

注意:该命令里的两个地址:

  • localhost :表示转发地址。前面提到,此处的localhost并不是运行ssh命令的机器的localhost,而是tunnel server端的localhost,本例中,tunnel server端就是ssh的server端,所以,转发的地址是 9.30.123.105
  • 9.30.123.105 :ssh的server端(也就是tunnel的server端)。

效果

现在,在客户端打开浏览器,访问 http://127.0.0.1:45891/xxxxx ,就能访问服务器了:

在这里插入图片描述

考一考

现在,我在服务器 9.30.188.63 上部署了一个应用,并且把它暴露到了 http://192.168.49.2:30633

root@kai0116ubuntu1:~# minikube service hello-node --url
http://192.168.49.2:30633

同时,使用 minikube tunnel 命令,把应用暴露到了 http://10.105.215.100:8080

root@kai0116ubuntu1:~# kubectl get services hello-node
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP      PORT(S)          AGE
hello-node   LoadBalancer   10.105.215.100   10.105.215.100   8080:30633/TCP   7m23s

该如何设置tunnel,以便在客户端通过浏览器访问呢?


答:

  1. 对于 http://192.168.49.2:30633
  • 在服务器:
ssh -qTfnN -L 30633:192.168.49.2:30633 127.0.0.1
  • 在客户端:
ssh -qTfnN -L 30633:localhost:30633 root@9.30.188.63

在客户端打开浏览器,访问 http://localhost:30633 ,如下:

在这里插入图片描述

  1. 对于 http://10.105.215.100:8080
  • 在服务器:
ssh -qTfnN -L 8080:10.105.215.100:8080 127.0.0.1
  • 在客户端:
ssh -qTfnN -L 8080:localhost:8080 root@9.30.188.63

在客户端打开浏览器,访问 http://localhost:8080 ,如下:

在这里插入图片描述

再次说明,在服务器端设置tunnel时,目的地址和能访问的URL里的地址保持一致:

  • 第一个URL里是 192.168.49.2 ,所以就设置为 192.168.49.2
  • 第二个URL里是 10.105.215.100 ,所以就设置为 10.105.215.100

其它

多次跳转

你可能会想,这个问题其实应该去调整服务器的网络设置,把服务暴露在公网IP地址上。这确实有道理,本文只是是一个示例,如果做端口转发。

但是,考虑以下场景:

client ⇒ jump server (public IP) ⇒ internal server(private IP)

服务器在内网里,内网和外界隔离,在外界只能通过jump server跳转,才能访问服务器。

此时SSH tunnel就非常有用了。该模型其实和本文的tunnel模型是完全一样的,只不过在本文的模型里,右侧箭头指向的是服务器本身而已,其实在处理上并无差异。

另一种方法:正向代理

文本介绍的方法,其实是一个“笨办法”,如果服务器暴露了新的端口,或者重启服务导致端口发生变化时,都得重新建立SSH tunnel。

还有一种方法是使用正向代理,说白了就是使用浏览器代理,和通过代理访问google是一样。

第一步:在客户端上建立一个到服务器的动态转发:

ssh -o ExitOnForwardFailure=yes -qTfN -D 6666 root@9.30.188.63

其中,端口可以任意指定。

第二步:把客户端的浏览器的代理设置为 localhost:6666

我使用的是Chrome浏览器和SwitchyOmega插件,设置如下:

在这里插入图片描述

这样,当在浏览器里访问 http://127.0.0.1:39783/xxxxx 的时候,通过代理,也就是 localhost:6666 ,会把请求转发到 9.30.188.63 ,也就是相当于在服务器上访问 http://127.0.0.1:39783/xxxxx ,效果如下:

在这里插入图片描述

注意:默认情况下 127.0.0.1 的访问是不通过代理的,需要显式指定一下。

同理,如果访问 http://192.168.49.2:30633 ,通过代理转发,就相当于在服务器上访问 http://192.168.49.2:30633 ,效果如下:

在这里插入图片描述

如果失败了,检查一下 192.168.49.2 是否设置为通过代理转发了。

同理,如果访问 http://10.105.215.100:8080 ,通过代理转发,就相当于在服务器上访问 http://10.105.215.100:8080 ,效果如下:

在这里插入图片描述

如果失败了,检查一下 10.105.215.100 是否设置为通过代理转发了。

这种方法看起来更简便一些。只需设置一次SSH tunnel,而之前的“笨办法”则需要对不同的端口设置多次。

我之所以没采用这个方法,是因为设置浏览器代理是一个“重量级”操作,而且我的浏览器本身已经设置了其它代理,不想改变。前面的“笨办法”适合于临时的、一次性的设置。大家可根据所遇到的情况以及个人喜好,自行选择。

参考

  • https://blog.csdn.net/duke_ding2/article/details/106878081
  • https://blog.csdn.net/duke_ding2/article/details/107108962

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/633073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT付费创作系统V2.5.8独立版+前端

小狐狸ChatGPT付费创作系统V2.5.8版本最大特点新增PC端绘画功能全新升级。该版本为编译版无开源&#xff0c;本版本同样处理了后台弹窗、暗链网址。单独制作了2.5.5升级至2.5.8数据库升级包及升级文件&#xff0c;直接导入即可使用。本版本升级后唯一BUG后台绘画功能新增的翻译…

Python高效之JIT(Just-in-Time)

Python可能是简洁和表达力的代名词&#xff0c;但有时你渴望一些更强大的东西。这就是即时编译&#xff08;JIT&#xff09;编译器的作用&#xff0c;这是Python世界中的一颗隐藏的明珠&#xff0c;可以显著提升你的代码性能。 JIT是什么&#xff08;Just-in-Time&#xff09;…

酷开科技将AR技术多方应用 打造全能酷开系统

酷开系统AR技术的核心是通过计算机视觉、图形渲染和深度感知等技术&#xff0c;将虚拟物体或信息精确地叠加到现实世界的场景中。通过智能摄像头捕捉真实环境的图像和视频&#xff0c;结合3D渲染技术&#xff0c;生成与现实场景相融合的虚拟图像&#xff0c;实现虚实结合的视觉…

最新ChatGPT/GPT4科研应用与AI绘图及论文高效写作

详情点击链接&#xff1a;最新ChatGPT/GPT4科研应用与AI绘图及论文高效写作 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Clau…

传统意义上编程语言的划分方式--编译型语言,解释型语言

脚本型语言&#xff08;Scripting Languages&#xff09;&#xff1a; 脚本型在运行时由一个解释器逐行解释执行。通常用于自动化任务、编写小型程序或快速开发。典型的脚本语言有Python、Ruby、Perl、JavaScript等。 编译型语言&#xff08;Compiled Languages&#xff09;&am…

编译FFmpeg4.3.1 、x264并移植到Android

1、前言 FFmpeg 既是一款音视频编解码工具&#xff0c;同时也是一组音视频编解码开发套件。 2、准备工作 系统&#xff1a;LinuxNDK&#xff1a;android-ndk-r21b-linux-x86_64.zipFFmpeg&#xff1a;ffmpeg-snapshot.tar.bz2x264&#xff1a;x264 3、下载NDK 在linux环境中…

hanlp,pkuseg,jieba,cutword分词实践

总结&#xff1a;只有jieba,cutword,baidu lac成功将色盲色弱成功分对,这两个库字典应该是最全的 hanlp[持续更新中] https://github.com/hankcs/HanLP/blob/doc-zh/plugins/hanlp_demo/hanlp_demo/zh/tok_stl.ipynb import hanlp # hanlp.pretrained.tok.ALL # 语种见名称最…

RabbitMQ交换机(3)-Topic

1.Topic模式 RabbitMQ的Topic模式是一种基于主题的消息传递模式。它允许发送者向一个特定的主题&#xff08;topic&#xff09;发布消息&#xff0c;同时&#xff0c;订阅者也可以针对自己感兴趣的主题进行订阅。 在Topic模式中&#xff0c; 主题通过一个由单词和点号组成的字…

Git教程学习:07 打标签

文章目录 0 前言1 列出标签2 创建标签3 附注标签4 轻量标签5 后期打标签6 共享标签7 删掉标签8 检查标签 0 前言 像其他版本控制系统&#xff08;VCS&#xff09;一样&#xff0c;Git 可以给仓库历史中的某一个提交打上标签&#xff0c;以示重要。 比较有代表性的是人们会使用…

Unity使用Protobuf

1.下载Protobuf ProtoBuf 2.打开它并且编译 如果有报错下载相应的.net版本即可 这里默认是6.0.100 由于我本机是8.0.100所以我改了这个文件 3.编译后的文件复制到Unity Assets/Plugins下 4.写个测试的proto文件 5.然后使用protoc生成 这里实现了一个简单的bat批量生成 Protos C…

基于遗传算法改进的核极限学习机轴间偏离预测,基于ELM的轴间偏离预测,基于极限学习机的轴故障分类

目录 背影 极限学习机 基于遗传算法改进的极限学习机ELM分类识别 主要参数 MATLAB代码 效果图 结果分析 展望 完整代码下载链接:基于遗传算法改进的核极限学习机轴间偏离预测,基于ELM的轴间偏离预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/downloa…

自动安装解压版mysql8的脚本

由于mysql 8的 MSI 安装包&#xff0c;自动把程序安装到了C盘&#xff0c;且没看到有可以更改安装位置的配置可以修改。 故自行写了一个脚本&#xff0c;用来安装mysql 8的压缩包。可以将 mysql 8 以及其 Data目录 安装到C盘以外的位置。第一次写 bat 脚本&#xff0c;希望各位…

微软与沃达丰签订10年合作,提供Copilot等生成式AI服务

1月16日&#xff0c;微软在官网宣布&#xff0c;与全球最大电信公司之一沃达丰&#xff08;Vodafone&#xff09;签订10年合作协议&#xff0c;将为3亿多企业、消费者提供生成式AI、云和数字服务等。 通过此次合作&#xff0c;沃达丰将利用微软的Copilot等生成式AI来改变客户、…

新版AndroidStudio dependencyResolutionManagement出错

在新版AndroidStudio中想像使用4.2版本或者4.3版本的AndroidStudio来构造项目&#xff1f;那下面这些坑我们就需要来避免了&#xff0c;否则会出各种各样的问题。 一.我们先来看看新旧两个版本的不同。 1.jdk版本的不同 新版默认是jdk17 旧版默认是jdk8 所以在新版AndroidSt…

FlinkAPI开发之状态管理

案例用到的测试数据请参考文章&#xff1a; Flink自定义Source模拟数据流 原文链接&#xff1a;https://blog.csdn.net/m0_52606060/article/details/135436048 Flink中的状态 概述 有状态的算子 状态的分类 托管状态&#xff08;Managed State&#xff09;和原始状态&…

Springcloud:HV000183

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、问题描述 二、原因分析 总结 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、问题描述 HV000183: Unable to initialize javax.el.…

如何用GPT进行数据处理?

详情点击链接&#xff1a;如何用GPT进行数据处理&#xff1f; 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己…

Springboot jar做成Centos中的服务

一.Springboot java打包jar 比如打包文件为 rescue-0.1.jar jar存储路径 /home/server/rescue/rescue-0.1.jar 二.建立服务文件 1.进入系统服务配置路径 /etc/systemd/system 2.建立文件rescue.service 3.编辑文件rescue.service&#xff0c;内容如下 [Unit] Descrip…

线性代数基础【5】特征值和特征向量

第五章 特征值和特征向量 第一节、特征值和特征向量的基本概念 一、特征值和特征向量的理论背景 在一个多项式中,未知数的个数为任意多个,且每一项次数都是2的多项式称为二次型,二次型分为两种类型:即非标准二次型及标准二次型 注意: ①二次型X^T AX为非标准二次型的充分必…

第十五届蓝桥杯单片机组——利用定时器生成PWM波

一、PWM介绍 PWM是脉宽调制(Pulse Width Modulation)的缩写&#xff0c;你可以把它想象成一个迷你的开关&#xff0c;这个开关可以非常非常快地打开和关闭。正如你在开关灯时&#xff0c;灯是全亮或全暗&#xff0c;同样&#xff0c;这个小开关也只有两种状态&#xff1a;全开&…