【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
: 最大心跳包重试次数
使用场景
- 内网服务暴露:将内网服务安全地暴露到外网
- 远程调试:开发人员需要访问远程服务器上的服务
- 安全访问:通过SSH加密通道访问远程服务
- 负载均衡:将流量转发到不同的后端服务器
安全建议
- 使用强密码或SSH密钥认证
- 限制本地监听地址(如需要的话)
- 定期更新SSH版本
- 监控异常连接情况
故障排查
如果端口转发不成功,可以检查:
- 确保本地端口未被占用
- 验证SSH连接权限
- 检查远程服务是否正常运行
- 查看系统日志寻找错误信息
总结
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)!