2008-09-15 21:30:25

MySQLに他のパソコンからリモート接続できない!

テーマ:MySQL

え~忙しくてだいぶ時間が空いてしまいましたね。おいそれと続きを書いてみますです。

前回までで、なんとかtelnetが使えるようになりました。さて、今度こそMySQLにリモート接続です。ここに至るまでそれなりに時間がかかりましたが、ここから先も時間がとられてしまいました。すんなりとはいかないものですね。今思えば単純な問題ばかりなんですが・・・。さて今回は直面した問題点を先にすべてあげてしまいましょう。


1.ポート(一般には3306)が開いていない
2.MySQLのユーザー権限設定が変更されていない
3.my.ini になぜか bind-addressが設定されている

他にも色々原因はあると思いますが、ローカル接続(MySQLがインストールされたマシン内だけでの接続)では正常に動くのに、外のパソコンから、ネットワーク上のほかのパソコンからリモート接続できないっていう場合は、一応確認してみて下さい。


1.ポート(一般には3306)が開いていない


まず、大前提、基本中の基本かもしれませんが、ポートが開いていないというものです。解決策は簡単、サーバー側のポートを開けてしまいましょう。前回のTelnet の時と同じです。詳しい手順は前回を見てください。(説明手抜きw) Windowsファイアーウォールでブロックされている場合の手順だけ簡単に説明すると、[コントロールパネル]→[Windowsファイアーウォール]と進み、[例外]タブをクリックし、[ポートの追加]をクリックします。そこでポート番号を「3306」に、また「TCP」のほうにチェックを入れ、OKを押します。せっかくだから画像も張っておきましょう。
mysql port 3306

あ、名前ですが、自分が後で何のために空けたポートかわかれば何でもいいようです。MySQLとでも入れておいてください。


2.MySQLのユーザー権限設定が変更されていない


次も初歩的な問題ですが、知らないとわかりません。これを解決するのに私は何時間も迷いました…。ユーザー権限の問題です。データベースのデータに関してアクセス制限できるのは知っていましたが、ログインに関しても細かく指定できるとは知りませんでした。

初期設定では、rootはローカルホストからしか接続できないようになっています。つまり、ほかのマシンからrootでログインしようと思っても、接続できないようにブロックされます。まぁ、最初から必ずあるrootには初期段階でパスワードが設定されていないわけですから、これくらの制限はないと、とんでもないことになりそうですが。

この際、同じネットワークからならリモートで何でもできる新しいスーパーユーザーを登録してみましょう。ただしこれには多少の危険が伴います。もし悪意ある人が接続できてしまった場合、MySQL内のデータを盗み放題、破壊し放題なわけです。一応同じネットワーク内に限定するので、そう簡単にインターネットからアクセスされていたずらされるということはないと思いますが。また、ここではわかりやすいように、ユーザー名を[admin]パスワードを[pass]としますが、実際にやる場合は、特に運用前には、念のため、ユーザー名とパスワードはできるだけ推測しにくい ものにしてください。

ではさっそく新しいユーザーを登録してみましょう。adiminというユーザーをpassというパスワードで、同じローカルネットワークからしかつながらないが、何でもできる、という条件で登録します。もう一つ条件として、MySQLサーバーのローカルネットワークのIPアドレスが、192.168.0.なんとか…としましょう。つまり、このローカルネットワークのアドレスの範囲が192.168.0.1~192.168.0.254で、この間にあるIPからしかアクセスできなくする、という設定です。MySQLにrootでログインし、次のように打ち込んでみてください。

grant all on *.* to admin@"192.168.0.%" identified by 'pass' with grant option;

すこしだけgrantコマンドを説明します。

grantのすぐ後の all は、許可する操作を表しています。もし検索だけを許可して、そのほかの操作すべて(データの消去も挿入も項目の追加も…)を許さない場合は、allの部分がselectになります。ここでは、すべてを許可したいので、[all]としています。

つぎの *.* ですが、これは権限を与えるテーブル名とデーターベース名です。*はワイルドカードで、何でも全部、を意味するということになります。そして、ピリオドの前に指定するのはデーターベース名、後ろはテーブル名です。つまり *.* は「すべてのデーターベース」の「すべてのテーブル」に指定した権限を与えるということになります。逆に今回与える権限の範囲を、testというデーターベースのすべてのテーブルに指定したいときは、 *.* の部分が、 test.* となります。

そして、今回のメインとなる部分、to admin@"192.168.0.%" ですが、ここで、ユーザー名と許可ホストを指定することになります。 to [ユーザー名]@[ホスト名] と並べます。この例ではadminというユーザー名で、ローカルネットワークからのみの接続を許可していることになります。"192.168.0.%"の部分ですが、このアドレスはそれぞれの環境に合わせて調整してください。サーバーのIPアドレスがもし192.168.11.1であるなら、調整して"192.168.11.%"としてください。おわかりのように%は*と同じでワイルドカードです。ですから、このユーザーに対して、192.168.0.2からでも、192.168.11.2からでもログインを許可するなら"192.168.%"、ローカルホストからの接続のみを許可したければ、"localhost"とします。逆に、もうどこからでも接続を許すのであれば、単に"%"としてください。

