关于ssh 代理跳板机访问数据库配置

前言

例如我们有服务器A 是跳板机,我们需要登录目标机是B,我们本地是不能直接访问到B,需要A ssh 然后再到B,B上的数据库和redis 这些只能B访问,那么怎么通过本地直接放到到B上的redis 和 mysql?

通过ssh 代理配置访问,然后本地就可以通过 127.0.0.1 加 local_mysql_port=53306,local_redis_port=56379,local_ssh_port=52222,就可以访问当目标的数据了

ssh 复制代码
#!/bin/bash

# gitxuzan
local_socks_port=10338
local_mysql_port=53306
local_redis_port=56379
local_ssh_port=52222
local_mq_port=55672
ssh_key_for_proxy="/Users/admin/.ssh/id_rsa"
ssh_key_for_final="/Users/admin/.ssh/quwan_pro"
proxy_host="root@139.196.49.172"
final_host="root@172.19.223.226"
mysql_remote="pc-uf6970466g63k.rwlb.rds.aliyuncs.com:3306"
redis_remote="r-uf6b8phpbo3vpr.redis.rds.aliyuncs.com:6379"
rabbitmq_remote="amqp-cn-x0r3mw005.cn-shanghai.amqp-17.vpc.mq.amqp.aliyuncs.com:5672"
ssh_remote="127.0.0.1:22"


# Function to kill process on a given port
kill_process_on_port() {
    port=$1
    echo "Checking if port $port is occupied and trying to free it..."
    lsof -ti tcp:${port} | xargs -r kill
}

# Function to check if SOCKS proxy is ready
check_socks_proxy() {
    for ((attempts=0; attempts<max_attempts; attempts++)); do
        if nc -z localhost $1; then
            echo "SOCKS proxy on port $1 is ready."
            return 0
        else
            echo "Waiting for SOCKS proxy on port $1 to be ready..."
            sleep 2
        fi
    done
    echo "Error: SOCKS proxy on port $1 did not start successfully."
    return 1
}

# Freeing up ports
for port in $local_socks_port $local_mysql_port $local_redis_port $local_mq_port $local_ssh_port; do
    kill_process_on_port $port
done

sleep 1  # Ensure the processes have been killed

# Start SOCKS proxy
ssh -v -D $local_socks_port -C -N -i $ssh_key_for_proxy -o ConnectTimeout=10 -o ServerAliveInterval=60 $proxy_host &

# Check if SOCKS proxy is ready
max_attempts=5
if check_socks_proxy $local_socks_port; then
# Setup port forwarding through SOCKS proxy
	ssh -o ProxyCommand="nc -x localhost:$local_socks_port %h %p" -i $ssh_key_for_final \
	-L $local_mysql_port:$mysql_remote \
	-L $local_redis_port:$redis_remote \
    -L $local_ssh_port:$ssh_remote \
	-L $local_mq_port:$rabbitmq_remote $final_host -N &
    sleep 1
else
    echo "Error: SOCKS proxy did not start successfully."

fi
配置详细解释
sh 复制代码
-v: Verbose 模式,让 SSH 在执行过程中提供更多的调试信息。这对于诊断连接问题非常有用。

-D $local_socks_port: 指定本地机器上的 SOCKS 代理端口。$local_socks_port 应该替换为你希望本地监听的端口号,这样 SSH 客户端就会创建一个 SOCKS 代理服务器,监听指定的本地端口。

-C: 启用压缩。SSH 会尝试压缩传输的数据,这在带宽有限的情况下可以提高性能。

-N: 表示不执行远程命令,通常与 -D 或其他用于端口转发的选项一起使用,用于建立隧道。

-i $ssh_key_for_proxy: 指定用于认证的私钥文件路径。$ssh_key_for_proxy 应该替换为私钥文件的实际路径。这允许用户不通过密码而是使用密钥对进行身份验证。

-o ConnectTimeout=10: 设置连接超时时间为 10 秒。如果 SSH 客户端在 10 秒内无法建立连接,它会中断尝试。

-o ServerAliveInterval=60: 每隔 60 秒发送一个空包到服务器以保持连接活跃。这有助于防止由于长时间无活动而导致的连接超时断开。
ssh config 配置
sh 复制代码
# 正式跳板机 (a) 的配置
Host bastion_quwan
    HostName 39.16.49.172
    User root
    IdentityFile /Users/admin/.ssh/id_rsa

# 正式服务器
Host quwan_pro
    HostName 12.19.223.26
    User root
    #ProxyCommand ssh -q -W %h:%p bastion_quwan
    ProxyJump bastion_quwan
    IdentityFile /Users/admin/.ssh/quwan_pro
scp 复制代理
sh 复制代码
all:gotool
	GOOS=linux GOARCH=amd64 go build -x -v -ldflags "-s -w" -o quwan_ws ./main.go && \
	ssh root@4237.116.2310.18 "rm -f /data/quwan/quwan_ws" && \
	scp /Users/admin/go/src/goBoss/web_test_driver/zinx_all/quwan/quwan_ws root@4237.116.21230.18:/data/quwan

pro:
	# scp -o ProxyJump=bastion_quwan -i /Users/admin/.ssh/quwan_pro /Users/admin/go/src/goBoss/web_test_driver/zinx_all/quwan/README.md root@172.19.223.226:/data/quwan 等价下面
	GOOS=linux GOARCH=amd64 go build -x -v -ldflags "-s -w" -o quwan_ws ./main.go && \
	ssh quwan_pro "mv /data/quwan/quwan_ws /data/quwan/quwan_ws_bak" && \
	scp /Users/admin/go/src/goBoss/web_test_driver/zinx_all/quwan/quwan_ws quwan_pro:/data/quwan
相关推荐
梦想的颜色1 小时前
【Docker原理】Docker 容器一文打尽:生命周期、环境管控、迁移备份、日志进程排查、垃圾清理
运维·docker·容器·容器生命周期·容器日志排查·容器迁移备份·容器进程管理
欢呼的太阳3 小时前
数据库设计Step by Step (10)——范式化
服务器·数据库·oracle
喜欢的名字被抢了4 小时前
MySQL基础入门:从零理解数据库与SQL
数据库·mysql·教程
donoot4 小时前
Linux系统下图书馆级电子书全自动标准化分类整理完整实施方案
大数据·linux·运维·电子书管理
ITKEY_4 小时前
macOS brew 安装的nginx 文件在哪里?
运维·nginx·macos
Elastic 中国社区官方博客5 小时前
如何比较两个 Elasticsearch 索引并找出缺失的文档
大数据·运维·数据库·elasticsearch·搜索引擎
DLYSB_5 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
儒雅的大叔5 小时前
MySQL数据库InnoDB数据恢复工具使用总结
数据库·mysql·adb
观远数据6 小时前
ChatBI选型对比:从意图识别到SQL修复,六个维度打分决定是否值得投产
数据库·人工智能·sql
嘉&年华6 小时前
【第008篇】通过dexp和dimp命令导出和导入dmp文件(适用于达梦数据库)
数据库·sql