【SSH端口转发:实现安全的远程端口映射】

news2025/1/23 4:18:37

SSH端口转发:实现安全的远程端口映射

在网络应用开发和运维过程中,我们经常需要进行端口转发来实现各种网络访问需求。今天我要分享一个使用SSH进行端口转发的实用脚本,并详细讲解其工作原理。

脚本内容

  • 免密
    ssh-copy-id -p 20080 root@xxxx.com
export ssh_local_port=50001
export ssh_remote_port=80
export ssh_cmd="root@xxxx.com -p 20080"
export ssh_process="(autossh|ssh.*$ssh_local_port)"

# 终止已存在的SSH转发进程
ps -ef|grep -E $ssh_process | awk '{print $2}' | xargs kill -9

# 建立SSH端口转发
ssh -fN -L 0.0.0.0:$ssh_local_port:127.0.0.1:$ssh_remote_port \
-o "ServerAliveInterval=60" \
-o "ServerAliveCountMax=3000000" \
$ssh_cmd

# 检查进程状态
ps -ef|grep -E $ssh_process

脚本详解

1. 配置参数

  • ssh_local_port: 本地监听端口(50001)
  • ssh_remote_port: 远程目标端口(80)
  • ssh_cmd: SSH连接信息,包含用户名、服务器地址和SSH端口
  • ssh_process: 用于匹配SSH进程的正则表达式

2. 核心功能

清理已有连接
ps -ef|grep -E $ssh_process | awk '{print $2}' | xargs kill -9

这行命令会查找并终止所有相关的SSH转发进程,确保不会有端口冲突。

建立端口转发
ssh -fN -L 0.0.0.0:$ssh_local_port:127.0.0.1:$ssh_remote_port

参数说明:

  • -f: 后台运行
  • -N: 不执行远程命令
  • -L: 进行本地端口转发
  • 0.0.0.0:$ssh_local_port: 在本地所有网卡上监听
  • 127.0.0.1:$ssh_remote_port: 转发到远程主机的目标端口
保持连接
-o "ServerAliveInterval=60"
-o "ServerAliveCountMax=3000000"

这两个参数用于保持SSH连接的稳定性:

  • ServerAliveInterval: 每60秒发送一次心跳包
  • ServerAliveCountMax: 最大心跳包重试次数

使用场景

  1. 内网服务暴露:将内网服务安全地暴露到外网
  2. 远程调试:开发人员需要访问远程服务器上的服务
  3. 安全访问:通过SSH加密通道访问远程服务
  4. 负载均衡:将流量转发到不同的后端服务器

安全建议

  1. 使用强密码或SSH密钥认证
  2. 限制本地监听地址(如需要的话)
  3. 定期更新SSH版本
  4. 监控异常连接情况

故障排查

如果端口转发不成功,可以检查:

  1. 确保本地端口未被占用
  2. 验证SSH连接权限
  3. 检查远程服务是否正常运行
  4. 查看系统日志寻找错误信息

总结

SSH端口转发是一个强大的网络工具,通过本文介绍的脚本,我们可以快速建立一个安全的端口转发通道。这个脚本不仅实现了基本的端口转发功能,还包含了自动清理、保活等实用特性,适合在生产环境中使用。

脚本封装

