OpenVPNとNginxでポート開放せずにポートフォワーディングしてみた話[Minecraft]

 

 

さてさてまたまた定期テスト1週間前なのに記事書いてるraspi0124です。テスト前に限って記事が書きたくなるのはなんでなんだろう🤔

というわけで今回はちょっと知り合いからポート開放せずにマイクラ鯖を立てたいという極めてめんどくさい依頼を受けたのでせっかくだし記事にしてみました。今後このようなめんどくさいことをやる方にとってこの記事が少しでも時間短縮の助けになりますように。

はじめに

ぶっちゃけpingとかラグさを気にしないのであればすでにNgrokという素晴らしいサービスが存在しているのでそちらを使うことをお勧めします。ラグいラグいといってもせいぜい100-200msなのでまあ生活鯖とかだと許容範囲でしょう。無料版にはちょっと制限がかかってるっぽいですがまあ小規模鯖なら十分だと思います。

やりたいこと

ポート開放がなされていない環境にあるMinecraftサーバー(マンション内)にHamachi等を使わずに(エンドユーザーから見て)普通にアクセスしたい。

こんな感じ

マイクラ鯖があらかじめ中継鯖のVPNに接続しておいてVPN上のプライベートIPを取得して中継鯖上のnginxが中継鯖の25565ポートに届いたトラフィックをすべてVPN上にあるマイクラ鯖(10.8.0.2)の25565ポートに転送

記事上では以下のような構成を仮定してやっていきます

マイクラ鯖=ポート開放されてない。VPNネットワーク上でのIPは10.8.0.2

中継鯖=VPNとかプロキシがここに乗ってる。VPS等パブリックな環境でグローバルIPあり。グローバルIPはここでは123.456.78とする

ちなみにOSはUbuntu 18.04 LTSを使ってます

やりかた

openvpnの構築[中継鯖]

めんどくさいので適当にスクリプトをググって見つけてきたのですがちょっと古くて微妙にエラー出たのでちょっと改造してみたのでよかったらどうぞ。選択肢を選んでいくだけで簡単に構築できるのでかなり便利です。

ちなみにフォーク元は https://github.com/Nyr/openvpn-install です。

https://github.com/raspi0124/openvpn-install/blob/master/openvpn-install.sh

wget https://raw.githubusercontent.com/raspi0124/openvpn-install/master/openvpn-install.sh && sudo chmod +x openvpn-install.sh && sudo bash openvpn-install.sh

とするとたぶんこんな感じの質問が出てくると思うのでまあ適当にやっておきましょう。わからなければコメントしてくれればできる範囲で教えます。たぶん2番目の中継鯖のグローバルipが聞かれているところ以外はすべてそのままEnter押していけば大丈夫なはずです。


さて構築が完了したらユーザーのホームディレクトリに(Enterを押し続けた場合)client.ovpnというファイルができていると思うのでそれをsftpなりなんなりでマイクラ鯖まで持っていきましょう。

 

VPNへの接続[マイクラ鯖]

続いてマイクラ鯖でさっき構築した中継鯖上のVPNへ接続していきましょう。screenで実行するのがおすすめです。

sudo apt install openvpn && sudo openvpn client.ovpn

といった感じのコマンドを実行してなんかいろいろ流れた後Initialization Sequence Completedと出れば成功です。

マイクラ鯖のVPN上でのプライベートIP[中継鯖]

さてさてようやく中間地点までたどり着きました。

cat /etc/openvpn/openvpn-status.log

を実行してみると接続クライアント一覧が見れます。

 

OpenVPN CLIENT LIST
Updated,Sun Feb 24 13:19:50 2019
Common Name,Real Address,Bytes Received,Bytes Sent,Connected Since
client,<マイクラ鯖のグローバルIP>:49091,5140,4893,
ROUTING TABLE
Virtual Address,Common Name,Real Address,Last Ref
10.8.0.2,client,<マイクラ鯖のグローバルIP>:49091,<日付>
GLOBAL STATS
Max bcast/mcast queue length,1
END

とりあえず6行目の10.8.0.2の部分を次のパートで使うのでどこかにメモしといてください。

HAPROXYを使ったやりかたはこちら

↑ちなみにたぶんHaproxy使ったほうが楽です

プロキシ(Nginx)鯖の構築[中継鯖] (HAProxyのほうが個人的におすすめです。↑のリンクをどうぞ)

iptableでもポートフォワーディングできるらしいのですがなんか上手く行かなかったのでおとなしくnginx使います。

基本的にはhttps://qiita.com/ttk1/items/007bf1623519dc614c1b#nginx%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A8%E8%A8%AD%E5%AE%9Aに沿って行けばいいのですがUbuntuだとsystemdの場所と書き方が違うのでそこだけ注意です。systemdの書き方とかは公式を参考にするといいと思います。ちなみにaptで入手したnginxではできないようなので注意してください。

参考までに自分のnginx.confを置いておきます。

#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid /run/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
stream {
upstream mcserver {
server 10.8.0.2:25565 weight=1;
#server 127.0.0.1:25566 backup;
}
server {
listen 25565;
proxy_pass mcserver;
}
}

とまあこんな感じです。注意点としては最初のほうにあるpidはsystemdのものと合わせないとうまく働かないので注意してください。あと10.8.0.2は一個前のパートの“マイクラ鯖のVPN上でのプライベートIPを確認”で確認したもので適当に置き換えないと動かない感じです。ファイヤーウォールの開放も忘れずに。

 

おしまい

あとはマイクラ鯖のほうでspigotなりなんなり立ち上げてあげれば中継鯖のIPアドレスでマイクラ鯖に接続できると思います。さすがにspigotのインストール方法とかはネット上に山ほどあるのでここでは解説しないでおきます。

あとめっちゃ眠い中書いたので日本語がよくわからなかったり意味が分からない部分があると思うのでわからなかったりしたらコメントしてください。

この記事を読んでくれてありがとうございました。

参考にさせていただいたサイト:

nginxをminecraftのプロキシとして使う

 

 

Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.