golang 利用ssh包做无限级别的ssh代理,实现复杂网络环境下的各级网络跳转功能。
code/ssh.proxy 代码文件
code/common 公共代码文件
sshProxy/ssh.proxy.go 应用入口文件。
配置说明
代理软件配置是一个json,合理运用配置的递归,可实现无限层级的网络代理
addr
代理配置集合
saddr
远程前置机机器的IP 和端口,当前网络可连通的远程服务器地址
user
用户名
type
用户验证方式 1、密码验证 2、密钥验证
passwd
密码或者密钥文件路径
connect
转发类型 L、本地转发 R、远程转发 D、动态转发
remote
本地转发或者远程转发的远程监听或者连接地址
listen
监听在本地的端口
son
下一级别的代理配置,可忽略。
比如在办公室环境,访问云端局域网的某一台内网的机器C。现在有云端前置机B,办公室可通前置机B,内网服务器C可通前置机B,办公室与C机器不互通。现在通过前置机B可建立办公室与C的隧道,实现网络互通。
{
"addr":[
{
"saddr":"120.28.22.113:22", // 本地转发
"user": "root",
"type": 1,
"passwd": "test12345",
"connect": "L",
"remote": "120.28.23.113:22",
"listen": "127.0.0.1:6001",
}
]
}
小明还是在办公室,这一次他要访问家里的电脑C,小明家里的网络是中国移动,没有独立的公网IP。不过小明还有一台服务器B放在公网中的,有独立的IP。
下面是操作步骤:
- 先在家建立起家庭到服务器的隧道,俗称远程转发。
- 通过服务器与家庭建立的隧道,在外地访问家庭。
{
"addr":[
{
"saddr":"120.28.22.113:22", // 远程转发
"user": "root",
"type": 2,
"passwd": ".ssh/auth",
"connect": "R",
"remote": "127.0.0.1:12345",
"listen": "127.0.0.1:12345"
}
]
}
上面的配置相当于访问 服务器的12345端口,即家庭电脑的12345端口。
小明在办公室,但小明的公司将网络做了 封禁,只能连接某云的服务器,不能访问其他网络。但小明每天上班都没事做,想看看外面的网络是啥样的。小明利用某云的服务器,做了一个动态转发,实现了 访问外面的网络。
{
"addr":[
{
"saddr":"120.28.22.113:22", // 远程转发
"user": "root",
"type": 2,
"passwd": ".ssh/auth",
"connect": "D",
"listen": "127.0.0.1:12345"
}
]
}
下面来做一个骚操作,多级别的隧道连接
小明有两台机器,一台在国外,一台在上海。现在的网络环境是这样的,小明不能直连国外的机器,但上海的机器可以连接国外的机器。现在小明要实现的公司是,小明要访问国外机器上的数据库服务,并且小明要访问外面的网络。
{
"addr":[
{
"saddr":"120.28.22.113:22", // 上海服务器
"user": "root",
"type": 1,
"passwd": "test12345",
"connect": "L",
"remote": "120.28.23.113:22", // 日本服务器
"listen": "127.0.0.1:6001",
"son":[
{
"saddr":"127.0.0.1:6001", // 将日本服务器的数据库 3306端口映射在本地的 3307端口,然后可以在本地直接访问3307端口,实现访问日本3306端口。
"user": "root",
"type": 2,
"passwd": ".ssh/auto_key",
"connect": "L",
"remote": "127.0.0.1:3306",
"listen": "127.0.0.1:3307",
},
{
"saddr":"127.0.0.1:6001", // 动态转发,
"user": "root",
"type": 2,
"passwd": ".ssh/auto_key",
"connect": "D",
"listen": "127.0.0.1:3308",
}
]
}
]
}
配置解说,
第一级,连接上海服务器,并通过上海服务器建立一个日本服务器 22 端口到本地 6001端口的隧道,
第二级,通过第一级建立的隧道,在直接连接日本服务器,在建立日本服务器与本地的隧道。