高级需求
高级需求
majora从开发至今应对过很的客户需求,但是不是所有客户都需要这些偏定制化的功能,所以这里我根据不同的业务场景,梳理这些场景应该如何配置。
自MajoraV3开始,我们将IP池概念抽象出来,故IP池和IP节点映射关系已经融入到系统作为核心功能。可以看到这在V2阶段本章节大量篇幅都在解释如何构建满足目标需求的IP池。 然而此时本章节已经没有这部分内容的表述了
当然,majora作为一款产品,不是所有客户需求都可以被满足,因为每一个客户的需求都会引入新的概念,导致其他客户产生心智负担。 此时若客户依然强烈要求某个功能,则应该考虑购买我们的源代码自行改造和定制
二次开发
大多数深入使用majora的同学,可能都是将majora作为一个底层服务,而在业务侧需要开发相关功能对majora进行包装。 majora的restfulAPI在swagger中有列出
majora自己的前端,也是完全基于本API开发的,如果您希望保持majora的内核,但是重新开发一个新的前端皮肤,则可以基于本API重写前端页面 若希望自己开发前端,则将静态html内容替换到安装包的
config/static/目录下即可

接口分类
Majora的所有API具有两个共性
- AdminOnly: 若API标记了AdminOnly,则证明本API只有管理员身份才可以访问
- SupportApiToken:若API标记了SupportApiToken,则当前API可以通过账户对应的APIToken执行调用
若API无上述两个标记,则当前API没有权限检查,任何人可以匿名访问。 APIToken是账户个人中心展示的一个token,他是一个不会变化的token字符串,用户可以将他写入到代码中对majora系统进行操作

webhook
用户可能需要基于majora系统的实时数据进行业务逻辑编程,此时majora提供了webhook的功能,可用于订阅majora内部发生的事件, 如下demo用于订阅majora设备的上下线
// 您用于接收majora相关事件数据的接口地址,这里假定是钉钉机器人接口
def DD_WEBHOOK = "https://oapi.dingtalk.com/robot/send?access_token=xxxxToken"
endpointOffline {
def json = new JsonBuilder()
// 拼接相关的数据结构
json {
msgtype "text"
text {
content "设备离线webhook,客户端id: ${clientId} 所在分组: ${group}"
}
}
// 请注意,当您的设备数量非常多的时候(如大于5千个节点),不要使用httpPost,而是使用asyncPost
// 这是因为httpPost将会是单机串行,数据量过大时将会存在请求调用排队挤压,而asyncPost则不会等待http调用返回
asyncPost DD_WEBHOOK, json
}
endpointOnline {
def json = new JsonBuilder()
json {
msgtype "text"
text {
content "设备上线webhook,客户端id: ${clientId} 所在分组: ${group}"
}
}
// 请注意,当您的设备数量非常多的时候(如大于5千个节点),不要使用httpPost,而是使用asyncPost
asyncPost DD_WEBHOOK, json
}使用白名单进行鉴权
此功能给无法使用账号密码进行鉴权的场景使用,首先majora的代理服务必须鉴权,鉴权方式支持账号密码和白名单两种。
当我们的业务场景无法使用账号密码鉴权,而必须使用白名单鉴权时,可能出现一个业务状况:白名单鉴权根据访问代理ip资源的的机器的出口ip来识别请求, 然而这些机器的出口ip可能会发生缓慢的变化。如在程序运行在宽带网络之中、运行在手机4G流量之下。
由于无法静态确定出口ip,所以我们并不能提前在后台填写ip列表。所以majora提供的解决方案如下:
- majora提供了Http接口API,可以通过API动态添加白名单配置,业务可以定时的、循环的调用API,维护白名单列表
- 直接访问对应http接口即可,majora将会自动的解析来源ip(不需要手动访问ip解析网站获得出口ip)
- Http接口存在鉴权(即ApiToken),故不存在安全问题
- 为避免配置碰撞,majora使用LRU策略,在白名单配置达到容量的时候,删除最早添加的,且没有心跳的ip白名单配置。保证白名名单存储最近的、最新的内容
- 此方案可能在天级别内具备几分钟级别的服务不可用场景,但是整体基本满足需要。
系统设置
majora后台有多项配置实现一些功能特定功能设定,这里将部分重要的设置项做一个解释

