将nginx用作Minecraft的代理

首先

就像我们所知道的那样,nginx是一个Web服务器,但它也可以用作负载均衡器。
这次我们想要将nginx用作minecraft多服务器的前端服务器(TCP反向代理)来进行实验。

minecraftに限らず、サービスを動かすサーバーに直接接続させずにリバースプロキシを経由させることはセキュリティ的に意味のある事だと思います。
また、自宅サーバーを立てている場合にVPS等をリバースプロキシとして使用することで、レイテンシを犠牲にDoS攻撃のリスクを回避できる可能性があります。
VPSを利用したリバースプロキシは自宅サーバーを立てる際に障害となる固定IPアドレス問題の解決策でもあります。

つくるもの

VirtualBoxを使用してローカル環境で実験をしていきます。
※VirtualBoxはこういった遊びができるのでいいですよね。

20180131(3).png

※図はdraw.ioを使用して作成しました。

VirtualBox上に二つの仮想マシンを用意します。
一方はnginxマシン、もう一方はminecraftマシンとして使用します(以降この呼び分けに注意)。
この二つは互いに内部ネットワークで接続します。
ホストOSからはnginxマシンにNATで接続します。

从主机操作系统连接到Nginx机器后,通过Nginx转发连接到Minecraft机器。

準備所需之物品

    VirtualBox上のCentOS7をインストールした仮想マシンx2

虚拟盒(VirtualBox)的下载链接:http://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp
CentOS 7的下载链接:https://www.centos.org/download/

开始实验

虚拟机的初始配置

为了避免设置错误,我们可以更改主机名来处理两个虚拟机。这项工作并非必需,但为了预防事故,我们还是做一下吧。

参考:https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/sec_configuring_host_names_using_hostnamectl

[root@localhost ~]# hostnamectl set-hostname minecraft01

ログインしなおして、設定が反映されていることを確認しましょう。

[root@minecraft01 ~]#

我們也會更改為用於 Nginx 的虛擬機。

[root@localhost ~]#  hostnamectl set-hostname nginx01

请通过主机名来区分在下面的说明中操作哪个虚拟机。

NAT的设置。

让我们在nginx主机的配置中进行NAT端口转发的设置。这是在上图中,为了让主机OS能够通过25565端口连接到nginx进行的设置。

image.png
image.png

内部网络配置 de

增加适配器

为了使两台虚拟机之间能够通信,需要进行网络设置。
在进行这个设置时,请确认虚拟机的电源已关闭。

image.png
    1. ネットワークの項目を開き、アダプター2を選択します

 

    「ネットワークアダプターを有効化」にチェックを入れ割り当てを内部ネットワークに指定します

任何名字都可以,但要与另一台虚拟机相同。

启用适配器并进行IP设置

启动虚拟机。

そのままでは追加したネットワークアダプターは有効になっていないので、有効にします(同時にIPアドレスを設定します)。

[root@nginx01 ~]# nmcli d
デバイス  タイプ    状態                       接続
enp0s3    ethernet  接続済み                   enp0s3
enp0s8    ethernet  接続中(IP 設定を取得中)  有線接続 1
lo        loopback  管理無し  
[root@nginx01 ~]# nmcli c add type ethernet ifname enp0s8 con-name enp0s8
接続 'enp0s8' (f2bff77f-da44-4744-89b7-2ff70309dba1) が正常に追加されました。
[root@nginx01 ~]# nmcli c m enp0s8 ipv4.method manual ipv4.addresses 192.168.0.1/24 connection.autoconnect true
[root@nginx01 ~]# nmcli d
デバイス  タイプ    状態      接続
enp0s3    ethernet  接続済み  enp0s3
enp0s8    ethernet  接続済み  enp0s8
lo        loopback  管理無し  --

nginxマシンのIPを192.168.0.1に設定しました。
同様の操作でminecraftマシンのIPを192.168.0.2に設定します。

下一步,我们要确保虚拟机之间可以进行通信。

[root@minecraft01 ~]# ping 192.168.0.1 -c 3
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=0.237 ms
64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=0.426 ms
64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=0.682 ms

--- 192.168.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.237/0.448/0.682/0.183 ms

我从Minecraft机器向192.168.0.1(nginx机器)发送了ping请求。

安装和配置nginx。

要在Nginx中使用TPC模式,您需要自己构建它。
参考(官方):https://www.nginx.com/resources/admin-guide/tcp-load-balancing/

建筑

让我们一起进行构建。
※请各自安装gcc、git等软件。

通过使用”with-stream”选项,它将在TCP/UDP模式下运行。

# nginxのリポジトリをクローン
[root@nginx01 nginx]# git clone https://github.com/nginx/nginx
# ビルド
[root@nginx01 nginx]# cd nginx
[root@nginx01 nginx]# ./auto/configure --prefix=/usr/local/nginx --without-http_rewrite_module --without-http_gzip_module --with-stream
[root@nginx01 nginx]# make && make install

指定pid文件

让我们检查一下设置文件的位置。

[root@nginx01 nginx]# ls /usr/local/nginx/conf/nginx.conf
/usr/local/nginx/conf/nginx.conf

由于pid文件的设置已被注释掉,所以将进行以下更改。

pid        /var/run/nginx.pid;

systemd的配置

我将创建一个用于systemd的配置文件。

[root@nginx01 nginx]# emacs /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target

