Python实现跨机器隧道打通

场景

有一个机房,机房内的机器与外界网络不通,但是机房提供了一台机器让我们可以访问到机房内的机器,对于这台机器我们称为跳板机。同时提供对外的服务部署在机房外的一台机器上,现在需要访问到跳板机或者机房内机器(ssh)。如图

其中api_server可以免密登录jump_server,jump_server可以免密登录private_server

ssh到jump server

python 复制代码
client = paramiko.SSHClient()
# client.load_system_host_keys()
# 允许连接不在know_hosts文件中的主机
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname='jump_server_ip', port=22, username='root', password='pwd')
# 私钥方式
# pkey = paramiko.RSAKey.from_private_key_file(id_rsa_path)  # 私钥
# client.connect(hostname=hostname, port=port, username=username, pkey=pkey)  
stdin, stdout, stderr = client.exec_command('pwd')  # 执行命令
code, out, err = stdout.channel.recv_exit_status(), stdout.read(), stderr.read()
client.close()

ssh到private server

python 复制代码
with sshtunnel.open_tunnel(
    ssh_address_or_host='jump_server_ip',
    ssh_username='root',
    ssh_password='pwd',
    # ssh_pkey='local_id_rda',
    remote_bind_address=('private_server_ip', 22),
    # local_bind_address=('127.0.0.1', 10022)  # 绑定本机10022端口
) as tunnel:
    client = paramiko.SSHClient()
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    client.connect(hostname='127.0.0.1', port=tunnel.local_bind_port, username='root', password='pwd')
    # pkey = paramiko.RSAKey.from_private_key_file('jump_id_rda')  # 跳板机的私钥
    # client.connect(hostname='127.0.0.1', port=tunnel.local_bind_port, username='root', pkey=pkey)
    stdin, stdout, stderr = client.exec_command('pwd')
    code, out, err = stdout.channel.recv_exit_status(), stdout.read(), stderr.read()
    client.close()

这里其实相当于将private_server的22端口转发到到本地的一个端口,再利用paramiko连接本地的端口。private_server上并没有配置api_server的公钥,所以不能用api_server的私钥登录。但是jump_server与private_server是可以免密登录的,可以利用jump_server的私钥登录,所以我将jump_server的私钥拷到了api_server上。

相关推荐
zed_2319 分钟前
省钱之道:token 成本日志 + FAQ 缓存
后端
量化分析码农20 分钟前
【Python量化因子实战 #07】因子加权怎么选?等权 / IC 加权 / 最大化 IR 三种策略 PK
后端
Wx-bishekaifayuan1 小时前
springboot甘肃特产服务平台50301-计算机课程设计、毕业设计
spring boot·后端·python·django·课程设计·express·旅游
Thneonl1 小时前
服务不通先别抓包:DNS 解析器的坑比内核网络栈多
后端·程序员
Thneonl1 小时前
一启动就 Exited(137):内存限制背后藏了四个参数
后端·架构
斯维赤1 小时前
从 @Tool 到 Agent 流水线:LangChain4j 进阶教学,一个库打全套
java·后端
对象存储与RustFS1 小时前
RustFS 生产部署实战:Docker / 二进制 / K8s Operator 三条路径怎么选
后端
知守观1 小时前
Spring Boot 2.1.0 停维护5年,10个依赖4个有CVE——2022年老项目的安全体检报告
spring boot·后端
SimonKing1 小时前
SSE项目`nexus-sse`持续优化,不一样的视觉效果
java·后端·程序员
斑鸠喳喳1 小时前
读写锁模式 Read-Write Lock
java·后端