自学内容网 自学内容网

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

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

原文地址:https://blog.csdn.net/xzpdxz/article/details/145240000

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!