木须柄的时光工坊

探索技术与游戏乐趣的奇妙之旅

目录
部署生化危机:爆发服务器 2024 年版
/        

部署生化危机:爆发服务器 2024 年版

image-20240123173720540

1多年前我曾研究部署过生化爆发的联机服务器,现在打算将其迁移到新服务器上,顺便做一些简单的升级更新。感谢猫猫和菲哥的支持和协助测试。

一、配置服务器环境

1.1 创建 observer 用户,并配置管理员权限

 1# 创建 observer 用户
 2# 此时会需要你设置用户密码,这里我默认设置为 admin
 3adduser observer
 4
 5# 赋予管理员权限
 6usermod -aG sudo observer
 7
 8# 编辑 sudoers 文件
 9visudo
10
11# 在这里添加一行
12# User privilege specification
13root    ALL=(ALL:ALL) ALL
14observer   ALL=(ALL:ALL) ALL
15
16# 测试 sudo 权限
17su - observer
18sudo apt-get update
1输入用户密码后,如果命令可以成功执行并且不出现权限错误,那么用户 observer 已经获得了管理员权限。

1.2 安装基本依赖

 1# 基本工具:
 2$ sudo apt install -y git wget unzip screen
 3
 4# gcc 编译:
 5$ sudo apt install -y make gcc
 6
 7# DNSMasq 服务: 
 8$ sudo apt install -y dnsmasq dnsutils
 9
10# 数据库服务: MySQL 或 MariaDB 均可 
11$ sudo apt install -y mariadb-server mariadb-client
1213$ sudo apt install -y mysql-server mysql-client
14
15# PHP 服务: 
16$ sudo apt install -y php7.4-fpm php7.4-mysql
17
18# JAVA 服务: 
19$ sudo apt install -y openjdk-17-jre-headless openjdk-17-jre default-jdk
20
21# openssl 服务
22$ sudo apt install -y openssl libssl-dev
23
24# Apache 2 服务依赖: 
25$ sudo apt install -y libpcre3 libpcre3-dev libexpat1 libexpat1-dev libxml2 libxml2-dev libxslt1-dev libxslt1.1

注:在 Debian 12 的 PHP 默认版本为 8.3,安装 7.4 版本需要首先添加 PHP 软件包源,方法如下:

1sudo apt install software-properties-common ca-certificates lsb-release apt-transport-https
2sudo sh -c 'echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
3wget -qO - https://packages.sury.org/php/apt.gpg | sudo apt-key add -
4sudo apt update

添加新软件包源之后,再执行安装 apt install php7.4-fpm php7.4-mysql

此时可以测试一下能否正常访问容器外部的数据库。

1mariadb -h <your_host_ip> -u <username> -p <password> -P <port> <database_name>

1.3 安装 OpenSSL 服务

虽然 Liunx 系统一般内置了 OpenSSL 服务,但是这里仍必须从源码安装旧版,使用旧版 SSL 1.0 协议,以适配 PS2 对应的 WEB 服务的需要。

 1# 下载 OpenSSL
 2$ wget https://www.openssl.org/source/openssl-1.0.2q.tar.gz
 3
 4# 解压
 5$ tar xzvf openssl-1.0.2g.tar.gz
 6
 7# 编译安装
 8$ cd openssl-1.0.2g
 9$ sudo ./config --prefix=/opt/openssl-1.0.2 --openssldir=/etc/ssl shared enable-weak-ssl-ciphers enable-ssl3 enable-ssl3-method enable-ssl2 -Wl,-rpath=/opt/openssl-1.0.2/lib  # 配置
10$ sudo make depend
11$ sudo make  # 编译
12$ sudo make install  # 安装
13
14# 测试密钥
15$ openssl ciphers -V 'ALL' | grep 0x13
16    0xC0,0x13 - ECDHE-RSA-AES128-SHA    SSLv3 Kx=ECDH     Au=RSA  Enc=AES(128)  Mac=SHA1
17    0x00,0x13 - EDH-DSS-DES-CBC3-SHA    SSLv3 Kx=DH       Au=DSS  Enc=3DES(168) Mac=SHA1
18  
19# 配置 Apache 调用文件,添加以下信息
20# /etc/ld.so.conf.d/$(uname -m)-linux-gnu.conf
21# 树莓派
22$ sudo vim /etc/ld.so.conf.d/arm-linux-gnueabihf.conf
23# CentOS 7
24$ sudo vim /etc/ld.so.conf.d/$(uname -m)-linux-gnu.conf
25    # custom OpenSSL
26    /opt/openssl-1.0.2/lib
27$ sudo ldconfig

