使用多个公网 IP 地址访问服务器

在部分特殊网络环境下,我们需要让客户端通过不同的 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 选项启用并指向默认地址
  • 确保以下文件中的 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

安全强化选项(可选)

如果你额外启用了类似“盾机”、“负载均衡”等手段来隐藏真实服务器的 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 选项

使用 NEMO 来启用代理支持选项

最后,在进行客户端分发的时候,请你自行确保:海外玩家 {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 地址分流。