当前位置: 首页 > news >正文

【服务器】端口映射


文章目录

  • 1.端口映射的概念
    • 1.1 端口映射的类型
    • 1.2 端口映射的应用场景
    • 1.3 示例
  • 2.为什么要进行端口映射呢?
  • 3.原理
    • 3.1【大白话】原理解释
    • 3.2 原理图
  • 4.代码


1.端口映射的概念

端口映射(Port Mapping),也称为端口转发(Port Forwarding),是一种将一个网络端口的数据流重定向到另一个网络端口的技术。这通常用于在防火墙或路由器后面运行的服务,使外部设备可以访问内部网络中的特定服务。端口映射可以在本地网络中进行,也可以跨网络进行,通过SSH等协议实现。

1.1 端口映射的类型

  1. 本地端口映射(Local Port Forwarding)

    • 将本地计算机的某个端口映射到远程服务器的某个端口。
    • 示例:将本地端口8080映射到远程服务器的80端口,从而可以在本地通过localhost:8080访问远程服务器的Web服务。
  2. 远程端口映射(Remote Port Forwarding)

    • 将远程服务器的某个端口映射到本地计算机的某个端口。
    • 示例:将远程服务器的2222端口映射到本地计算机的22端口,从而可以通过远程服务器访问本地计算机的SSH服务。
  3. 动态端口映射(Dynamic Port Forwarding)

    • 创建一个SOCKS代理,通过它可以动态地访问多个远程服务器的端口。
    • 示例:创建一个SOCKS代理,允许浏览器通过该代理访问多个远程服务器的网站。

1.2 端口映射的应用场景

  1. 远程访问内部服务:通过端口映射,可以从外部网络访问公司内部或家庭网络中的特定服务,例如Web服务器、数据库服务器等。

  2. 穿透防火墙:通过端口映射,可以绕过防火墙的限制,访问被防火墙阻止的服务。

  3. 提高安全性:通过SSH隧道进行端口映射,可以加密数据传输,提高安全性。

  4. 负载均衡和代理:负载均衡器和代理服务器常常使用端口映射技术来分发和转发流量,提高服务的可靠性和性能。

1.3 示例

假设有一个运行在远程服务器上的Web服务,它监听的端口是80。为了从本地计算机访问这个服务,可以使用以下SSH命令创建一个本地端口映射:

ssh -L 8080:localhost:80 user@remote-server

这条命令将本地计算机的8080端口映射到远程服务器的80端口。现在,在本地浏览器中访问http://localhost:8080,就相当于访问远程服务器的Web服务。

2.为什么要进行端口映射呢?

在开发过程中,进行端口映射(或端口转发)有几个主要原因:

  1. 访问受保护的服务:开发机上的某些服务可能仅监听在本地主机(127.0.0.1)上,无法直接从外部访问。通过端口映射,可以将这些服务暴露出来,使其可以从外部访问。

  2. 安全性:通过SSH隧道进行端口转发,可以在不直接暴露服务的情况下,安全地访问内部服务。SSH隧道会加密数据传输,增加了安全性。

  3. 方便调试:在开发过程中,开发者可能需要访问运行在开发机上的多个服务。通过端口映射,可以直接从本地访问这些服务,而无需在每次访问时都登录到开发机上。

  4. 绕过防火墙或网络限制:在某些网络环境中,可能存在防火墙或网络限制,阻止直接访问开发机上的服务。通过SSH隧道,可以绕过这些限制,实现对服务的访问。

  5. 多用户访问:如果多个开发者需要访问同一个服务,通过端口映射可以让每个开发者在自己的本地环境中访问该服务,而无需直接登录到开发机。

举个例子:

假设你在开发机上运行了一个Jupyter Notebook服务器,它监听的端口是7860,但只允许本地访问。通过以下SSH命令,可以将开发机的7860端口映射到你本地的7860端口:

ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no

这样,你可以在本地浏览器中访问 http://127.0.0.1:7860 来查看和使用开发机上的Jupyter Notebook服务器。

3.原理

3.1【大白话】原理解释

开发机有自己的暴露端口公网IP,可以用于我们在本地进行ssh连接

但是在开发机也就是服务器中运行程序时,其程序是在服务器的某个端口上运行的

所以我们在本地想要看到该程序在服务器上的运行效果,就要建立端口映射,在浏览器打开本地端口时,转发到服务器的端口进行查看

3.2 原理图

在这里插入图片描述

4.代码

ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L {本地机器_PORT}:127.0.0.1:{开发机_PORT} -o StrictHostKeyChecking=no

例如:

ssh -p 37367 root@ssh.intern-ai.org.cn -CNg -L 7860:127.0.0.1:7860 -o StrictHostKeyChecking=no

这条命令用于创建一个SSH隧道。下面是每个部分的详细解释:

  • ssh: 用于启动SSH连接的命令。
  • -p 37367: 指定要连接的远程主机的端口号(在这个例子中是37367端口)。
  • root@ssh.intern-ai.org.cn: 用户名(root)和主机名(ssh.intern-ai.org.cn)。
  • -CNg: 选项的组合:
    • -C: 启用压缩。
    • -N: 告诉SSH不执行远程命令,只进行端口转发。
    • -g: 允许远程主机连接到转发的端口。
  • -L 7860:127.0.0.1:7860: 进行本地端口转发,将本地机器的7860端口映射到远程主机的127.0.0.1的7860端口。
  • -o StrictHostKeyChecking=no: 禁用主机密钥检查,这样可以防止首次连接时出现交互提示。

总结来说,这条命令会在本地机器和远程主机之间创建一个SSH隧道,将本地的7860端口转发到远程主机的7860端口,并且不会执行远程命令或检查主机密钥。

如下图所示:
在进行端口映射之后,显示的是在服务器的7860端口上运行的程序
在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【贪心算法题记录】134. 加油站
  • Spring AOP 实现原理
  • Java学习笔记整理: 关于设计模式:单例模式 2024/7/10;
  • 一节课说明一类奥数题系列——约数与倍数
  • 综合实验作业
  • ubuntu重装系统后,安装cuda,cudnn
  • 连接与隔离:Facebook在全球化背景下的影响力
  • 帕金森是怎么回事
  • 嵌入式工程师从0开始,到底该学什么,怎么学?
  • 生产英特尔CPU处理器繁忙的一天
  • 【第二章】开发模型和测试模型
  • (自用)gtest单元测试
  • Python爬虫-数据解析(先爬取整张页面再提取局部数据)
  • 在Ubuntu下安装samba实现和Windows系统文件共享
  • 第100+15步 ChatGPT学习:R实现Ababoost分类
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • Android单元测试 - 几个重要问题
  • IndexedDB
  • iOS | NSProxy
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • learning koa2.x
  • Linux下的乱码问题
  • node 版本过低
  • Vue--数据传输
  • 笨办法学C 练习34:动态数组
  • 动态魔术使用DBMS_SQL
  • 二维平面内的碰撞检测【一】
  • 给Prometheus造假数据的方法
  • 工作中总结前端开发流程--vue项目
  • 后端_ThinkPHP5
  • 机器学习学习笔记一
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 使用API自动生成工具优化前端工作流
  • 网络应用优化——时延与带宽
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 消息队列系列二(IOT中消息队列的应用)
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (回溯) LeetCode 131. 分割回文串
  • (七)c52学习之旅-中断
  • (原)Matlab的svmtrain和svmclassify
  • (转载)深入super,看Python如何解决钻石继承难题
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .md即markdown文件的基本常用编写语法
  • .NET 表达式计算:Expression Evaluator