次はパスワードです。identified by 'pass' で設定しています。パスワードなしでユーザー登録するときは、この部分はいりません。省略してください。絶対にお勧めしませんが…。設定の仕方は見たまんまで、identified by '[パスワード]'  となります。

最後に with grant option をつけています。このオプションを指定すると、データーベースやテーブルに対する自分の持つ権限をほかのユーザーに与えることができるようになります。これを省略すると、ほかのユーザーに対する権限の制御ができなくなってしまいます。今回はrootと同じように、何でもできるユーザーを作りたいわけですから、このオプションは必ず記述してください。

これでリモート接続ができるようになったでしょうか?あ、rootで接続しようとしないで下さいねw 今回作った新しいユーザーでしか、リモート接続できません。もちろん、rootでリモートログインできるようにも設定できますが、ユーザー名が必ずあるrootで、初期パスワードが設定されていないかもしれない状態でリモート許可するのは、ちょっとお勧めできませんので^^;それはまたgoogleなどで調べてみてください。まぁ、GUIツールがあれば、そっちでやってしまうのが一番早いです( ̄_ ̄ i)

これでも接続できない場合は…


3.my.ini になぜか bind-addressが設定されている

かもしれません。たとえばmy.iniの[mysqld]に


bind-address = 127.0.0.1


なんて記述があると、 ローカルホストからしか接続できません。この、bind-addressの項目は、MySQLに接続できるサーバー側のIPアドレスを限定するもののようです。クライアント側IPではありません。もしこの項目があり、127.0.0.1と記述されているならば、その行の先頭に # を打ち込んでコメントアウトするか、この項目の行を丸ごと消してしまいましょう。

少し説明を加えると、LANカードを2枚差しているとか、有線LANと無線LANを同時に使用しているとかなどで、MySQLのサーバーマシンに2つ以上のLAN接続があり、2つ以上のIPアドレスを持っている場合、このbind-addressの項目で接続を許可するIPアドレスを限定できます。たとえば、有線LANカードでのIPアドレスが192.168.11.1で、無線LANカードのIPアドレスが192.168.12.1だったとします。この環境の中で bind-address = 192.168.11.1 という項目があると、無線LANを通しての接続は一切受け付けなくなります。上手に使えば、セキュリティーを高められるということです。

で、上で例に挙げた bind-address = 127.0.0.1 の場合ですが、この、「127.0.0.1」は特別なIPアドレスで、 localhost を表すIPなわけです。つまり自分自身のパソコンを表すということです。なので、 bind-address = 127.0.0.1 という一文があると、自分自身から自分自身への接続以外は受け付けない、ということになります。また、ややこしいことに bind-address = 127.0.0.1 の指定がある場合、自分自身のIPアドレスが192.168.11.1であっても、MySQLのホスト名に192.168.11.1と指定すると、接続できなくなってしまいます。あくまでlocalhostまたは127.0.0.1とする必要があります。bind-addressの役割がなんとなくわかっていただけたでしょうか。

さて、これでリモートからも接続できるようになっていると思います。ローカル接続できるのにリモート接続できない場合のいくつかの原因を列挙してみました。これでだめなら私にはお手上げです。ネットワーク自体を疑ってみるか、はたまたMySQLのもっと細かい設定ミスを疑うか…いずれにしても、そう簡単に解決できないと思います><頑張ってください。接続できた場合は、お疲れ様でした^^;

AD
いいね!した人  |  コメント(2)  |  リブログ(0)

Tetsuya Staffさんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

コメント

[コメントをする]

2 ■◎大変参考になりました!

どのサイトをみても分からず、完全お手上げ状態でしたが、ここをみて一発で解決できました。

自分の場合は、
1.ポート(一般には3306)が開いていない

これが原因でした。
むぅ。。。。

ありがとうございます。これからもがんばってください

1 ■参考になりました!

VB.NETから、外部サーバにアクセスできなかったので、参考になりました。
そう、ユーザーを追加するんですね。
昔もはまったような記憶があります。

コメント投稿

AD

ブログをはじめる

たくさんの芸能人・有名人が
書いているAmebaブログを
無料で簡単にはじめることができます。

公式トップブロガーへ応募

多くの方にご紹介したいブログを
執筆する方を「公式トップブロガー」
として認定しております。

芸能人・有名人ブログを開設

Amebaブログでは、芸能人・有名人ブログを
ご希望される著名人の方/事務所様を
随時募集しております。