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

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

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

脚本内容

bash 复制代码
export ssh_local_port=50001
export ssh_remote_port=80
export ssh_cmd="[email protected] -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. 核心功能

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

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

建立端口转发
bash 复制代码
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: 转发到远程主机的目标端口
保持连接
bash 复制代码
-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端口转发是一个强大的网络工具,通过本文介绍的脚本,我们可以快速建立一个安全的端口转发通道。这个脚本不仅实现了基本的端口转发功能,还包含了自动清理、保活等实用特性,适合在生产环境中使用。

脚本封装

bash 复制代码
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
相关推荐
2501_915373882 小时前
Redis线程安全深度解析:单线程模型的并发智慧
数据库·redis·安全
恰薯条的屑海鸥5 小时前
零基础在实践中学习网络安全-皮卡丘靶场(第十五期-URL重定向模块)
学习·安全·web安全·渗透测试·网络安全学习
Tipray20066 小时前
让敏感数据在流转与存储中始终守护在安全范围
安全
码农101号6 小时前
Linux中shell编程表达式和数组讲解
linux·运维·服务器
powerfulzyh6 小时前
非Root用户启动SSH服务经验小结
运维·ssh
云道轩6 小时前
升级centos 7.9内核到 5.4.x
linux·运维·centos
前端页面仔6 小时前
易语言是什么?易语言能做什么?
开发语言·安全
爱学习的小道长7 小时前
Ubuntu Cursor升级成v1.0
linux·运维·ubuntu
EelBarb7 小时前
seafile:ubuntu搭建社区版seafile12.0
linux·运维·ubuntu
402 Payment Required7 小时前
serv00 ssh登录保活脚本-邮件通知版
运维·chrome·ssh