cat << 'EOF' >> ~/tunnel_forward.sh
# SSH端口转发管理函数
# 用法: tunnel_forward <本地端口> <远程端口> <SSH连接命令>
function tunnel_forward() {
    # 检查参数数量
    if [ $# -ne 3 ]; then
        echo "用法: bash ~/tunnel_forward.sh <本地端口> <远程端口> <SSH连接命令>"
        echo "例如: bash ~/tunnel_forward.sh 3306 3306 \"user@remote-server -p 22\""
        return 1
    fi

    # 设置参数
    local ssh_local_port=$1
    local ssh_remote_port=$2
    local ssh_cmd=$3

    if ! command -v autossh &> /dev/null; then
        echo "请先安装autossh: "
        echo "Ubuntu/Debian: sudo apt-get install autossh"
        echo "CentOS/RHEL: sudo yum install autossh"
        return 1
    fi

    # 定义进程匹配模式
    local ssh_process="(ssh.*$ssh_local_port)"

    # 关闭已存在的SSH隧道进程
    local existing_process=$(ps -ef|grep -E $ssh_process | awk '{print $2}')
    if [ ! -z "$existing_process" ]; then
        echo "关闭已存在的SSH隧道进程..."
        ps -ef|grep -E $ssh_process | awk '{print $2}' | xargs kill -9 2>/dev/null
    fi

    # 设置autossh环境变量
    export AUTOSSH_POLL=60
    export AUTOSSH_FIRST_POLL=30
    export AUTOSSH_GATETIME=0
    export AUTOSSH_DEBUG=1

    # 建立新的SSH隧道
    echo "建立新的SSH隧道..."
    autossh -M 0  -fN -L 0.0.0.0:$ssh_local_port:127.0.0.1:$ssh_remote_port \
        -o "ServerAliveInterval=30" \
        -o "ServerAliveCountMax=3" \
        -o "ExitOnForwardFailure=yes" \
        -o "StrictHostKeyChecking=no" \
        $ssh_cmd

    # 显示当前SSH隧道进程
    echo "当前SSH隧道进程:"
    ps -ef|grep -E $ssh_process
}

# 执行函数
tunnel_forward "$1" "$2" "$3"
# bash ~/tunnel_forward.sh 50000 80 "root@xxxx -p 22" >> ~/.tunnel_forward.log 2>&1

EOF

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

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

相关文章

(三)线性代数之二阶和三阶行列式详解

在前端开发中&#xff0c;尤其是在WebGL、图形渲染、或是与地图、模型计算相关的应用场景里&#xff0c;行列式的概念常常在计算变换矩阵、进行坐标变换或进行图形学算法时被使用。理解二阶和三阶行列式对于理解矩阵运算、旋转、平移等操作至关重要。下面&#xff0c;我将结合具…

Linux Bash 中使用重定向运算符的 5 种方法

注&#xff1a;机翻&#xff0c;未校。 Five ways to use redirect operators in Bash Posted: January 22, 2021 | by Damon Garn Redirect operators are a basic but essential part of working at the Bash command line. See how to safely redirect input and output t…

蓝桥杯算法日常|c\c++常用竞赛函数总结备用

一、字符处理相关函数 大小写判断函数 islower和isupper&#xff1a;是C标准库中的字符分类函数&#xff0c;用于检查一个字符是否为小写字母或大写字母&#xff0c;需包含头文件cctype.h&#xff08;也可用万能头文件包含&#xff09;。返回布尔类型值。例如&#xff1a; #…

MySQL(4)多表查询

引言&#xff1a;为什么需要多表的查询&#xff1f; A&#xff1a;提高效率&#xff0c;多线进行。 高内聚、低耦合。 一、多表查询的条件 1、错误的多表查询&#xff1a; SELECT employee_id,department_name FROM employees,departments; SELECT employee_id,department…

‘list‘ object has no attribute ‘mul‘

原来运行得好好的&#xff0c;突然出现错误&#xff1a;list object has no attribute mul &#xff0c;更换一个输入路径&#xff0c;又没问题&#xff0c;改一个路径&#xff0c;还是出现错误&#xff0c;很奇怪&#xff0c;后来又没有问题&#xff0c;记录一下。 参考这文…

【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的旅行社在线预订与行程管理系统

开题报告 本文旨在设计研究与开发一个旅行社在线预订与行程管理系统。首先&#xff0c;本文介绍了旅行社在线预订与行程管理系统相关技术集成开发环境、软硬件环境&#xff0c;SpringBoot框架、Vue.js框架的基本原理和优势&#xff0c;以及在旅行社在线预订与行程管理系统开发…

HarmonyOS快速入门

HarmonyOS快速入门 1、基本概念 UI框架&#xff1a; HarmonyOS提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI框架&#xff09;。方舟开发框架可为开发者提供应用UI开发所必需的能力&#xff0c;比如多种组件、布局计算、动画能力、UI交互、绘制等。 方…

[论文阅读] (36)CS22 MPSAutodetect:基于自编码器的恶意Powershell脚本检测模型

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0c;非常欢迎大家给我留言评论&#xff0c;学术路上期…

SQL sever数据导入导出实验

1.创建数据库TCP-H &#xff08;1&#xff09;右键“数据库”&#xff0c;点击“新建数据库”即可 &#xff08;2&#xff09;用sql语言创建&#xff0c;此处以创建数据库DB_test为例&#xff0c;代码如下&#xff1a; use master;go--检查在当前服务器系统中的所有数据里面…

Vue平台开发三——项目管理页面

前言 对于多个项目的使用&#xff0c;可能需要进行项目切换管理&#xff0c;所以这里创建一个项目管理页面&#xff0c;登录成功后跳转这个页面&#xff0c;进行选择项目&#xff0c;再进入Home页面展示对应项目的内容。 一、实现效果图预览 二、页面内容 功能1、项目列表展…

PyCharm+RobotFramework框架实现UDS自动化测试- (四)项目实战0x10

1.环境搭建 硬件环境&#xff1a;CANoe、待测设备&#xff08;包含UDS诊断模块&#xff09; 2.pythonPyCharm环境 pip install robotframework pip install robotframework-ride pip install openpyxl pip install udsoncan pip install python-can pip install can-isotp3…

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序&#xff0c;界面是标准的 Windows 主从窗口 拥有&#xff1a;主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西&#xff0c;均在下图了。 开发该软件&#xff0c;主要分为下面三个阶段 1&#xff09;界面设计开发 多窗口 MDI 程序…

USART_串口通讯轮询案例(HAL库实现)

引言 前面讲述的串口通讯案例是使用寄存器方式实现的&#xff0c;有利于深入理解串口通讯底层原理&#xff0c;但其开发效率较低&#xff1b;对此&#xff0c;我们这里再讲基于HAL库实现的串口通讯轮询案例&#xff0c;实现高效开发。当然&#xff0c;本次案例需求仍然和前面寄…

leetcode刷题记录(七十二)——146. LRU 缓存

&#xff08;一&#xff09;问题描述 146. LRU 缓存 - 力扣&#xff08;LeetCode&#xff09;146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类&#xff1a; * LRUCache(int capacity)…

C++ 类- 构造和析构

空类 class A {};空类大小&#xff1a; sizeof(A) 1编译器会默认生成 6 个成员函数&#xff1a; class A { public:A();//构造函数 - 完成对象初始化工作~A();//析构函数 - 完成对象的资源清理A(const A& a);//拷贝构造函数 - 使用同一类中之前创建的对象来初始化新创建…

ubuntu20.04有亮度调节条但是调节时亮度不变

尝试了修改grub文件&#xff0c;没有作用&#xff0c;下载了brightness-controllor&#xff0c;问题解决了。 sudo add-apt-repository ppa:apandada1/brightness-controller sudo apt update sudo apt install brightness-controller 之后在应用软件中找到brightness-contro…

macOS如何进入 Application Support 目录(cd: string not in pwd: Application)

错误信息 cd: string not in pwd: Application 表示在当前目录下找不到名为 Application Support 的目录。可能的原因如下&#xff1a; 拼写错误或路径错误&#xff1a;确保你输入的目录名称正确。目录名称是区分大小写的&#xff0c;因此请确保使用正确的大小写。正确的目录名…

包文件分析器 Webpack Bundle Analyzer

webpack-bundle-analyzer 是一个非常有用的工具&#xff0c;用于可视化和分析 Webpack 打包生成的文件。这使得开发者能够更好地理解应用的依赖关系、包的大小&#xff0c;以及优化打包的机会。以下是关于 webpack-bundle-analyzer 的详细介绍&#xff0c;包括它的安装、使用以…

【深度解析Java 20天速成】04_IDEA的安装与使用

【Why IDEA ?】 【注】JetBrains官方说明&#xff1a; 尽管我们采取了多种措施确保受访者的代表性&#xff0c;但结果可能会略微偏向 JetBrains 产品的用户&#xff0c;因为这些用户更有可能参加调查。 此外&#xff0c;2022年&#xff0c;某美国软件开发商在对近千名专业的Ja…

算法竞赛之差分进阶——等差数列差分 python

目录 前置知识进入正题实战演练 前置知识 给定区间 [ l, r ]&#xff0c;让我们把数组中的[ l, r ] 区间中的每一个数加上c,即 a[ l ] c , a[ l 1 ] c , a[ l 2] c , a[ r ] c; 怎么做&#xff1f;很简单&#xff0c;差分一下即可 还不会的小伙伴点此进入学习 进入正题 …