在客户端访问远程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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM:Scaling Laws for Neural Language Models (上)

论文&#xff1a;https://arxiv.org/pdf/2001.08361.pdf 发表&#xff1a;2020 摘要1&#xff1a;损失与模型大小、数据集大小以及训练所用计算量成比例&#xff0c;其中一些趋势跨越了七个量级以上。 2&#xff1a;网络宽度或深度等其他架构细节在很大范围内影响较小。3&…

mac pro “RESP.app”意外退出 redis desktop manager

文章目录 redis desktop manager下载地址提示程序含有恶意代码“RESP.app”意外退出解决办法&#xff1a;下载python3.10.并安装重新打开RESP如果还是不行&#xff0c;那么需要替换错误路径&#xff08;我的没用&#xff09;外传 最近在研究redis的消息&#xff0c;看到了strea…

mac查看maven版本报错:The JAVA_HOME environment variable is not defined correctly

终端输入mvn -version报错: The JAVA_HOME environment variable is not defined correctly, this environment variable is needed to run this program. Java环境变量的问题,打开bash_profile查看 open ~/.bash_profile export JAVA_8_HOME/Library/Java/JavaVirtualMachine…

Elasticsearch的基本功能和使用

Elasticsearch &#xff0c;简称为 ES&#xff0c;是一款非常强大的开源的高扩展的分布式全文 检索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容,它可以近乎实时的 存储、检索数据.还可以可以实现日志统计、分析、系统监控等功能. 官网:https://www.elastic.c…

Spark---累加器和广播变量

文章目录 1.累加器实现原理2.自定义累加器3.广播变量 1.累加器实现原理 累加器用来把 Executor 端变量信息聚合到 Driver 端。在 Driver 程序中定义的变量&#xff0c;在Executor 端的每个 Task 都会得到这个变量的一份新的副本&#xff0c;每个 task 更新这些副本的值后&…

利用HTML和CSS实现的浮动布局

代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>*{m…

Python武器库开发-武器库篇之Whois信息收集模块化(四十五)

Python武器库开发-武器库篇之Whois信息收集模块化(四十五) 我们在进行渗透的时候&#xff0c;需要进行全面的信息收集&#xff0c;除了主动信息收集之外&#xff0c;我们还经常会进行被动信息收集&#xff0c;Whois信息收集就是其中的一种,我们可以利用一些网站进行Whois信息收…

区间预测 | Matlab实现LSTM-Adaboost-ABKDE的集成学习长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现LSTM-Adaboost-ABKDE的集成学习长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现LSTM-Adaboost-ABKDE的集成学习长短期记忆神经网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一…

Java--HashMap中put()方法是如何实现的

一、什么是HashMap HashMap是Java中常用的数据结构之一&#xff0c;它基于哈希表实现&#xff0c;提供了快速的键值对存取能力。在HashMap中&#xff0c;put方法是最常用的方法之一&#xff0c;用于将键值对存储到HashMap中。本文将深入探究HashMap的put方法的实现原理&#x…

vue 作用域插槽、具名插槽

在子组件中使用了具名插槽<slot name"qwe" :games"games" x"我是x" y"我是y"></slot>&#xff0c; 相应的在父组件中使用<template #qwe"data">的语法来接收插槽内容。 这个语法是ok的&#xff0c; 但…

微信使用wx.getLocation

1&#xff0c;小程序管理后台 -「开发」-「开发管理」-「接口设置」” 中完成权限申请&#xff1b; 2&#xff0c;需在 app.json 中声明其需调用的地理位置相关接口 "permission": {"scope.userLocation": { "desc": "你的位置信息将用于小…

如何在 Python3 中使用变量

介绍 变量是一个重要的编程概念&#xff0c;值得掌握。它们本质上是在程序中用于表示值的符号。 本教程将涵盖一些变量基础知识&#xff0c;以及如何在您创建的 Python 3 程序中最好地使用它们。 理解变量 从技术角度来说&#xff0c;变量是将存储位置分配给与符号名称或标…

M1卡和CPU卡学习

目录介绍 01.整体概述介绍 1.1 项目背景说明1.2 IC智能卡说明1.3 基础概念介绍 02.CPU卡基础学习 2.1 CPU操作流程2.2 读卡器与卡交互指令2.3 APDU指令格式2.4 APDU指令组成2.5 发送指令详细剖析2.6 响应指令详细解析 03.M1卡基础学习 3.1 什么是M1卡3.2 M1卡数据结构3.3 M1扇…

晶振线路匹配需要进哪一些测试

晶振线路匹配的测试对于确保晶振性能的稳定性和可靠性至关重要&#xff0c;那么晶振线路匹配需要进哪一些测试呢? 晶振线路匹配测试是确保晶振性能稳定性和可靠性的关键环节。为了全面评估晶振的性能&#xff0c;需要进行一系列的测试&#xff0c;包括负载电容测试、驱动电平…

HarmonyOS 转场动画

今天 我们来说 组件内转场动画 我们可以先编写代码如下 Entry Component struct Index {State flag:boolean true;build() {Column({space: 30}) {Button("转换").onClick(()> {})Image("https://img1.baidu.com/it/u1699929707,733321099&fm253&…

nxp s32k144芯片使用J-LINK程序刷写

1.nxp s32k144 (1)打开软件&#xff1a;J-Flash V6.30j (2)新建工程&#xff1a;file->new project (3)选择芯片型号和 target interface (4)可以保存芯片和接口配置 (5)打开程序&#xff1a;File->open data file &#xff08;6&#xff09;程序刷写&#xff1a;T…

【UE5】交互式展厅数字博物馆交互是开发实战课程

长久以来&#xff0c;我们总是不断被初学者问到类似这样的问题&#xff1a;如何从头到尾做一个交互式程序开发项目&#xff1f;本套课程尝试对这个问题进行解答。 课程介绍视频如下 【UE5】数字展厅交互式开发全流程 【谁适合学习这门课】 本套课程面向初学者&#xff0c;满足…

【加强版】小学数学出题,加减乘除混合运算,支持自定义数字,一键打印

在线预览&#xff1a;在线HTML代码预览和运行工具 - UU在线工具 复制下面代码后到该地址预览即可 注意&#xff1a;在线预览不能打印。如需打印&#xff0c;在电脑本地上新建文本文档&#xff0c;粘贴代码后保存&#xff0c;然后把文件后缀改为.html运行&#xff0c;出题点击…

【Java JVM】栈帧

执行引擎是 Java 虚拟机核心的组成部分之一。 在《Java虚拟机规范》中制定了 Java 虚拟机字节码执行引擎的概念模型, 这个概念模型成为各大发行商的 Java 虚拟机执行引擎的统一外观 (Facade)。 不同的虚拟机的实现中, 通常会有 解释执行 (通过解释器执行)编译执行 (通过即时编…

rust跟我学二:模块编写与使用

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info中模块的使用。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:[我的Rust库更新]g…