本帖最后由 andylizi 于 2023-1-25 08:29 编辑
背景
HAProxy 是一个高性能的TCP反向代理/负载均衡器,其功能类似于 Nginx。新版本的 BungeeCord 内置了对 HAProxy 的支持,使其能获取到客户端的真实IP。这一点跟 Spigot 的 BungeeCord 支持十分相似。但同样与 Spigot 相似的是,当开启了代理支持后,不用代理就无法进入服务器了。这给一些网络架构的部署带来了不便。
简介
HAProxyDetector 可以让 BC、Velocity 或 Spigot 同时接受 HAProxy 的代理连接与直连连接,使得下图的架构成为可能:

插件自身十分轻量级,开启后不会带来任何性能损失,资源占用可以忽视。
v2.0 更新:现已支持 Spigot 独立服务器,不再需要 BC 套壳。
v3.0 更新:现已支持 Velocity。
效果图

使用方法(必读!!)
Spigot 注意事项:需要 ProtocolLib 插件作为前置才能运行。BC 上安装本插件后,Spigot 子服不再需要安装,只需要把其自带的IP转发功能打开即可(spigot.yml 的 bungeecord 选项与 ip_forward 选项)。
Paper 注意事项:新版 Paper 中自带了 HAProxy 支持(但不能直连),不能与本插件一起使用,请在 paper.yml 中关闭 proxy-protocol 选项。
BungeeCord 注意事项:需要在 BC 配置文件 config.yml 中打开所有 listener 的 proxy_protocol 选项才可正常使用。注意它跟 paper.yml 里的同名选项没有联系,不要开错了!
Velocity 注意事项:需要在 Velocity 配置文件中打开 haproxy-protocol 选项才可正常使用。
HAProxy 注意事项:只有在开启了 HAProxy 的 send-proxy-v2 选项后,插件才能获取到真实IP。如果不开的话显示的 IP 全都是 HAProxy 自身的。
Java 9+ 注意事项:如果遇到 NoClassDefFoundError: sun.misc.Unsafe 或 InaccessibleObjectException 之类的错误,请添加 JVM 参数 --add-opens java.base/java.lang.invoke=ALL-UNNAMED
Java 18+ 注意事项:如果遇到 IllegalAccessException: static final field has no write access 错误,请更新插件到最新版本。
CatServer 注意事项:黑魔法太多太诡异,因此不支持。可以外面套一层 Waterfall。
安全警告:同时允许直连代理和连接会带来严重的安全问题:玩家可以自己架设一个 HAProxy,通过它来连接服务器“源站”,这样可以欺骗服务器的真实 IP 获取功能,将自己的来源 IP 修改为任意地址。
为了解决这个问题,本插件采用了 IP 白名单机制。只有白名单内的 IP 才允许通过 HAProxy 代理协议来连接服务器;直接连接不受影响。默认的白名单只包括 localhost,请在安装后编辑配置文件 whitelist.conf,添加自己的 HAProxy 实例的地址。复制代码出于安全考虑,插件通常不允许关闭白名单。如果你出于测试之类的目的必须要关闭的话,请在文件最开头加入以下内容:复制代码必须一字不差,并且在它之前除了注释外不能出现别的条目。
命令&权限
没有
下载
haproxy-detector-3.0.2.jar
(102.93 KB, 下载次数: 342)
或 Github Releases:https://github.com/andylizi/haproxy-detector/releases
使用前请务必完整阅读注意事项!
开源

https://github.com/andylizi/haproxy-detector
隐私政策
此插件使用 bStats 进行匿名使用数据统计,详见 bStats 隐私政策。众多知名插件如 EssentialX、WorldEdit、Vault 等均使用了 bStats 服务。
你可以在这里浏览此插件的报告:Bukkit | BungeeCord | Velocity
可在 plugins/bStats/config.yml 文件中将 enable 设为 false 为你的服务器全局关闭此功能。
其他
此插件最初由 @梦 定制,经许可后开源&发布。
本贴不涉及 HAProxy 本体的安装与配置,请不要询问 HAProxy 自身的问题(因为我自己也不会
)
背景
HAProxy 是一个高性能的TCP反向代理/负载均衡器,其功能类似于 Nginx。新版本的 BungeeCord 内置了对 HAProxy 的支持,使其能获取到客户端的真实IP。这一点跟 Spigot 的 BungeeCord 支持十分相似。但同样与 Spigot 相似的是,当开启了代理支持后,不用代理就无法进入服务器了。这给一些网络架构的部署带来了不便。
简介
HAProxyDetector 可以让 BC、Velocity 或 Spigot 同时接受 HAProxy 的代理连接与直连连接,使得下图的架构成为可能:

插件自身十分轻量级,开启后不会带来任何性能损失,资源占用可以忽视。
v2.0 更新:现已支持 Spigot 独立服务器,不再需要 BC 套壳。
v3.0 更新:现已支持 Velocity。
效果图

