ロリポップのMySQLは外部から接続できない
ローカルマシンから、ロリポップレンタルサーバのMySQLに接続したい、となりました。
mysql -h mysql000.phy.lolipop.lan -P 3306 -u LAA9999999 -p LAA9999999-db
しかし接続はできません。
ERROR 2005 (HY000): Unknown MySQL server host 'mysql000.phy.lolipop.lan' (0)
lanというドメインからも分かる通り、 mysql000.phy.lolipop.lan というホスト名は、ロリポップ内部でしか名前解決できません。
dig +short A mysql000.phy.lolipop.lan
# 結果返らず
もちろんIPが分かったとしても、レンタルサーバからしかアクセスを受け付けておらず、外部から接続することはできません。
SSHで接続して、MySQLクライアントを利用
ロリポップは、スタンダードプラン以上なら、SSHを利用することができます。
事前にSSHを有効化して、パスワードを確認した上で接続することができます。
ssh -p 2222 username@ssh.lolipop.jp
SSHでレンタルサーバ内にログインした状態からなら、MySQLクライアントで接続できます。
$ mysql -h mysql000.phy.lolipop.lan -P 3306 -u LAA9999999 -p LAA9999999-db
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4035668
Server version: 5.6.23-log MySQL Community Server (GPL)
Copyright (c) 2000, 2019, 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>
もちろんサーバ内からなら、データベースホストの名前解決もできました。
$ dig +short A mysql000.phy.lolipop.lan
172.19.xxx.xxx
SSHポートフォワードして接続
となると、「SSHトンネリングしで、接続すればよいのでは?」となりますよね。
やってみます。
ssh -L 3307:mysql000.phy.lolipop.lan:3306 -p 2222 username@ssh.lolipop.jp
SSHのポートフォワードの設定については、以前に書きましたので、こちらも参考にしてください。
これで、ローカルマシンの3307ポートが、レンタルサーバのSSHを通して、データベースサーバの3306ポートに、ポートフォワードされる。はずでした・・・。
mysql -h localhost -P 3307 -u LAA9999999 -p LAA9999999-db
結果は失敗。
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
SSH側では、このようなエラーが出ていました。
channel 3: open failed: administratively prohibited: open failed
接続の途中で、コネクションが遮断されているようです。
問い合わせしてみた結果
おそらくSSHサーバの AllowTcpForwarding が no になっているのでは、と考えています。
ロリポップに問い合わせをしてみた結果、すぐに「ポートフォワードやトンネリングはできない」との回答をいただけました。
敗北です。何か方法があればぜひ教えてください。
Railsから接続したかった
なぜそんなに必死に調べていたかというと、Ruby on Railsから接続したかったからです。他のレンタルサーバも同様だと思いますが、ロリポップではRailsアプリケーションは動かせません。そのため、「Railsは別の環境で立てて、MySQLだけ使えないだろうか」と考えました。
ちなみに、もしSSH経由で接続できるならば、net-ssh-gatewayというgemが使えそうでした。
initializersの中などで、SSHトンネルを確立して、そのローカルポートである3307に対して、ActiveRecordの接続設定を書けばよい、ということです。
gateway = Net::SSH::Gateway.new(
'ssh.lolipop.jp',
'username',
password: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
port: 2222
)
gateway.open('mysql000.phy.lolipop.lan', 3306, 3307)
development:
adapter: mysql2
encoding: utf8
charset: utf8
collation: utf8_general_ci
host: '127.0.0.1'
port: 3307
database: 'LAA9999999-db'
username: 'LAA9999999'
password: 'XXXXXXXXXXXXXXXX'
そういうわけで、MySQLは、Amazon RDSなどで立てるか、ClearDBなどを使うか、考え中です。