如何保护你的DNF私服:AES密钥、RSA公私钥、HTTPS网关与GeoIP白名单安全机制详解
游戏开发云原生DevOps运维【免费下载链接】dnf项目地址https://gitcode.com/gh_mirrors/dnf4/dnf点击查看免费下载dnf是一款把 DNF地下城与勇士私服打包为 Docker 容器的开源部署项目一条docker run即可拉起完整服务端。除了部署方便它内置了四层开箱即用的安全防护AES 通讯密钥、自动生成的 RSA 公私钥、HTTPS 登录网关与 GeoIP 国家白名单。本文将用通俗的方式讲清每一层防护的原理与开启方法帮你挡住最常见的三类风险登录流量被抓包、公开密钥被盗用、陌生地区 IP 随意连接。一、先看懂一次登录要经过哪些环节从上图的进程架构可以看出玩家客户端并不是直接连进游戏登录阶段客户端先访问登录网关dnf-gate-serverHTTP 端口5505启用 HTTPS 后为5504完成账号校验并获取频道信息进频道阶段客户端再与 Game ServerChannel如siroco11建立连接进入地图。四层防护恰好卡在这两个阶段的要害上防护层保护对象对应机制AES 密钥登录器 ↔ 网关的通讯内容GATE_AES_KEYRSA 公私钥登录身份与签名校验privatekey.pem/publickey.pemHTTPS 网关登录请求的传输通道GATE_TLS_*环境变量GeoIP 白名单频道连接的来源 IPd_taiwan.geo_allow表各环境变量的完整说明见 doc/OtherDeploy.md。二、AES 通讯密钥给登录器与网关之间加把锁 GATE_AES_KEY是dnf-gate-server与登录器之间的对称通讯密钥登录器用它加解密与网关交互的数据。密钥两端必须一致服务端启动容器时通过环境变量传入见 README.md 的快速开始章节客户端在登录器dnf-launcher.exe的设置中填写相同的值。⚠️ 密钥必须是恰好 64 位的十六进制字符串0-9、a-f。强烈建议自己生成例如在 Linux 上执行openssl rand -hex 32。文档中的默认值属于公开信息照抄等于不设防。新手最常踩的两个坑来自 README.md 常见问题 4/5AES key must be exactly 64 hex characters—— 密钥长度不足或多了换行符AES key must contain only hex characters—— 混入了非十六进制字符。两边配置完全一致后登录器保存即可。三、RSA 公私钥首次部署自动生成杜绝公开密钥风险这是 dnf 项目相比老版本部署的一个关键安全设计项目镜像里没有内置任何公开的游戏公私钥而是在你初次部署时现场生成一对全新密钥。初始化逻辑位于 build/dnf_data/etc/s6-overlay/scripts/init.d/init-data.sh核心行为有三步若/data/privatekey.pem不存在执行openssl genrsa生成2048 位 RSA 私钥用模数比对openssl rsa -noout -modulus校验公钥publickey.pem是否与私钥匹配匹配则保持不变不匹配时提示并可选用私钥重新导出公钥。随后公钥会被分发到游戏进程目录见 init-data.sh 第 161 行供频道侧做登录校验私钥路径由RSA_PRIVATE_KEY_PATH默认/data/privatekey.pem指定。为什么这件事很重要官方 README.md 常见问题 19 明确警告如果使用其他内置了公开私钥的登录器一旦你的PUBLIC_IP泄露攻击者无需账号密码即可游玩你服务端任意角色。所以保持使用本项目配套的 llnut 登录器 自动生成的密钥对/data目录挂载在宿主机上privatekey.pem请妥善保管、不要外传若网关与游戏服务端不在同一台机器、公钥需要重建可设置PUBKEY_OVERWRITEtrue详见 doc/OtherDeploy.md。四、HTTPS 登录网关一行环境变量开启传输加密 默认情况下登录网关只监听 HTTP5505账号请求是明文传输的。开启 HTTPS 只需两步把你的 TLS 证书和私钥放到挂载的/data目录中设置两个环境变量后重启容器参考 README.md 常见问题 10GATE_TLS_CERT_PATH证书路径GATE_TLS_KEY_PATH私钥路径两者同时设置后网关自动在GATE_TLS_BIND_ADDRESS默认0.0.0.0:5504上提供 HTTPS。此时登录器中的服务器地址要由http://${PUBLIC_IP}:5505改为https://${PUBLIC_IP}:5504。如果希望彻底拒绝明文 HTTP再把GATE_TLS_ONLY设为true网关将只接受 HTTPS 连接。配合云厂商免费证书如 Lets Encrypt即可零成本获得全站加密。五、GeoIP 白名单把陌生地区 IP 挡在频道门外 DNF 服务端进程df_game_r启动时会加载 GeoIP 数据库按 IP 归属国校验每一次频道连接。启动成功的频道日志中会看到[09:40:23] GeoIP Allow Country Code : CN [09:40:23] GeoIP Allow Country Code : TW(CN)白名单存储在数据库表d_taiwan.geo_allow中由容器内置定时任务自动维护scheduler.sh 第 92-98 行默认每GEO_ALLOW_INTERVAL3600 秒执行一次把容器 IP 与网关 IP 加入白名单启动后是否立即执行由GEO_ALLOW_RUN_ON_START控制默认true具体写入逻辑在 user-script.sh 中你可以直接编辑该脚本追加自己的 IP或收紧允许的国家代码。被拦截了怎么办若玩家连频道时网络中断多半是 GeoIP 拦截频道日志会打印被拦的 IP参考 doc/OtherDeploy.md[16:02:51] ... [Taiwan, GeoIP] Fail Account:18000000, IP:192.168.48.1, CountryCode:把日志中的192.168.48.1写入geo_allow白名单后重启服务即可放行。这一层相当于给频道加了一道按地域准入的闸机能有效减少来自陌生地区扫描器的无效连接。六、进阶加固建议 ️在四层基础防护之上再花两分钟做三件事关闭新用户注册GATE_REGISTRATION_OPENfalse网关将拒绝一切注册请求适合只接待固定玩家的服务器收紧网络暴露面数据库外部访问走3000端口容器内 3306 由代理转发非必要不要在云服务器安全组中放行它开启数据库自动备份DB_BACKUP_ENABLEtrue默认保留DB_BACKUP_KEEP7份安全事件的兜底手段配置细节见 doc/OtherDeploy.md。七、安全配置速查表配置项默认值建议操作GATE_AES_KEY文档内置示例值必须自行生成 64 位十六进制密钥/data/privatekey.pem首次启动自动生成妥善保管切勿使用公开密钥GATE_TLS_CERT_PATH/GATE_TLS_KEY_PATH未启用填入证书路径开启 HTTPSGATE_TLS_ONLYfalse启用 HTTPS 后建议设为trueGATE_REGISTRATION_OPENtrue固定玩家后建议设为falsed_taiwan.geo_allow定时任务自动维护按日志追加玩家 IP / 收紧国家码总结dnf 项目把 DNF 私服的四大核心防护——AES 密钥、RSA 公私钥、HTTPS 网关、GeoIP 白名单——都做成了环境变量级的简单开关。新手只需记住顺序换掉默认 AES 密钥 → 保持自动生成的 RSA 密钥对 → 开启 HTTPS → 按需维护 GeoIP 白名单你的私服安全水位就会超过绝大多数同类部署。免责声明本项目仅供学习与研究使用请勿用于公开商业开服。赞分享游戏开发云原生DevOps运维【免费下载链接】dnf项目地址https://gitcode.com/gh_mirrors/dnf4/dnf点击查看免费下载相关推荐Paramiko密钥类型全解析RSA、ECDSA、Ed25519如何选私钥加载与密码保护教程Paramiko密钥类型全解析RSA、ECDSA、Ed25519如何选私钥加载与密码保护教程 Paramiko 是 Python 生态中领先的 SSH网络通信密码学身份认证【亲测免费】 SwiftyRSASwift中的RSA公钥/私钥加密库SwiftyRSASwift中的RSA公钥/私钥加密库 1. 项目基础介绍和主要编程语言 SwiftyRSA 是一个开源的 Swift 库专门用于在 iOScangjie_stdx keys 包密钥类全解ECDSA、RSA、SM2 私钥/公钥的生成、编解码与签名验签实战cangjie_stdx keys 包密钥类全解ECDSA、RSA、SM2 私钥/公钥的生成、编解码与签名验签实战 本文档以仓颉标准库扩展模块 stdx.cr标准库上一篇小红书内容下载工具XHS-Downloader技术原理与多场景应用指南下一篇LinkSwift 网盘直链下载助手9 大网盘一键获取直链的安装与配置指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考