野火政企内外网双网解决方案
政企网络都对安全性要求比较高,很多都是内网专网,与外界通过特殊网关或者代理沟通。使用野火IM如果是只在外网或者只在内网,处理起来是比较简单的。但如果要是同时支持内外网接入,甚至支持内外网漫游切换,则比较困难。最近野火专业版对此场景进行特殊设计,可以完美支持内外双网的环境。另外针对政企网络环境的特殊性,也调整了端口的限制。
1. 实现原理
野火SDK除了之前设置的地址外,还可以另外设置一个备用地址,这样两个地址就可以对应两个网络环境。SDK还新添加了网络策略,策略0表示同时使用,我们协议栈是基于微信mars,支持复合连接,当有多个地址时,会同时发起连接,那个连接先连上使用那个,当策略0时,客户端在内外网都可以使用;当策略为1时,会只使用主地址,只能在主地址对应的环境中使用;当策略为2时,只使用备用地址,只能在备用地址对应的环境中使用。
网络策略是可以实时切换的,最简单的方法是使用0,两个环境都尝试去连接,也可以在应用中检查当前环境,然后进行切换。
2. 使用方法
更新到2020.12.23号以后的专业版和客户端SDK。然后服务器和客户端分别进行下面修改:
2.0.1. 服务器的修改
找到wildfirechat.conf
配置文件,需要按照常规的方法先配置好,确保能在一个环境中正常使用。然后添加备选服务配置,设置另外一个环境的接入信息:
## 备选server地址,一般用于内外网隔离的环境,普通用户不要打开
## 以英文逗号分开,格式为{$IP}:{$short_link_port}:{$long_link_port}:{$ws(s)_port}
## 如果没有Web客户端,ws(s)_port可以随意设置一个,但不能空缺。
server.backup_address 192.168.3.102:81:1884:8884
对象存储服务也需要做配置另外一个网络环境的信息
##备选的媒体服务地址,一般用于内外网隔离的环境,普通用户不要打开
media.backup_server_url http://192.168.3.103
media.backup_server_port 80
这样服务器就配置完成了,客户端可以拿到2个环境的信息。
2.0.2. 客户端的修改
客户端包括原生SDK(iOS/Android/PC)和Web SDK,都有类似的接口在接口文件中找到,下面以android为例:
从ChatManager对象中找到下述两个方法
/**
* 设置网络策略,一般用于政企单位内外网两种网络环境。
*
* @param strategy 网络策略,0是复合连接;1是使用主要网络;2使用备选网络
*/
public void setBackupAddressStrategy(int strategy) {
...
}
/**
* 设置备选服务地址,一般用于政企单位内外网两种网络环境。
*
* @param host 用备选网络ip
* @param port 用备选网络端口
*/
public void setBackupAddress(String host, int port) {
...
}
在设置服务器地址的地方设置备选地址和网络策略:
private void initWFClient(Application application) {
ChatManager.init(application, Config.IM_SERVER_HOST);
ChatManager.Instance().setBackupAddress("192.168.3.101", 80);
ChatManager.Instance().setBackupAddressStrategy(0)
...
}
其它平台也都可以在应用启动后,对SDK参数进行初始化时设置。其中设置网络策略接口可以在任意地方调用,可以调用多次。
媒体消息需要额外处理。媒体消息是图片/文件/语音/视频等消息,主要内容会上传到媒体服务,然后得到一个链接地址,再把包含链接的消息发送给对方。这样链接就只能在一个网络环境中使用,应用可以在使用前判断网络环境及分析链接地址,判断是否需要进行地址转换。转换得到对应环境的地址就可以访问了。
3. 注意
- Web暂时只能支持策略1和策略2,不能复合连接。Web应用可以根据当前的链接地址判断是那个环境,从而进行切换。
- 服务器需要需要为每个节点配置备选地址,一般高可用情况下,节点大于等于2;客户端配置的为备选授权地址,仅有一个。
- 使用双网环境,需要告知我们,我们需要对服务器授权进行特殊处理。
4. 示例
假如部署一个服务在内网中,它的IP地址为172.10.35.100,端口都是默认的,短链接端口是80,长链接端口是1883,Websocket端口是8083,管理端口是18080。其中管理端口是供其它服务进行调用的,不需要对外提供服务;原生客户端(Android/iOS/PC)使用80和1883;Web客户端使用80和8083。
按照现有文档配置服务和客户端,客户端可以在内网中正常运行。
然后内网通过代理服务映射到外网,比如IP地址映射为11.43.238.52,80端口映射为10080,1883端口映射为11883,8083端口映射为18083。服务器配置中,打开server.backup_address的配置,配置为11.43.238.52:10080:11883:18083,配置后重启。客户端,在原生应用(包括PC)启动的地方设置备选地址 setBackupAddress("11.43.238.52", 10080),在Web应用初始化的地方设置备选地址 setBackupAddress("11.43.238.52", 10080). 然后再设置策略,使用主网络或者备选网络或者自动。
以上端口80是绑定在客户端协议栈的,无法修改,其它端口都可以根据您的实际情况来自由配置。如果您无法使用80端口,请联系我们定制。