使用方法(必读!!)
Spigot 注意事项:需要 ProtocolLib 插件作为前置才能运行。BC 上安装本插件后,Spigot 子服不再需要安装,只需要把其自带的IP转发功能打开即可(spigot.yml 的 bungeecord 选项与 ip_forward 选项)。
- 如果遇到了 If you wish to use IP forwarding, please enable it in your BungeeCord config as well 错误,那就是 ip_forward 没开)
- 目前插件的正式版 v3.0.1 暂时不支持 ProtocolLib v5.0.0,但是快照版本支持,详情请见这里。
Paper 注意事项:新版 Paper 中自带了 HAProxy 支持(但不能直连),不能与本插件一起使用,请在 paper.yml 中关闭 proxy-protocol 选项。
BungeeCord 注意事项:需要在 BC 配置文件 config.yml 中打开所有 listener 的 proxy_protocol 选项才可正常使用。注意它跟 paper.yml 里的同名选项没有联系,不要开错了!
Velocity 注意事项:需要在 Velocity 配置文件中打开 haproxy-protocol 选项才可正常使用。
HAProxy 注意事项:只有在开启了 HAProxy 的 send-proxy-v2 选项后,插件才能获取到真实IP。如果不开的话显示的 IP 全都是 HAProxy 自身的。
Java 9+ 注意事项:如果遇到 NoClassDefFoundError: sun.misc.Unsafe 或 InaccessibleObjectException 之类的错误,请添加 JVM 参数 --add-opens java.base/java.lang.invoke=ALL-UNNAMED
Java 18+ 注意事项:如果遇到 IllegalAccessException: static final field has no write access 错误,请更新插件到最新版本。
CatServer 注意事项:黑魔法太多太诡异,因此不支持。可以外面套一层 Waterfall。
安全警告:同时允许直连代理和连接会带来严重的安全问题:玩家可以自己架设一个 HAProxy,通过它来连接服务器“源站”,这样可以欺骗服务器的真实 IP 获取功能,将自己的来源 IP 修改为任意地址。
为了解决这个问题,本插件采用了 IP 白名单机制。只有白名单内的 IP 才允许通过 HAProxy 代理协议来连接服务器;直接连接不受影响。默认的白名单只包括 localhost,请在安装后编辑配置文件 whitelist.conf,添加自己的 HAProxy 实例的地址。
- # 允许的代理 IP 列表 whitelist.conf
- #
- # 留空则为禁止所有代理 IP
- # 每一行的内容为 IP,域名或 CIDR
- # 填写的域名只有在启动时会被解析一次
- # 每个域名可以包含多个 A/AAAA 记录,所有记录的 IP 都会被允许
- # 域名不能使用 CIDR 前缀
- 127.0.0.0/8
- ::1/128
- YesIReallyWantToDisableWhitelistItsExtremelyDangerousButIKnowWhatIAmDoing!!!
命令&权限
没有
下载
或 Github Releases:https://github.com/andylizi/haproxy-detector/releases
使用前请务必完整阅读注意事项!
开源
https://github.com/andylizi/haproxy-detector
隐私政策
此插件使用 bStats 进行匿名使用数据统计,详见 bStats 隐私政策。众多知名插件如 EssentialX、WorldEdit、Vault 等均使用了 bStats 服务。
你可以在这里浏览此插件的报告:Bukkit | BungeeCord | Velocity
可在 plugins/bStats/config.yml 文件中将 enable 设为 false 为你的服务器全局关闭此功能。
其他
此插件最初由 @梦 定制,经许可后开源&发布。
本贴不涉及 HAProxy 本体的安装与配置,请不要询问 HAProxy 自身的问题(因为我自己也不会
本插件所用所有代码均为原创,不存在借用/抄袭等行为
emm现在最求的就是一份教程了 插件感觉好 就是不会用
请这位艺术家排版认真一点(狗头
这个还是很实用的,后面考虑出单服架构的spigot插件么
本帖最后由 andylizi 于 2020-8-27 22:40 编辑
理论上倒是很简单(跟BC一模一样),但因为 spigot 的 netty 配置是写死在 nms 里的,想用反射修改的话非常麻烦,而且可能会影响与 ProtocolLib 的兼容性。
虽然 ProtocolLib 为了实现它自己的功能有一套修改 netty 管线的代码,但它的代码也是写死的,也不好用反射修改利用。可能到头来最方便的方式只能是用 javaagent+asm 改字节码才行…总之十分麻烦。
SkyCatcher 发表于 2020-8-27 17:53
这个还是很实用的,后面考虑出单服架构的spigot插件么
理论上倒是很简单(跟BC一模一样),但因为 spigot 的 netty 配置是写死在 nms 里的,想用反射修改的话非常麻烦,而且可能会影响与 ProtocolLib 的兼容性。
虽然 ProtocolLib 为了实现它自己的功能有一套修改 netty 管线的代码,但它的代码也是写死的,也不好用反射修改利用。可能到头来最方便的方式只能是用 javaagent+asm 改字节码才行…总之十分麻烦。
andylizi 发表于 2020-8-27 18:05
理论上倒是很简单(跟BC一模一样),但因为 spigot 的 netty 配置是写死在 nms 里的,想用反射修改的话非 ...
spigot下已经有人写了识别proxy protocol的插件了,所以只需要兼容下应该就可以了,你可以参考下
https://github.com/thijsa/SpigotProxy