一直比较懒,没有为开源事业做出过什么贡献,最近痛定思痛,写了一个开源软件,解决网络通信问题,附上github地址,供大家共同交流。
https://github.com/wsrf16/anchor
本软件针对跨区、跨网段等网络不通场景,或需要批量网络代理场景而开发,可实现:
适用于单一端口转发,启动方式简单,无需额外配置,可以通过无参数方式执行,查看帮助:
Help you access the server efficiently
Usage:
anchor [flags]
anchor [command]
Available Commands:
completion Generate the autocompletion script for the specified shell
help Help about any command
http Start a http server
server Start a anchor server
socks Start a socks server
ssh Start a ssh server
ssh-pty Login remote ssh
tcp Start a tcp server
udp Start a udp server
Flags:
-f, --forward string
-h, --help help for anchor
-l, --listen string
Use "anchor [command] --help" for more information about a command.
该类转发在应用层实现,仅适用于http协议,因为https需要证书。
·正向代理
# 将本机作为代理服务器。其他机器可以通过设置代理为192.168.0.100:8081访问其他网络(假设该服务器ip为192.168.0.100)
$ anchor http -l :8081
·反向代理
# 将本地8081端口接收到的http请求,转发到http://192.168.0.10:8081
$ anchor http -l :8081 -f http://192.168.0.10:8081
该类转发在会话层实现,支持http、https、ssh等大部分基于tcp的协议。
·正向代理
# 将本机作为代理服务器。其他机器可以通过设置代理为192.168.0.100:8081访问其他网络(假设该服务器ip为192.168.0.100)
$ anchor tcp -l :8081
·反向代理
# 将本地8081端口接收到的tcp请求,转发到192.168.0.10的8081端口
$ anchor tcp -l :8081 -f 192.168.0.10:8081
该类转发在会话层实现,支持udp协议。
·反向代理
# 将本地8081端口接收到的udp请求,转发到192.168.0.10的8081端口
$ anchor udp -l :8081 -f 192.168.0.10:8081
该类转发在会话层实现,支持http、https、ssh等大部分基于tcp的协议。
·正向代理
# 将本地8081端口接收到的tcp请求,转发到192.168.0.10的8081端口
$ anchor socks -l :8081 -f 192.168.0.10:8081
本模式由于参数较多,仅支持配置文件方式启动。
$ ssh-pty 192.168.0.10 -u root -p 12345678
以配置文件方式启动,一次启动同时支持多种转发方式,listen为本地监听地址(必填),forward为转发目标地址(非必填)。
# 启动服务
$ ./anchor server
$ cat config.yaml
tcp:
- listen: :8081
- listen: :8082
forward: mecs.com:8080
udp:
- listen: :8083
forward: localhost:8084
socks:
- listen: :1080
http:
- listen: :8087
- listen: :8088
forward: http://mecs.com:8080
addedHead: test_header
ssh:
- listen: :8022
forward: mecs.com:22
httpserver:
listen: :8080
shell:
enabled: true
ssh:
- id: mecs.com:22
addr: mecs.com:22
user: root
password: 11
privateKey: "-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA5tm9KUtCqjSNMqZGENzyLYj5W/8fwghZVtta1CVv0ycgMW9G
UKRnXkHR9mrUQ38W7JvMaY2G8Z5eijvIp20YtIe/jrvgs/ZWxmAZANz/CSTI5/Jt
3ks33wGHRey/Rh3nM+CpfWyQkR34PVQP00A/L/9D5PuZ0kaU+mmt9am/iefouSJP
uweo+jJaTMwZIaR5qbu+UOh/9FrvfCZQqBgslrIzVE37Lk58zCWRG9opY85RvQJr
hQbyyYCSeKE/Pm+SqZO3ZXj4pvCH3YRSudW0sOLaiyro29I/Ttk0u3ATE3YnJu3t
BSOI9WKJN259xXAZFJCYQeJIP74B8RSTpzDXVwIDAQABAoIBAQDU5nC/Gaqa7bpe
wNwTh0FOX2nhv0txrjN+mDSPPKuB6C6XiNEnZEf0tO1HvkRer2Hb+t+tZRnT0cPM
5s/qIQJM1HkE0R6tuf1TXKMSmb4Xl7Y1u+45udMgNw+jnHDW4JMu0/5cLviw7RvY
q6Mgp7resCPUlXnKZM/Wlgoaa1+7dMY+RGHLznWVaYAwdgvR5sjmtfobmrHaIt4E
e0XL7DdbtrLFhK2WVXyDlmB5Y/ji7UajRNTeZVEhihgUdBkTiyBMlJ8jA3sBG/7s
EL+HS4WmjaoIh86wvUeh+Ue/R16p9CGfNS4QHocLM26qK3MwxOEb/il8un1/lOVB
x7OWlYJZAoGBAO5URQSJsqCk2Dgitj+A3yPF650rsDsMhJcAoOtHPlwae/8RNh/9
eNwqxPNrCqr+nbf4Eo22IxWmAUSRtq4NcWD0mhFyBb+MarD8P8NDByzllGlXAQok
HK68KK6dmfnFMIa6seIJkQ2H0scP17GK/MWsjrKA6/+k4kuVwqLJkH2TAoGBAPf3
hGb7M3BZqMWn/n6CWCyD3Jhtpfae9SZolTBrrC32uW+YxrLcJQcHQ4AqbYQihZap
jnYUNUTB5ZpCB8Xt9vkmrJrkvvVmeonw8ebDNQbCHS0btU+06OBtwHahCj4mOLxI
X4OtYKIoqyZzF1psPBP3i1jXmeA/3mpQM7TA+PmtAoGBAMq0mAM1Dt39dv2/4FyA
wslNZInIh9qhWgCJA1U5wjtaN06JmAx7bRltsxgKWgd4CjNX5ofre0nFaNymRsch
HebGBGiEH4l8553i3mS4lNjF54X0/yhd8JtZ5Awodbbv1ccx8Wv8kQf+FvNCcUVL
npSOoMwIRTGpTuPU27fTUnbLAoGBANvRFxV3oGz7fmrh9vBNOj8UEc0qfpJ27ZnD
4mVPPg5tBowQYiySjVyCqusGMZmOROB/pOO2HFa8kH7EBEIJJwRNrXuORl4jH4QD
DV5lNC+uitC/HGbxV/QENzayofLgTTFT8yA25VA7PyXRpyUoh8Wnj2cNkcJCvDeA
q6WT3+LtAoGAKHhFUXtSznBtajKaAc36rNR7V29/RctCTKWMHG9BrMXmrvOnuJw1
r6/cWM1g7ez4qEsgzk0rRVRhsIoq01sXf4dc2N7Un2fgkmQOSqX7qqYBQgJUEFjB
F4kdbHpJWTnF2l70iLkGIBu8Pxs7sUK658Q81iGJ/rvvaC8XAR5WM/M=
-----END RSA PRIVATE KEY-----"
这里详细说一下搭建http服务器,以下配置内容说明:监听本地8080端口,客户端可访问本地8080端口执行shell命令,或通过该服务器访问其他ssh服务器执行shell命令。
除支持linux平台外,同时也支持windows平台的dos命令
httpserver:
# 监听本地端口
listen: :8080
# 在服务器本地执行shell命令
shell:
enabled: true
# 通过服务器连接其他ssh服务器执行shell命令
ssh:
# 自定义,用于标记该目标地址的唯一标识
- id: 192.168.0.10:22
# 目标服务器地址
addr: 192.168.0.10:22
# 登录该服务器的用户名
user: root
# 登录该服务器的密码
password: 11
# 也可配置私钥,与密码认证方式二选一即可
privateKey: "-----BEGIN RSA PRIVATE KEY-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END RSA PRIVATE KEY-----"
经过以上配置后,可以通过调用以下http接口,ssh连接到id为“mecs.com:22”的机器上执行命令
$ curl -XPOST “http://localhost:8089/ssh” -H “Content-Type: applicaton/json” -d “{“commands”:[“whoami”, “aaaa”, “curl”],“serverId”:“mecs.com:22”}”
返回以下类似内容:
{
"spanId": "02063545-70ca-11ed-8f4d-f018980ebd48",
"code": 0,
"msg": "操作成功",
"data": {
"results": [
{
"stdout": "root\n",
"stderr": ""
},
{
"stdout": "bash: aaaa: command not found\n",
"stderr": "Process exited with status 127"
},
{
"stdout": "curl: try 'curl --help' or 'curl --manual' for more information\n",
"stderr": "Process exited with status 2"
}
]
},
"dateTime": "2022-12-01T00:14:03.8019397+08:00",
"timestamp": 1669824843801
}
也可在服务器本地执行shell命令,使用方法与ssh类似,此时无需指定serverId
$ curl -XPOST “http://localhost:8089/shell” -H “Content-Type: applicaton/json” -d “{“commands”:[“whoami”, “aaaa”, “curl”]}”
{
"spanId": "96478563-70cb-11ed-86be-000c297d3626",
"code": 0,
"msg": "操作成功",
"data": {
"results": [
{
"stdout": "root\n",
"stderr": ""
},
{
"stdout": "/bin/bash: aaaa: command not found\n",
"stderr": "exit status 127"
},
{
"stdout": "curl: try 'curl --help' or 'curl --manual' for more information\n",
"stderr": "exit status 2"
}
]
},
"dateTime": "2022-12-01T00:25:22.032626684+08:00",
"timestamp": 1669825522032
}