1.4 安装 Apache 服务

下载 Apache 2,这里使用国内的阿里源

 1# 下载 Apache 2, Apache Apr, Apache apr-util
 2$ sudo wget https://mirrors.aliyun.com/apache/httpd/httpd-2.4.58.tar.gz
 3$ sudo wget https://mirrors.aliyun.com/apache/apr/apr-1.7.4.tar.gz
 4$ sudo wget https://mirrors.aliyun.com/apache/apr/apr-util-1.6.3.tar.gz
 5
 6# 解压 Apache 2, Apache Apr, Apache apr-util
 7$ sudo tar zxvf httpd-2.4.58.tar.gz
 8$ sudo tar zxvf apr-1.7.4.tar.gz
 9$ sudo tar zxvf apr-util-1.6.3.tar.gz
10
11# 将解压后的 Apache Apr, Apache apr-util 放入 ./httpd-2.4.48/srclib 目录下
12$ sudo mv apr-1.7.4 apr-util-1.6.3 httpd-2.4.58/srclib
13
14# 进入 Apache 2 下的 srclib 目录
15$ cd httpd-2.4.58/srclib/cd h
16
17# 建立软链接
18$ sudo ln -s apr-1.7.4 apr
19$ sudo ln -s apr-util-1.6.3 apr-util
20
21# 回到 ./httpd-2.4.48 目录下
22# 这里 apache 安装的目录为 /opt/apache
23# 后面以此为准,如果有修改目录需要一并修改
24# 配置安装
25$ cd ..
26$ sudo ./configure --prefix=/opt/apache --with-included-apr --with-ssl=/opt/openssl-1.0.2 --enable-ssl
27
28# 编译安装
29$ sudo make
30$ sudo make install

打开 /opt/apache/bin/envvars 文件

1$ vim /opt/apache/bin/envvars

添加如下信息

1if test "x$LD_LIBRARY_PATH" != "x" ; then
2    LD_LIBRARY_PATH="/opt/apache/lib:$LD_LIBRARY_PATH"
3else
4    LD_LIBRARY_PATH="/opt/apache/lib"
5fi
6# Add the below line between "fi" and "export LD_LIBRARY_PATH"
7LD_LIBRARY_PATH="/opt/openssl-1.0.2/lib:$LD_LIBRARY_PATH"
8export LD_LIBRARY_PATH

添加 /etc/systemd/system/apache.service 服务

1$ sudo vim /etc/systemd/system/apache.service

添加如下信息

 1[Unit]
 2Description=Apache Server for Outbreak
 3
 4[Service]
 5Type=forking
 6EnvironmentFile=/opt/apache/bin/envvars
 7PIDFile=/opt/apache/logs/httpd.pid
 8ExecStart=/opt/apache/bin/apachectl -k start
 9ExecReload=/opt/apache/bin/apachectl graceful
10ExecStop=/opt/apache/bin/apachectl -k stop
11KillSignal=SIGCONT
12PrivateTmp=true
13
14[Install]
15WantedBy=multi-user.target

确定端口没有问题后,可以开启 apache 服务了

1# 开启 apache 服务
2$ sudo systemctl enable apache.service
3$ sudo systemctl start apache

另外如果有设置,记得打开防火墙和 VPS 的安全组规则

1# 防火墙打开端口
2$ ufw allow <custom_port>/tcp

此时在浏览器输入服务器 IP:<custom_port>,会显示 "Its works!" 的字样,这样就代表 apache 环境配置成功了。

1.5 配置 DNS 解析

由于 PS2 的网络服务早已关闭,因此我们需要将一部分域名解析的工作放到本地机器。这里使用 dnsmasq 来实现这一需求。

编辑 dnsmasq 配置文件 /etc/dnsmasq.conf ,在文件中添加以下两行

1$ vim /etc/dnsmasq.conf

注:这里的服务器 IP 填写其公网 IP,以供对外主机查询访问

1# 用服务器 IP 替换 XXX.XXX.XXX.XXX
2address=/gate1.jp.dnas.playstation.org/XXX.XXX.XXX.XXX
3address=/www01.kddi-mmbb.jp/XXX.XXX.XXX.XXX

取消 listen-address= 的注释,添加服务器 IP 和本机地址。

