ワテの場合、ABLENET社のWindows VPSを契約して利用している。
主にASP.NET MVCでWEBサイトプロジェクトを作成して、このVPSに発行(Web Deploy)して世間に公開している。
データベースも利用していて、無料のSQL Server Express 2016をインストールして使っている。
MySQLもこのWindows VPSにはインストールしているのだが、あまり利用していなかた。
今後、もう少しこのMySQLを活用したいので、自宅のWindows 10 Pro x64 パソコンからリモート接続出来るように設定をした。
では、本題に入ろう。
ワテが使っているWindows VPSの紹介
各社のWindows VPSを試してワテが最終的に選んだのはエイブルネット社だ。
Linux VPSだけでなくWindows VPSプランの種類も多いのがエイブルネット社の特徴だ。
世間では少数派のWindows VPSであるが、エイブルネット社はWindows VPSのプランが他社と比べて充実していると思う。
さらに、エイブルネット社は最新Windows Server OSへの対応も早かった。2024年現在、他社では、未だにWindows Server 2008しか使えないなんて言うWindows VPSもある。
Windows VPSを選択する場合は、そう言う点も良くチェックすべきだ。
では早速、自宅のWindows10パソコンからWindows VPS上のMySQLに接続してデータベースを読み書きする手法を解説したい。
まあワテの備忘録みたいなもんだが。
作業前の前提条件
あくまで例であるが、以下のようにIPが振ってあるとする。
コンピュータ | IPアドレスの例 |
Windows VPS(Windows Server 2012R2 x64) |
203.0.113.1 |
自宅ルーターのグローバルIPアドレス | 10.10.10.10 |
また、
- Windows VPS(Windows Server 2012R2 x64)
- 自宅Windows 10 Pre x64
の二台のコンピュータにはMySQL、MySQL Workbench などがインストールされているものとする。
デフォルト設定ではMySQLにはリモート接続出来ない
さて、自宅のWindows10から以下のコマンドを実行してみた。
もし正しく設定が出来ていると、このコマンドでWindows VPS上のMySQLに接続出来る。
C:\Program Files\MySQL\MySQL Workbench 6.3 CE> mysql -h 203.0.113.1 -u root -P 3306 -p Enter password: **************************************************************** ERROR 2003 (HY000): Can't connect to MySQL server on '203.0.113.1' (10060)
しかし、エラーする。
まあ、当然だ。
Windows VPS側でMySQLのrootユーザーにリモート接続許可する
Windows VPSにリモートデスクトップ接続して、mysqlにログインする。
C:\Program Files\MySQL\MySQL Workbench 6.3 CE> mysql -u root -p [ENTER]
Enter password: ここにパスワードをコピペで貼り付ける。[ENTER]
mysql>
mysql> select user,host from mysql.user;
+-----------+-----------+
| user | host |
+-----------+-----------+
| mysql.sys | localhost |
| root | localhost |
+-----------+-----------+
2 rows in set (0.00 sec)
mysql>
上のselectコマンドを実行すると、ユーザーに関する情報が表示できる。
上に示した通り、localhostからしか接続出来ない。つまりWindows VPS自身からしかMySQLに接続できない状態だ。
特定のIPアドレス(10.10.0.0/16)のコンピュータからMySQLのrootユーザーでアクセス出来るようにする設定コマンドが以下の通り。
ただしこのコマンドはMySQL57の場合には成功するがMySQL80ではエラーした。
mysql> GRANT ALL privileges ON *.* TO root@"10.10.%" identified by 'rootのパスワード' WITH GRANT OPTION;
上のコマンドが成功して何かメッセージが出たがキャプチャーし忘れた。
mysql> select user,host from mysql.user;
+-----------+-----------+
| user | host |
+-----------+-----------+
| root | 10.10.% |
| mysql.sys | localhost |
| root | localhost |
+-----------+-----------+
3 rows in set (0.00 sec)
無事に 10.10.0.0 ~ 10.10.255.255 の範囲のIPアドレスに対してアクセス許可出来た。
2018/08/15更新
MySQL80をインストールしたのだが、上のやり方だとエラーが出た。
このスタックオーバーフローの記事
How to grant all privileges to root user in MySql 8.0
How to grant all privileges to root user in MySQL 8.0Tried mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; Getting ERROR 1064 (42000...
を参考にして以下のようにしたら無事に 10.10.x.x のアドレスに対してリモート接続の許可設定が出来た。
CREATE USER 'root'@'10.10.%' IDENTIFIED BY 'このユーザーのpasswordを入れる'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.10.%' WITH GRANT OPTION;
なお、上のコマンドでユーザーを作成するとMySQL80で導入された新しいパスワード認証方式 caching_sha2_password が設定される(デフォルト)。
それで問題無い場合はそれで良いが、例えば他のサーバー上のPHPプログラムからMySQL80にアクセスする場合に、この新認証方式にそのPHPプログラムが対応していない場合には認証エラーが出る。
その対策としては、ユ-ザー作成時に、MySQL57で使っていた従来式パスワード認証を設定してやれば良い。
drop user 'root'@'10.10.%'; create user 'root'@'10.10.%' identified with mysql_native_password by 'このユーザーのpasswordを入れる'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'10.10.%' WITH GRANT OPTION;
これでMySQL80に対して、MySQL57時代の従来式のパスワード認証方式で接続出来る。
ユーザーを確認する。
select user,host,plugin from mysql.user;
その実行結果例
+------------------+--------------+-----------------------+ | user | host | plugin | +------------------+--------------+-----------------------+ | root | 10.10.% | caching_sha2_password | | root | 192.168.1.10 | mysql_native_password | | mysql.infoschema | localhost | caching_sha2_password | | mysql.session | localhost | caching_sha2_password | | mysql.sys | localhost | caching_sha2_password | | root | localhost | caching_sha2_password | +------------------+--------------+-----------------------+
こんな風になる。
なお、何故サブネットで範囲指定しているかと言うと、ワテの加入しているプロバイダの場合、グローバルIPの末尾16ビットが変化するからだ。
例えばルーターの電源をOFF・ONした場合など。
なのでこんな風にサブネットマスクを指定している。
もし、固定IPが変化しない人なら、10.10.10.10 のように特定のIPアドレスを指定すると良いだろう。
ただし、これだけではまだ自宅のWindows 10パソコンからWindows VPS上のMySQLには接続出来ない。
Windows VPSでファイヤーウォールの設定が必要
コントロールパネル
システムとセキュリティ
Windowsファイヤーウォール
を開く(下図)。
詳細設定(上図)をクリックする。
新規の受信の規則ウィザードを実行する。
上図のようにポートを選択して次へをクリックする。
プロトコルおよびポートの設定画面が開く(下図)
プロトコルにはTCPを選択。
特定のローカルポートに
3306
を入れる。
この値はMySQLのデフォルトポート番号だ。
もしMySQLのインストール時に、セキュリティ対策か何かの理由で別のポート番号にしている場合には、その値を入れる必要がある。
次へボタンをクリックすると下図が開く。
ここで上図のように
接続を許可する
を選択して、次へをクリックする。
この規則が適用されるプロファイルを指定する画面が出る。
上図のように
- ドメイン
- プライベート
- パブリック
にチェックを入れて次へボタンをクリックする。
なお、この三つを全部選択する必要があるのかどうかは未確認。取り敢えず全部選んだら上手く行った。
次へをクリックすると下図が出る。
このプロファイルに名前を付けて保存出来るので、適当な名前を入れる。
必要ならば、説明文を追加しても良い。
完了ボタンをクリックすると受信の規則の一覧に今作成した規則が表示される。
でも、まだ作業は終わっていない。
今作成した受信の規則をダブルクリックする。
下図のプロパティ設定画面が開く。
ここで下図のようにスコープタブをクリックする。
下段のリモートIPアドレスの
これらのIPアドレス
と言うラジオボタン項目を選択する。
右隣の追加ボタンをクリックすると編集可能になるので、上図のようにアクセスを許可したいIPアドレスを書き込む。
ワテの場合には、自宅のルーターのグローバルIP
10.10.0.0/16
をサブネットマスクで入力した。
もし、特定のIPを指定したい場合には、
192.168.1.2
のように特定のIPを書き込めば良い。
この入力欄にはMySQLのポート3306にアクセス許可したいIPを複数書き込む事が可能だ。
設定はこれで完了。
MySQLのサービスを再起動
一応念のためにここでMySQLのサービスを再起動しておく(下図)
タスクマネージャーのサービスのタブをクリックする。
MySQL57と言うサービス名があるので右クリックして開くメニューに再起動があるので実行する。
なおMySQL57と言う名前は、MySQLをインストールした時にデフォルトで設定されたサービス名だ。
再びMySQLにリモート接続を試す
冒頭ではエラーしたが、同じコマンドを実行してみる。
C:\Program Files\MySQL\MySQL Workbench 6.3 CE>mysql -h 203.0.113.1 -u root -P 3306 -p Enter password: **************************************************************** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.14-log MySQL Community Server (GPL) Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>
そうすると今度は成功。
いい感じだ。
これで自宅のWindows10パソコンから、Windows VPS上のMySQLにrootユーザーでログイン出来るようになった。
MySQL Workbenchからも接続できる。
上図のように新しい接続を作成して
MySQL ABLENET
と名付けた。
このGUIからも無事に接続出来る事を確認した。
まとめ
当記事では、ABLENET社のWindows VPS上にインストールしたMySQLに、自宅のWindows 10パソコンからリモート接続する設定を説明した。
要点は、設定が二つ必要になると言う事。
つまり、
- MySQLの設定で特定のユーザー(例えばroot)にリモート接続出来る権限を与える。
- Windows Server 2012R2のファイヤーウォールの設定でMySQLのTCPポート3306を自宅のルーターのグローバルIPに対して許可設定をする。
の二点だ。
その結果、無事に自宅のWindows 10パソコンからWindows VPSのMySQLにログイン出来るようになった。
これで、あとはVisual Studio 2015を使って例えばC#のプログラムからこれらのリモートなMySQLデータベースを自由に操作出来るようになる。
一件落着と言う奴だ。
コメント