这个写法只是一个例子。
因为我不知道怎么写,所以我借鉴了yum安装nginx的配置(如果写法有误,请谅解)。

确认启动

[root@nginx01 nginx]# systemctl start nginx
[root@nginx01 nginx]# systemctl status nginx
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2018-02-01 01:49:49 JST; 5s ago
     Docs: http://nginx.org/en/docs/
  Process: 14972 ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf (code=exited, status=0/SUCCESS)
  Process: 14971 ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf (code=exited, status=0/SUCCESS)
 Main PID: 14974 (nginx)
   CGroup: /system.slice/nginx.service
           ├─14974 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
           └─14976 nginx: worker process

 2月 01 01:49:49 nginx01 systemd[1]: Starting nginx - high performance web server...
 2月 01 01:49:49 nginx01 nginx[14971]: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
 2月 01 01:49:49 nginx01 nginx[14971]: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is ...ssful
 2月 01 01:49:49 nginx01 systemd[1]: Failed to read PID from file /var/run/nginx.pid: Invalid argument
 2月 01 01:49:49 nginx01 systemd[1]: Started nginx - high performance web server.
Hint: Some lines were ellipsized, use -l to show in full.
[root@nginx01 nginx]#

有一些不安的字符出现了,并且出现了“无法从文件/var/run/nginx.pid读取PID:参数无效”的错误信息,但它仍能够启动(我不知道如何修复这个问题)。

TCP反向代理的配置参数

请按照以下方式修改配置文件。
由于这只是一个示例,您可以根据需要进行适当修改和使用。

worker_processes  1;

pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}
stream {
    upstream mcserver {
        server 192.168.0.2:25565;
        server 127.0.0.1:25566 backup;
    }
    server {
        listen     25565;
        proxy_pass mcserver;
    }
}

如果无法连接到Minecraft机器上的Minecraft服务器,则设置服务器127.0.0.1:25566备份来连接到Nginx机器上的本地Minecraft服务器。

最后,我们需要进行防火墙的配置。

[root@nginx01 nginx]# firewall-cmd --add-port=25565/tcp --zone=public --permanent
success
[root@nginx01 nginx]# firewall-cmd --reload
success

现在nginx已经准备就绪。
接下来,我们来准备Minecraft服务器吧。

搭建Minecraft服务器

如果按照nginx的设置无法连接到minecraft机器上的minecraft服务器,那么我们希望能够连接到nginx机器上的minecraft服务器,所以我们在两台虚拟机上都安装minecraft服务器。

请注意,为了避免与Nginx监听的端口冲突,Minecraft服务器在Nginx服务器上将使用25566端口进行启动。由于这是本地访问,所以无需进行防火墙设置。

今回は設定しませんが、minecraftマシンにはnginxマシンからしかアクセスしないので192.168.0.1からの接続だけを通すfirewallの設定にするとよいと思います。

我们开始设定吧。

安装Minecraft服务器

安装Java

[root@minecraft01 ~]# yum  -y install java-1.8.0-openjdk.x86_64

下载Minecraft服务器

[root@minecraft01 ~]# mkdir server
[root@minecraft01 ~]# cd server/
[root@minecraft01 server]# wget https://s3.amazonaws.com/Minecraft.Download/versions/1.12.2/minecraft_server.1.12.2.jar

启动 (qǐ

java -Xmx1024M -Xms1024M -jar minecraft_server.1.12.2.jar nogui

在初次启动时需要同意 EULA (将 eula.txt 文件更改为 eula=true)。更改后再次执行启动命令(这时会生成 server.properties 文件)。

在使用stop命令停止Minecraft服务器后,我们将进入设置。

设定

修改motd的值,使得连接的服务器更易于识别。
仅适用于Minecraft服务器。
进行防火墙设置。

[root@minecraft01 server]# firewall-cmd --add-port=25565/tcp --zone=public --permanent
success
[root@minecraft01 server]# firewall-cmd --reload
success

编辑 server.properties 文件,将 motd 的值更改为 minecraft machine。

nginxマシンのみ
minecraftサーバーのポートを25566番ポートに変更します。
server.propertiesを編集してserver-portの値を25566に設定します。

server.propertiesを編集してmotdの値をnginx machineに変更します。

试着从主机操作系统进行连接。

ここまでで図で示したものが出来上がっているはずです。
minecraftクライアントから接続してみましょう。

在启动了Minecraft服务器和Nginx的情况下,使用Minecraft客户端连接本地。

image.png

当Minecraft机器上的Minecraft服务器已启动时,在服务器选择画面上应该可以看到Minecraft机器的文字。

image.png

当Minecraft服务器在Minecraft机器上停止运行时,您应该在服务器选择界面上看到“nginx机器”的文字。

image.png

事实上,这个世界的内涵也发生了变化。

このような構成にすることで、外から見るとminecraftサーバーを停止せず(詳しくは説明しませんが、pingパケットがちゃんと処理されるということです)にメンテナンスをすることができます。
また、バックアップサーバーのほうに看板等でメッセージを残すこともできます。

总结

我将Minecraft服务器作为一个使用Nginx作为TCP反向代理的示例进行了搭建。个人觉得在搭建家用服务器时,反向代理非常有用,所以将其总结了一下。希望对您有所帮助。

广告
将在 10 秒后关闭
bannerAds