注:这里的服务器 IP 要填写其局域网 IP,可以用 ifconfig 命令查看,比如其公网 IP 为 1.2.3.4,内网 IP 为 192.168.1.1,则这里填写 listen-address=192.168.1.1,127.0.0.1

1listen-address=XXX.XXX.XXX.XXX,127.0.0.1

然后设置 DNS 解析文件 resolv.conf

1$ vim /etc/resolv.conf

将服务器 IP 添加进列表

1# 默认的 DNS 解析保持原样
2nameserver 100.100.2.136
3nameserver 8.8.8.8
4
5# 添加自定义 DNS 解析 IP
6nameserver XXX.XXX.XXX.XXX

(可选)如果需要详细分类解析文件,可以在 dnsmasq.conf 打开 resolv-file 的注释,这个参数表示 dnsmasq 会从这个指定的文件中寻找上游 DNS 服务器。

1# 示例
2resolv-file=/etc/resolv.dnsmasq.conf
1# 添加自定义 DNS 解析 IP
2nameserver XXX.XXX.XXX.XXX

同样的,DNS 解析的端口默认是 53,记得打开防火墙和 VPS 的安全组规则

1# 防火墙打开端口
2$ ufw allow 53

然后重启 dnsmasq 服务,并测试 DNS 自定义解析是否成功。

1# 重启 dnsmasq 服务
2$ sudo systemctl restart dnsmasq
3
4# 测试 DNS 解析
5$ nslookup gate1.jp.dnas.playstation.org XXX.XXX.XXX.XXX
6$ nslookup www01.kddi-mmbb.jp XXX.XXX.XXX.XXX
7
8$ dig @XXX.XXX.XXX.XXX -p 53 gate1.jp.dnas.playstation.org
9$ dig @XXX.XXX.XXX.XXX -p 53 www01.kddi-mmbb.jp

1.5 配置 DNAS 验证

DNAS 服务建立在运行几个 PHP 脚本的 Web 服务器之上。最大的问题是 SSL 创建所需的证书。

首先导入 DNAS 文件和 SSL 证书

1$ git clone https://github.com/corbin-ch/DNASrep.git
2$ sudo mv DNASrep/etc/dnas /etc/dnas
3$ sudo chown -R 0:0 /etc/dnas
4$ sudo mkdir /var/www
5$ sudo mv DNASrep/www/dnas /var/www/dnas
6$ sudo chown -R www-data:www-data /var/www/dnas

再次编辑 Apache 的 http.conf,我们需要启用一些模块才能拥有 SSL 和 PHP 功能。

1$ sudo vim /opt/apache/conf/httpd.conf

查询以下每一行的信息,并取消注释

1LoadModule proxy_module modules/mod_proxy.so
2LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
3LoadModule ssl_module modules/mod_ssl.so
4LoadModule rewrite_module modules/mod_rewrite.so

将下面这段

 1    <IfModule unixd_module>
 2    #
 3    # If you wish httpd to run as a different user or group, you must run
 4    # httpd as root initially and it will switch.
 5    #
 6    # User/Group: The name (or #number) of the user/group to run httpd as.
 7    # It is usually good practice to create a dedicated user and group for
 8    # running httpd, as with most system services.
 9    #
10    User daemon
11    Group daemon
12
13    </IfModule>

替换成:

 1<IfModule unixd_module>
 2#
 3# If you wish httpd to run as a different user or group, you must run
 4# httpd as root initially and it will switch.
 5#
 6# User/Group: The name (or #number) of the user/group to run httpd as.
 7# It is usually good practice to create a dedicated user and group for
 8# running httpd, as with most system services.
 9#
10User www-data
11Group www-data
12
13</IfModule>
14

在文件最后添加以下信息

 1<IfModule ssl_module>
 2Listen *:443
 3SSLEngine on
 4# nail it to the securest cipher PS2 understands DHE-RSA-DES-CBC3-SHA
 5# check this with openssl
 6SSLCipherSuite DHE:!DSS:!AES:!SEED:!CAMELLIA!TLSv1.2
 7SSLCertificateFile /etc/dnas/cert-jp.pem
 8SSLCertificateKeyFile /etc/dnas/cert-jp-key.pem
 9SSLCertificateChainFile /etc/dnas/ca-cert.pem
