Python建立SSH隧道源码

首先介绍一下实验室服务器的情况。

实验室服务器处于学校内网,IP地址均为10开头,不可通过外部直接访问,因此只能进行内网穿透。同时,内部运行数十个docker容器,每个容器归一个学生使用,容器的ssh端口映射到物理机的高位端口,且仅使用弱密码登录。

内网穿透涉及到将容器ssh端口暴露到公网,由于弱密码的缘故,被爆破可能性大幅提升,且指导其他学生修改登陆方式为密钥登录较为麻烦,因此决定新建一个强密码保护的docker,用此docker作为跳板登录他们自己的弱密码docker。

但是手动建立隧道需要手动键入较长的ssh连接命令,如下:

ssh -p frpserverport -L [remoteport]:[remoteip]:[remoteport] [springboard_docker_username]@[frpserverip]

然后还需要输入跳板docker的密码,整体操作较为复杂。

为了解决这一问题,决定编写一个python程序,将此手动操作打包成exe。python源代码如下:

# -*- coding: utf-8 -*-

from sshtunnel import SSHTunnelForwarder
import time
import configparser

# 读取配置文件
config = configparser.ConfigParser()
config.read('config.ini', encoding='utf-8')

# SSH服务器的设置
ssh_host = ''
ssh_port =  # SSH服务的端口
ssh_username = ''
ssh_password = ''
remote_ip = config['SSH']['remote_ip']
remote_port = int(config['SSH']['remote_port'])
local_port = int(config['SSH']['local_port'])

# 设置SSH连接
server = SSHTunnelForwarder(
    (ssh_host, ssh_port),
    ssh_username=ssh_username,
    ssh_password=ssh_password,
    remote_bind_address=(remote_ip, remote_port),
    local_bind_address=('0.0.0.0', local_port)
)

# 启动隧道
server.start()
print(f'隧道已激活:localhost:{server.local_bind_port}, 映射的远程端口为 {remote_ip}:{remote_port}')
print(f'现在可以使用ssh软件连接至127.0.0.1:{server.local_bind_port} 来进入你的docker')
print('按下Ctrl + C 以退出本跳板程序')

try:
    while True:
        # 让脚本一直运行
        time.sleep(1)
except KeyboardInterrupt:
    # 捕获Ctrl+C,优雅地关闭隧道
    print('隧道关闭中...')
finally:
    server.stop()
    input("按下Enter键退出...")

此python文件首先从本地的‘config.ini’文件中读取目标docker的配置,然后使用预置的frp服务器配置和跳板docker登录信息对跳板docker进行远程登录,并将目标docker的端口映射到本地的相应端口。

此后,用户可以使用ssh软件,如Xshell等登录‘127.0.0.1:[local_port]’,来进入目标docker。

config.ini文件的格式如下:

[SSH]
# 下面是你要连接的服务器在学校内网里面的IP
remote_ip = 
# 你的docker端口
remote_port = 10022
# 你打算把docker端口映射到你本地的哪个端口?
local_port = 10022

随后,为了打包python成一个exe可执行文件,可以使用pyinstaller:

pyinstaller --onefile --console ssh.py

随后将exe程序和ini文件一起打包并分发,用户只需要根据自己的docker信息填写ini文件,然后双击执行exe文件即可。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

You might also like