是否允许注册用户
majora系统大多运行在公网,可以被互联网直接访问,而不少功能和能力在注册用户后就可以使用,为了避免权限越界。可以在系统部署完成后关闭用户注册功能
SwaggerAPI暴露问题
majora是一个公开软件,理论上swagger的API说明文档在互联网就是公开可见的,然而当majora在某些公司内部部署时,会被防火墙判定为API说明文档泄漏,进而推导公司机密泄漏 。 这在一些国家机构的服务器环境中尤为常见。为了避免防火墙的报警,你可以在系统设置中关闭两组功能。
- 拦截Swagger: swagger说明文档将会404
- 拦截Actuator:指标暴露服务将会404(在大多数集团公司中,都具有标准的监控平台,actuator则是标准的监控指标提供服务,此功能可以将majora内部运行指标对接到你们公司的监控平台)
代理请求访问控制
如果你的国家或者地区有法律要求,客人不允许访问某些特定网站,则可以配置ACL规则对用户的访问行为进行拦截,参考配置如下
all:*.baidu.com,*.google.com,www.tencent.com,114.54.34.23,123.434.*;some-user1:*.google.com;some-user2:*.gov.cn- 基础规则: user1:rule1;user2:rule2,多个guise用分号
;分隔 all:all是一个特殊用户,他的规则对所有用户生效- 每个用户可以配置多个deny规则
- *.baidu.com :以某个域名结尾
- 114.54.34.23:一个特性的IP地址
www.tencent.com一个特定的域名- 123.434.* :限制某个网段
ACL 为deny规则,满足规则的代理流量将会被阻断拦截
ssl over ssl
在V3阶段,ssl能力暂时还没有完全迁移过来,故本功能暂时还不支持,然而此功能自在未来计划的中
在使用https代理的时候,https底层是ssl,即代理报文经过了tls加密,majora并不干预这个加密过程,他只透传tls流量。
按照https代理的标准流程,存在https客户端到代理网站的流量+https客户端发送给最终的目标网站的加密流量。此时由于目标网站是https的,此流量必须加密。 然而https客户端到代理服务器(即majora服务器)的流量,我们一般认为他是明文的流量。
不过这是一般情况,按照http代理的标准流程,我们允许http客户端到majora代理服务器的流量进行tls加密,此时如果有中间人抓包则无法看到http客户端发送给majora的报文内容了, 这个场景我把它叫做ssl over ssl
大多数情况此种场景在python代码中容易出现,目前其他语言很少看到出现此种特性:
如代码:
普通的,和majora通信使用明文的方式
import requests
proxies = {
'http': "http://majora:majora@majora.iinti.cn:6879",
'https': "http://majora:majora@majora.iinti.cn:6879"
}
res = requests.get('https://www.baidu.com', timeout=11, proxies=proxies).text
print(res)SSLOverSSL,和majora通信使用tls加密的方式
import requests
proxies = {
'http': "https://majora:majora@majora.iinti.cn:6879",
'https': "https://majora:majora@majora.iinti.cn:6879"
}
res = requests.get('https://www.baidu.com', timeout=11, proxies=proxies).text
print(res)支持ssl over ssl,则要求majora服务器具备https证书,你需要去ca机构申请证书(由于实在是太麻烦,而且基本没有业务收益,所以其实一般来说不建议用户搞这个),然后配置证书到majora中。
配置majora证书
- 申请ca证书,放置到majora所在服务器
- 如果使用docker,则需要为ca证书文件进行挂载映射,避免重启docker证书消失
- 配置
application.properties- server.ssl.keyStore=证书文件地址 (如:ssl_key_store_file.pfx)
- server.ssl.keyStoreType=证书类型 (如:PKCS12)
- server.ssl.keyStorePassword=证书密码
- 重启majora系统,即可支持
"https://majora:majora@majora3.iinti.cn:6879"
自动生成证书
如果你没有申请CA证书,但是依然希望使用ssl over ssl,则可以通过majora自动生成签名证书,此时majora作为根证书机构颁发任意网站证书,所以需要用户在自己的电脑上安装majora提供的根证书。 此种场景几乎不可能有需求,所以这里暂时不展开了。