10ServerName gate1.jp.dnas.playstation.org
11ServerAdmin webmaster@localhost
12DocumentRoot /var/www/dnas
13<Directory />
14Options FollowSymLinks
15AllowOverride None
16</Directory>
17<Directory "/var/www/dnas">
18Options -Indexes
19Require all granted
20</Directory>
21# rewrite some URLs
22RewriteEngine on
23RewriteRule ^(/.*)/v2\.5_i-connect$ $1/connect.php [PT]
24RewriteRule ^(/.*)/i-connect$ $1/connect.php [PT]
25RewriteRule ^(/.*)/v2\.5_d-connect$ $1/connect.php [PT]
26RewriteRule ^(/.*)/v2\.5_others$ $1/others.php [PT]
27RewriteRule ^(/.*)/others$ $1/others.php [PT]
28# send this to php-fpm socket (needs write access!)
29# 注意这里根据 php7.x-fpm.sock 对应的版本切换
30<FilesMatch "\.php$">
31SetHandler "proxy:unix:/var/run/php/php7.4-fpm.sock|fcgi://127.0.0.1"
32</FilesMatch>
33ErrorLog /opt/apache/logs/dnas_error.log
34# Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
35LogLevel warn
36CustomLog /opt/apache/logs/dnas_access.log combined
37<FilesMatch "\.(cgi|shtml|phtml|php)$">
38SSLOptions +StdEnvVars
39</FilesMatch>
40<Directory /usr/lib/cgi-bin>
41SSLOptions +StdEnvVars
42</Directory>
43# we need to downgrade protocol for the DNAS browser
44BrowserMatch "open sesame asdfjkl" \
45nokeepalive ssl-unclean-shutdown \
46downgrade-1.0 force-response-1.0
47</IfModule>

重启 apache 服务

1$ sudo systemctl restart apache

从其他机器上测试 DNS 服务状态

1$ sudo wget --no-check-certificate -O - https://gate1.jp.dnas.playstation.org/gai-gw/v2.5_i-connect

二、备份数据

首先需要备份数据库文件,还有服务端的文件。

2.1 备份 MySQL 数据库

使用 mysqldump 命令来导出数据库。在终端或命令行中执行以下命令:

1mysqldump -u [用户名] -p[密码] bioserver > bioserver_backup.sql
2mysqldump -u [用户名] -p[密码] bioserver2 > bioserver2_backup.sql

这将在当前目录下创建两个备份文件:bioserver_backup.sqlbioserver2_backup.sql

将备份文件传输到新的 MySQL 服务器,可以使用 scp 或其他文件传输工具。

1scp bioserver_backup.sql [新服务器用户名]@[新服务器IP地址]:/path/to/destination
2scp bioserver2_backup.sql [新服务器用户名]@[新服务器IP地址]:/path/to/destination

新服务器安装完数据库后,添加 bioserver 用户名,并导入服务端数据

 1# 进入 mysql
 2$ mysql -u root -p password
 3
 4# 添加 bioserver 用户,密码设置为 admin
 5MariaDB [(none)]> create user "bioserver"@"localhost" identified by "admin";
 6
 7# 设定用户 bioserver 密码
 8mysql> set password for bioserver@localhost = password('admin')
 9
10mysql> ALTER USER 'bioserver'@'localhost' IDENTIFIED BY 'admin';
11
12# 授予 bioserver 用户权限
13MariaDB [(none)]> GRANT ALL ON *.* TO 'bioserver'@'localhost';
14
15# 删除 bioserver 用户密码 (参考)
16MariaDB [(none)]> use mysql;  # 选择 mysql 数据库
17MariaDB [mysql]> select host, user, password from user;  # 查看用户, 密码信息
18MariaDB [mysql]> update user set password=password("") where user="bioserver";  # 删除用户 bioserver 密码信息
19MariaDB [(none)]> flush privileges;  # 刷新权限信息
20
21# 查看当前所有用户
22MariaDB [(none)]> select user,host from mysql.user;
23
24# 导入数据表 (爆发1,2 分别有一个 database 数据库)
25$ sudo mysql -u bioserver -p < ./database/bioserver.sql
26
27# 若导入数据时出现 Access Denied,则注释掉开头的这几行(`--`),并手动建立数据库
28CREATE USER 'bioserver'@'localhost' IDENTIFIED BY 'admin';
29CREATE DATABASE IF NOT EXISTS `bioserver2` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
30GRANT ALL PRIVILEGES ON `bioserver2`.* TO 'bioserver'@'localhost'; 
31

在新的 MySQL 服务器上,使用以下命令导入数据库:

1mysql -u [新服务器用户名] -p[新服务器密码] bioserver < /path/to/destination/bioserver_backup.sql
2mysql -u [新服务器用户名] -p[新服务器密码] bioserver2 < /path/to/destination/bioserver2_backup.sql

这样,就完成了数据库备份和导入操作。

2.2 备份服务端数据

打包整个 obsrv 服务端,然后上传到新服务器。

1# 打包
2tar -zcvf obsrv-chn.tar.gz obsrv-chn/
3
4# 解包
5tar -zxvf obsrv-chn.tar.gz

三、安装爆发服务端

下载解压服务端文件

 1# 设置 DNAS 验证
 2$ sudo cp -r DNAS/etc/dnas/ /etc/dnas
 3$ sudo chown -R 0:0 /etc/dnas
 4$ sudo mkdir /var/www
 5$ sudo mv DNAS/www/dnas /var/www/dnas
 6$ sudo chown -R www-data:www-data /var/www/dnas
 7
 8# 复制服务端大厅页面文件 (FILE1, FILE2)
 9$ cd ./obsrv/FILE1
10$ sudo mkdir /var/www/bhof1
11$ sudo cp -r www/* /var/www/bhof1
12$ sudo chown -R www-data:www-data /var/www/bhof1
13$ sudo ln -s /var/www/bhof1 /var/www/dnas/00000002
14$ sudo vim /var/www/bhof1/db_cred.php

配置服务器地址

1这里将根据自己的服务器地址配置爆发的 JAVA 服务端
 1# 检查服务器本机 IP
 2# 其中 eth0:inet 即为本地 IP
 3# 如果部署在云端,则需要外部访问的公网 IP
 4$ ifconfig
 5
 6# 修改爆发的 JAVA 服务端配置文件 config.properties
 7# 或修改对应的脚本 file1config.sh, file2config.sh 
 8$ sudo vim config.properties
 9	# Configuration for the server
10
11    # IP address for gameserver (your machine IP)
12    # 注意这里在云端需要用公网 IP
13    gs_ip=XXX.XXX.XXX.XXX
14
15	# credentials for the database
16	db_user=bioserver
17	db_password=admin
18

设置防火墙和开放端口

服务端需要开放 443, 8200, 8300, 8590, 8690, 8095, 8096 端口

安装 ufw 防火墙后配置

 1# 安装
 2$ sudo apt-get install ufw
 3
 4# 使用方法
 5$ sudo ufw enable/disable # 防火墙启动/停止
 6$ sudo ufw allow 80 # 允许外部访问 80 端口
 7$ sudo ufw delete allow 80 # 禁止外部访问 80 端口
 8$ sudo ufw reload # 重新加载防火墙
 9$ sudo ufw status # 查看防火墙开放端口
10$ sudo ufw allow from 192.168.1.1 # 允许此IP访问所有的本机端口
11$ sudo ufw deny smtp # 禁止外部访问smtp服务
12$ sudo ufw delete allow smtp # 删除上面建立的某条规则
13$ sudo ufw defult deny    # 作用:开启了防火墙并随系统启动同时关闭所有外部对本机的访问
14
15# 完整配置命令 443,8200,8300,8590,8690
16$ sudo ufw enable
17$ sudo ufw allow 22
18$ sudo ufw allow 80
19$ sudo ufw allow 443
20$ sudo ufw allow 8200
21$ sudo ufw allow 8300
22$ sudo ufw allow 8590
23$ sudo ufw allow 8690
24$ sudo ufw allow 8095
25$ sudo ufw allow 8096

安装服务端

1# 赋予执行权限
2$ sudo chmod +x observice.sh
3
4# 编译服务端
5$ ./observice.sh build

启动服务端

1# 启动服务端
2$ ./observice.sh start

四、服务端升级更新

防炸服补丁

在服务端添加了猫猫写的防炸服补丁。默认的游戏服务端使用的是 8590, 8690 两个端口,如果使用浏览器直接访问这两个端口,较大的通信数据包会导致服务器占用达 100%。因此需要做防炸措施,限制数据包的大小。

在线列表页面

我在 Java 服务端直接编写一个简易 Web 服务线程,可以实时获取当前服务器的在线玩家和各种状态。其中爆发1代的端口默认是 ip:8095,2代的端口默认是 ip:8096 。页面效果如下:

image-20240123173720540

image-20240123173741370

评论
取消