Meepo的目标是以便捷的, 去中心化的形式发布服务.
本项目还处于初期版本, 接口变动会相对频繁, 请留意.
由于接口变动, v0.6或更高版本无法向下兼容, 请升级到最新版本.
$ sudo snap install meepo
如果发行版不支持snap
, 需要从release下载对应版本并手动安装.
$ brew install PeerXu/tap/meepo
暂时不支持从chocolatey
安装, 需要从release下载对应版本并手动安装.
Meepo
采用ED25519算法
作为身份标识算法.
运行meepo serve
命令, 启动Meepo服务
.
$ meepo serve
运行meepo whoami
命令, 可以获得Meepo服务
的MeepoID
.
$ meepo whoami
# OUTPUT:
61pwmvz1lpm038xwku3njzj21h9na71clie4wv9px1kcxfk49z4
运行meepo shutdown
命令, 可以关闭Meepo服务
.
$ meepo shutdown
# OUTPUT:
Meepo shutting down
由于未指定身份标识文件
, meepo serve
运行时, 会生成随机身份
, 方便将要启动的Meepo服务
能够正常接入Meepo网络
.
可以通过meepo keygen
或ssh-keygen
生成身份标识文件
.
采用ssh-keygen
生成身份识别文件
会同时产生私钥和公钥文件, 忽略公钥文件即可.
暂时不支持带passphrase
的OpenSSH私钥
.
$ meepo keygen -f meepo.pem
# OR
$ ssh-keygen -t ed25519 -f meepo.pem
生成身份识别文件
成功之后, 启动Meepo服务
指定身份标识文件
.
$ meepo serve -i meepo.pem
Meepo服务
启动成功后, 再通过meepo whoami
获取当前的MeepoID
.
$ meepo whoami
# OUTPUT:
63eql8p54qpe1jfp1fmuumzge8y6y4ar5uml7nrrf8amqzmutey
假如, 现在alice
需要发布一个HelloWorld服务
到Meepo网络
.
先来实现一个简单的HelloWorld服务
.
# alice:terminal:1
alice$ cat << EOF > index.html
<h1>Hello World!</h1>
EOF
alice$ cat index.html
# OUTPUT:
<h1>Hello World!</h1>
alice$ python3 -m http.server 8080
# alice:terminal:2
alice$ curl http://127.0.0.1:8080
# OUTPUT:
<h1>Hello World!</h1>
这样我们就为alice
实现了一个HelloWorld服务
.
接着启动Meepo服务
和获取MeepoID
.
# alice:terminal:2
alice$ meepo serve
alice: meepo whoami
# OUTPUT:
63eql8p54qpe1jfp1fmuumzge8y6y4ar5uml7nrrf8amqzmutey
这时候, 已经完成整个发布流程.
接下来, 我们将讲解bob
如何访问alice
的HelloWorld服务
.
首先, bob
也需要运行一个Meepo服务
, 但是由于bob
并不需要发布服务, 所以使用随机身份
即可.
# bob:terminal:1
bob$ meepo serve
然后, 运行meepo teleport
命令, 使bob
的Meepo服务
生成一条Teleportation
通往alice
的HelloWorld服务
.
# bob:terminal:1
bob$ meepo teleport -n alice:http:8080 -l 127.0.0.1:8080 63eql8p54qpe1jfp1fmuumzge8y6y4ar5uml7nrrf8amqzmutey 127.0.0.1:8080
# Wait a few minutes...
# OUTPUT:
Teleport SUCCESS
Enjoy your teleportation with 127.0.0.1:8080
bob$ meepo teleportation list
# OUTPUT:
+-----------------+-----------------------------------------------------+--------+--------------------+--------------------+----------+
| NAME | TRANSPORT | PORTAL | SOURCE | SINK | CHANNELS |
+-----------------+-----------------------------------------------------+--------+--------------------+--------------------+----------+
| alice:http:8080 | 63eql8p54qpe1jfp1fmuumzge8y6y4ar5uml7nrrf8amqzmutey | source | tcp:127.0.0.1:8080 | tcp:127.0.0.1:8080 | 0 |
+-----------------+-----------------------------------------------------+--------+--------------------+--------------------+----------+
bob$ curl http://127.0.0.1:8080
# OUTPUT:
<h1>Hello World!</h1>
当bob
不再需要访问该服务时, 可以通过meepo teleportation close
命令关闭Teleportation
.
# bob:terminal:1
bob$ meepo teleportation close alice:http:8080
# OUTPUT:
Teleportation is closing
TBD
自组网是Meepo
的特性, 允许Meepo服务
成为Signaling Server
(WebRTC
建立连接需要交换信令, Signaling Server
提供交换的服务).
举个简单的例子:
比如现在有三个节点, 分别为alice
, bob
和eve
.
alice
与bob
建立了Transport
.
eve
与bob
建立了Transport
.
当自组网特性未启用时, 如果需要为alice
和eve
的创建Transport
时, 使用的是默认的Signaling Server
.
未启用自组网时, 交换Signaling
示意图:
alice --- Default Signaling Server --- eve
但是, 当自组网特性启用后, 会采用bob
做为Signaling Server
, 而不需要使用默认的Signaling Server
.
启用自组网后, 交换Signaling
示意图:
alice --- bob(Signaling Server) --- eve
默认参数下, 已经启动自组网功能.
SOCKS5是我们常用的网络代理协议之一.
Meepo
允许用户使用SOCKS5
代理访问由Meepo服务
发布的服务.
假如alice
的MeepoID
为63eql8p54qpe1jfp1fmuumzge8y6y4ar5uml7nrrf8amqzmutey
, 并且发布了HTTP服务
, 端口为80.
在完成配置后, 可以直接在浏览器上访问http://63eql8p54qpe1jfp1fmuumzge8y6y4ar5uml7nrrf8amqzmutey.mpo/
访问alice
发布的HTTP服务
.
域名是采用简单的定义规则, 是<id>.mpo
.
默认参数下, SOCKS5
代理监听地址为127.0.0.1:12341
.
接下来介绍一下使用方法.
现在有两个节点, 分别为alice
和bob
.
在alice
上, 发布两个服务, 分别是SSH服务
(22端口)和HTTP服务
(80端口).
在bob
上, 通过SOCKS5代理
访问alice
发布的SSH服务
和HTTP服务
.
下面用curl
举例子.
bob$ curl -x socks5h://127.0.0.1:12341 http://63eql8p54qpe1jfp1fmuumzge8y6y4ar5uml7nrrf8amqzmutey.mpo/
# ...
通过bob
的Socks5
代理访问alice
节点的ssh
服务.
bob$ ssh -o ProxyCommand='nc -X 5 -x 127.0.0.1:12341 %h %p' [email protected]
SOCKS5配置请参考各个系统的配置方法.
在默认配置下, Meepo服务
之间创建Teleportation
是不需要认证的. 这样带来了一定的便捷性, 同时也引入了安全问题.
所以Meepo
支持以密钥(secret
)的形式增加安全认证机制.
例子:
假如存在alice
和bob
.
alice
的MeepoID
为63eql8p54qpe1jfp1fmuumzge8y6y4ar5uml7nrrf8amqzmutey
.
alice
发布HTTP服务
(80端口)和SSH服务
(22端口), 并且配置secret
为AliceAndBob
.
alice$ cat << EOF > meepo.yaml
meepo:
auth:
name: secret
secret: AliceAndBob
EOF
alice$ meepo shutdown
# ...
alice$ meepo serve --config meepo.yaml --identity-file meepo.pem
配置secret
的工作已经完成.
这时候, bob
需要访问alice
发布的HTTP服务
.
那么bob
在创建Teleportation
时, 需要带上参数--secret
, 指定secret
.
bob$ meepo teleport -n alice-http-80 -s AliceAndBob -l 127.0.0.1:8080 63eql8p54qpe1jfp1fmuumzge8y6y4ar5uml7nrrf8amqzmutey 127.0.0.1:80
# wait a few minutes
# OUTPUT:
Teleport SUCCESS
Enjoy your teleportation with 127.0.0.1:8080
bob$ meepo teleportation list
# OUTPUT:
+---------------+-----------------------------------------------------+--------+--------------------+------------------+----------+
| NAME | TRANSPORT | PORTAL | SOURCE | SINK | CHANNELS |
+---------------+-----------------------------------------------------+--------+--------------------+------------------+----------+
| alice-http-80 | 63eql8p54qpe1jfp1fmuumzge8y6y4ar5uml7nrrf8amqzmutey | source | tcp:127.0.0.1:8080 | tcp:127.0.0.1:80 | 0 |
+---------------+-----------------------------------------------------+--------+--------------------+------------------+----------+
bob$ curl http://127.0.0.1:8080/
# ...
当然, SOCKS5代理
也是支持secret
的.
bob
通过SOCKS5代理
访问alice
发布的HTTP服务
.
bob$ curl -X socks5h://meepo:[email protected]:12341 http://63eql8p54qpe1jfp1fmuumzge8y6y4ar5uml7nrrf8amqzmutey.mpo
bob
通过SOCKS5代理
访问alice
发布的SSH服务
.
bob$ ssh -o ProxyCommand='meepo ncat --proxy-type socks5 --proxy 127.0.0.1:12341 --proxy-auth meepo:AliceAndBob %h %p' [email protected]
ACL
是一种常用的控制访问权限的手段.
Meepo
使用ACL
控制其他Meepo Service
调用NewTeleportation
的权限.
配置的meepo.acl
项可以控制ACL
的行为.
$ cat meepo.yaml
meepo:
acl:
allows:
- "127.0.0.1:*"
blocks:
- "127.0.0.1:22"
例如上面这个配置, 意思是除了端口22之外, 可以在127.0.0.1
上面任意端口创建Teleportation
.
ACL
行为由两个列表影响, allows
和blocks
.
allows
是允许通过的规则(AclPolicy
).
blocks
是不允许通过的规则.
ACL
运行逻辑顺序如下:
- 如果触发
blocks
规则, 则不允许创建Teleportation
. - 如果触发
allows
规则, 则允许创建Teleportation
. - 不允许创建
Teleportation
.
下面我们来讨论一下规则.
AclPolicy
的格式是source-acl-entity,destination-acl-entity
.
通常情况下, source-acl-entity
是可以省略的.
source-acl-entity
和destination-acl-entity
都是AclEntity
.
AclEntity
的格式是<meepo-id>:<addr-network>:<addr-host>:<addr-port>
.
addr-network
暂时只支持tcp
, socks5
和*
.
通常情况下source-acl-entity.addr-network
可选tcp
, socks5
和*
, destination-acl-entity.addr-network
可选tcp
和*
.
addr-host
暂时只支持IPv4格式的IP和CIDR
和*
.
addr-port
支持正常网络支持的端口和*
.
例子:
*
=>*:*:*:*,*:*:*:*
匹配所有Challenge
.
127.0.0.1:22
=>*:*:*:*,*:*:127.0.0.1:22
匹配Destination.Host
为127.0.0.1
, Destination.Port
为22
.
*:socks5:*:*,*
=>*:socks5:*:*,*:*:*:*
匹配Source.Network
为socks5
.
192.168.1.0/24:*
=>*:*:*:*,*:*:192.168.1.0/24:*
匹配Destination.Host
为192.168.1.0/24
.
由于Transport
是采用WebRTC协议
, 所以在创建Transport
会受到WebRTC
条件限制.
所以暂时有些网络情况是无法正常使用Meepo服务
. 后期会提供其他解决方案来解决这个问题.
Windows平台
暂时不支持Daemon模式
. --daemon
参数会被忽略.
Meepo
是一个免费且开源的项目, 欢迎任何人为其开发和进步贡献力量.
- 如果有不错的想法, 不妨通过Telegram或issues联系.
- 在使用过程中出现任何问题, 可以通过issues来反馈.
- 在使用过程中出现任何问题, 也可以通过Telegram来沟通使用心得.
- 如果还有其他方面的问题与合作, 欢迎联系 [email protected] .
- main分支仅作用于稳定版本的发布, PRs请提交到dev分支.
- Bug修复可以直接提交PR到dev分支.
- 如果有新增功能的想法, 可以先到issues描述想法与对应的实现, 然后fork修改, 最后提交PR到dev分支进行合并.
如果觉得Meepo能够帮助到你, 欢迎提供适当的捐助来维持项目的长期发展.
36PnaXCMCtKLbkzVyfrkudhU6u8vjbfax4
0xa4f00EdD5fA66EEC124ab0529cF35a64Ee94BFDE
MIT