首先介绍一下实验室服务器的情况。
实验室服务器处于学校内网,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文件即可。

发表回复