在部分特殊网络环境下,我们需要让客户端通过不同的 IP 地址可以链接到同一台服务器上(国内玩家走国内 IP、海外玩家走海外 IP),本文将介绍如何进行此项设置的方法
环境准备
- 公网服务器具备两个(或多个)不同的 IP 地址
- 访问这些不同的 IP 地址,最后都能与服务器直接建立连接
- 注意是:直接建立连接,而不是通过各种中转服务,最后间接连接
- 使用熊猫模拟器 v1.1.2 或后续更新版本
- 安全性会提高,并非必须;本文的操作方法同样适用于 rAthena
- 使用 NEMO 最新版本 (我们需要对客户端进行 DIFF 操作)
服务端配置
- 从多个 IP 中选择一个质量比较好的 IP 地址,作为默认地址
- 将 conf/char_athena.conf 的
char_ip
选项启用并指向默认地址 - 将 conf/map_athena.conf 的
map_ip
选项启用并指向默认地址
- 将 conf/char_athena.conf 的
- 确保以下文件中的
bind_ip
选项处于被注释的状态- conf/login_athena.conf
- conf/char_athena.conf
- conf/map_athena.conf
- 如果 login-server、char-server、map-server 在同一台物理服务器,那么建议
- 将 conf/char_athena.conf 的
login_ip
选项启用并指向 127.0.0.1 - 将 conf/map_athena.conf 的
char_ip
选项启用并指向 127.0.0.1
- 将 conf/char_athena.conf 的
安全强化选项(可选)
如果你额外启用了类似“盾机”、“负载均衡”等手段来隐藏真实服务器的 IP 地址,那么建议你同时启用 conf/inter_athena.conf 的 hide_server_ipaddress
选项(此选项为熊猫模拟器专属功能)
启用 hide_server_ipaddress 选项之后,conf/char_athena.conf 中的 char_ip
选项和 conf/map_athena.conf 中的 map_ip
选项将变得不再重要。因为不管这两个选项改成多少,发送给客户端时都会被修改成 127.0.0.1,以防止泄漏服务器的真实 IP 地址。
客户端调整
在默认情况下,客户端除了和登录服务器建立连接的时候会使用 data/{s}clientinfo.xml 中的 address 选项所配置的 IP 地址外,后续与角色服务器、地图服务器建立连接的地址都会根据服务器返回的 IP 地址作为连接依据。
为了能够让任何时候客户端都只使用 data/{s}clientinfo.xml 中的 address 选项所配置的 IP 地址来与角色、地图服务器建立连接,我们需要对客户端进行一些调整:使用 NEMO 在对客户端进行 DIFF ,并启用:Enable Proxy Support 选项
最后,在进行客户端分发的时候,请你自行确保:海外玩家 {s}clientinfo.xml 中的 address 为您服务器的海外 IP 地址、国内玩家 {s}clientinfo.xml 中的 address 为您服务器的国内 IP 地址
连接原理介绍
默认情况下客户端与服务端的连接过程中,并不是一直固定使用 {s}clientinfo.xml 中的 address 选项所配置的 IP 地址来连接登录、角色、地图三个服务器,实际情况为:
- 客户端通过 {s}clientinfo.xml 中的 address 所设置的 IP 地址与【登录服务器】建立连接
- 完成账号登录后,登录服务器会【告诉】客户端,下面要去连接的【角色服务器】的 IP 地址和端口是多少
- 客户端拿到上面的信息后,会用服务端告诉他的角色服务器连接信息去建立连接
- 完成角色选择后,角色服务器会【告诉】客户端,下面要去连接的【地图服务器】的 IP 地址和端口是多少
- 客户端拿到上面的信息后,会用服务端告诉他的地图服务器连接信息去建立连接
上述流程虽然允许了服务端通过返回下一个环节连接信息的方式来【指引】客户端连接到不同 IP 地址,但也正由于这个指引在 rAthena 系列服务端中只能是 1 个 IP 地址(也就是上文中所谓的:默认地址;无法根据情况返回海外或者国内 IP地址来返回恰当的 IP 地址)。
如果保留这样的指向能力就会出现这样的一个情况:与登录服务器建立连接的时候由于 {s}clientinfo.xml 的关系可以实现国内外分流,但是一旦完成了与登录服务器的连接,登录服务器就会【告诉】客户端接下来你应该去默认地址与角色服务器建立连接(选择完成角色后与地图服务器建立连接时同理),因此不管是国内还是海外,都会被归拢连接到其中一个 IP 地址,导致我们的分流目标无法达成。
上述 NEMO 中的 Enable Proxy Support 选项,实际上就是关闭客户端【接受指引】的能力,不管登录服务器和角色服务器如何告诉客户端应该去哪里建立连接,客户端依然【头铁的】的用 {s}clientinfo.xml 中的 address 选项所配置的 IP 地址来与角色、地图服务器建立连接,这样就实现了不同 IP 地址分流。