Windowsでトンネリング(ポートフォワード)で、純正のSSHを使うお話。

 サーバはLinux屋さんだし、VPNはルータで暗号化するのでちょっとお話変わってなのであるが。

 ある方が、お友達がDDOSに逢ってるので、SSHトンネリングで自分に持ってきて、そこからマインクラフトサーバ(Java版)を公開したいけどわからんというので、ちょっとやってみた。

 はっきり言って、Windowsで開発できないというわけではないのだか、なんといっても仕組みが*NIXでないので推測すら利かないのが困りものだ。しかも、SSHに関しては大手サービスサーバ用に書いてあることが多くって、クライアントのみでサーバについて書いていない(´・ω・`)ガッカリ・・・(商業ヽ(´ー`)ノバンザーイなのだ)

 とりあえず、その辺にころがってるノートPC引っ張り出してみる。

サーバのリッスン(受け待ち)はここを持ってきてっと。
SSHポートフォワードでWINDOWS10リモートデスクトップ

クライアントの接続はここを参考にする。
SSHポートフォワーディングを使ったサーバー間接続

探し方が悪いのか全部は乗ってない^^;
まあ、マイクラやってる人は、PCについてはいろいろな知っている度合いが多いので、ちょっと優しめに言うと。

「自分で動かしているマインクラフトのJava版サーバがある(クライアント側)。これをそのまま公開するのではない。離れたお友達のPCを親機(サーバー側)にして秘密でポート22を使って相手に送ってしまう。そうして、あたかもお友達が自分のサーバを別のポートで動かしているかのように見せかけるのです。そうすると、お友達のほうで自分のサーバが別のポートで動いているようになります。そこで、お友達のサーバPCのそのポートを公開したり。マインクラフトでサーバとして設定すれば動くってことです。」

注意:お互いにポート22が送りあえるようになっていないといけません。クライアント側ルータの22ポートのファイヤウォールはあいていることと+プロバイダが22ポートを転送してくれること。サーバ側では待つために公開IPのポート22をサーバPCにつなぐように、ルータを設定しないとけません。

今回は、そのへんにあるノートなので、例としてこんな感じにしました。(クライアントはJava17でも入れてPaperでも動かしといてくださいねw・・・さすがにそこはググってヽ(´ー` )ノオクレヨン )

 

1.サーバ側の設定

① 別名で管理者とパスワードをアカウントを作る
 Terminal(シェル)を出させるということは、PC自体を破壊させるほど強力なことなので、普段使いのログイン名とパスワードは渡さないこと。
② PowerShell(管理者)でいかをしてみること。

Get-windowsCapability -Online | ? Name -like 'OpenSSH*'

③ 結果を見ると、サーバが入っているかわかる。以下のように履いてあればサーバは入っていない。(バージョンが新しくなっていればそれに準じること)

Name : OpenSSH.Server~~~~0.0.1.0
State : Not Installed

④ 入っていなければ入れる。

Add-WindowsCapability -Online -Name OpenSSH.SERVER~~~~0.0.1.0

⑤ 暗号化キーを作る。(お行儀よくw)

ssh-keygen -t rsa

⑥ できた暗号化キーをクライアント側に送り、
c:\usr\<login-name>\.ssh
(クライアントの)フォルダに、id_rsa.pubを入れてもらう。(公開鍵)

⑦ ファイヤウォールを外す。

Get-NetFirewallRule -Name *ssh*

⑧ サーバのサービス起動

Start-Service sshd

⑨ Windows 起動時に SSH サーバ自動起動

Set-Service -Name sshd -StartupType 'Automatic'

2.クライアント側の設定

① 普通にマインクラフトクライアント(Java版)SSHはUDPは扱えないので注意!
② ファイヤーウォールを外す。(こっちから呼ぶのでしなくていいと思うです)
Get-NetFirewallRule -Name *ssh*
③ 次のコマンドで、ターミナルを開く。(exitしないでね。具体的な値はさっきの絵の例になります)

ssh -R 34567:localhost:25565 -i ~/.ssh/id_rsa.pub <サーバの管理者のログインID>@192.168.0.20

 「えっと、自分のPC(IPはlocalhost)のポート22565を相手(サーバ側)のポート34567とをつなぐ。-iで相手の公開暗号鍵を使って、セキュア(秘密に)する。相手につなぐには相手のログインIDがいる。@を付けて相手のPCのアドレス(やURI)でつなぐ相手を指定する。」

④ Yesを選んでサーバの管理者のパスワードを入れる。(Adminのパスくれって結構軽く言うなぁ)
(失敗した場合、不遇にも失敗をデフォルトだと思い込むので、~/.ssh/にできたごみを捨ててね)

 サーバ側のターミナルが開きます。・・・消さないでね^^つながってる証拠です。(まぁLinuxだとhtopとか表示させとくと、相手のOSが重いかどうか見れるのでいいんですが・・・Windowsって本当にターミナル嫌いなのねぇw)

3.つながってるはずです。

はい、サーバ側のlocalhost:34567に、クライアント側のlocalhost:25565がつながっているはずです。まあ、試しにマインクラフトJava版で127.0.0.1:34567でつないでみましょう。こんな感じになります。

 奥にあるノートPCがPaperサーバの動いている、クライアントです。
 手前のノートPCがサーバで、SSHでポートフォワードしています。ですから、手前のPCはサーバアドレスに127.0.0.1:34567ってマイクラが動いています。しかしながら手前のPCにはマイクラのサーバは入っていません。
 マインクラフトサーバは奥のPCに入っていて、そのPCのポート25565が接続ポートです。
 つまり、以上に書いた方法でSSHを使って、奥のPC(クライアント)の25565ポートを、SSHをつかって手前のPC(サーバ)上の34567につないでいるわけです。そのため、手前の(サーバ)ノートPCであたかも34567ポートでマインクラフトサーバが動いているようにしているわけです。

 私は外のサービスを使わないので、SSH使わないんですよねぇ。何といってもフルバックアップできないのは運用上痛いと思うからです。しかもフルバックアップ用に24TBのHDDファイルサーバがあるので、全体は週1ではありますが、CloneZillaが手放せませんねぇ。
 しかも、全体の運用状況を見たい場合Linux(UBUNTU)だとGnome環境でも200MB余分に食うぐらいなもので、RDPやVNCを使えばいいことです。ファイルのやり取りは、Fileserverがguest環境なので簡単です。
 というわけで、Windowsの基本機能でSSHポートフォワーディングするということでした。