実現したいこと
実現したいこと
以下の条件で、
クライアント(VB.NETフォームアプリ)から
サーバー(os:ubuntu 22.04.02 LTS)のデータベース(MySQL 8.0.33)に接続する。
(現在は、同一LAN内での接続です。)
条件
1. クライアントとサーバー間はSSHで接続する。
2. サーバ(Ubuntu)のファイアーウォールの設定は、
Incomig、基本deny としssh用ポートのみ Action:allow, From:anywhere とする。
3.MySQLの設定で、bind-addressは‘127.0.0.1’とする。
4.MySQLにログインするMySQLのユーザーは 'xxx'@'localhost'とする。
前提
DBサーバーは、OS:ubuntu 22.04.02 LTS DBMS:MySQL 8.0.33にて作成しました。
クライアントはOS:Windows11でサーバに接続するプログラムは、VB.NET で作成しました。
クライアントよりサーバーのデータベースに接続するのにMySQLのバインドアドレスを0.0.0.0として
Mysqlプロトコルで直にサーバーのMySQLの待ち受けポートに接続するのは好ましくないと考えました。
SSH接続で接続した後、ポート転送をして接続をすれば、
MySQLのバインドアドレスも0.0.0.0から127.0.0.1に変更でき
ユーザーもローカルホストのユーザーでMySQLログインできることで、
セキュリティの向上を実現できると思い実装したつもりが、思うように動作しません。
以下の手順で実装できると考えコーディングしました。
1.サーバーにSSH接続する
2.ポートを転送する
3.MySQLにログインする
発生している問題・エラーメッセージ
以下のコード最終行 ‘mysql_conn.Open()’の所で例外が投げられます。
エラーメッセージは次の通りです。
MySqlException:Reading from the strem has failed.
EndOfStreamException: ストリームの末尾を越えて読み取ろうとしました。
### 該当のソースコード VB.net で作成したフォームアプリ 接続に関連している部分の抜粋です。 ソースコード 01 Imports Renci.SshNet 02 Imports MySql.Data.MySqlClient ----------------------------------------------------------------------------------------------- 03 Public Class Mainform 04 'SSH接続設定 05 Private Const ssh_host As String = 192.168.10.36 'リモートホストのIPアドレス 06 Private Const ssh_port As Integer = 2222 'サーバ側SSHの待ち受けport番号(デフォルト値を変更しています。) 07 Private Const ssh_user As String = "aaa" 'サーバーのユーザー名 08 Private ssh_key = New PrivateKeyFile("C:\Users\user\Documents\aaa\id_rsa.pem","pass01") '("秘密キーのパス", "キーのパスフレーズ")' 09 Private ssh_mthd = New PrivateKeyAuthenticationMethod(ssh_user, ssh_key) 10 Private ssh_cninf = New ConnectionInfo(ssh_host, ssh_port, ssh_user, ssh_mthd) 11 Private ssh_client = New SshClient(ssh_cninf) 12 ' ポートフォワーディング設定 13 Private Const localPort As Integer = 5001 'クライアントSSH接続用ポート 14 Private Const remotePort As Integer = 3306 'サーバーのMySQL用ポート番号(デフォルト) 15 Private fpl = New ForwardedPortLocal("127.0.0.1", localPort, ssh_Host, remotePort) 16 'DB接続設定 17 Private mysql_conn As MySqlConnection 18 Private Const mysql_db As String = "schm01" '対象データベース 19 Private Const mysql_user As String = "bbb" 'MySQLのユーザー名 20 Private Const mysql_pswd As String = "pass02" 'bbbのMySQLパスワード ・・・・・ ----------------------------------------------------------------------------------------- 21 Sub New() 22 InitializeComponent() 23 'SSH接続 24 Try 25 ssh_client.Connect() 26 Catch ex As Exception 27 MessageBox.Show("サーバーに接続できません", "SSH接続", MessageBoxButtons.OK) 28 End Try 29 'SSH接続確認 30 If ssh_client IsNot Nothing AndAlso ssh_client.IsConnected Then 31 MessageBox.Show("接続OK", "サーバーSSH接続", MessageBoxButtons.OK) 32 End If 33 'ポート転送 34 Try 35 ssh_client.AddForwardedPort(fpl) 36 fpl.Start() 37 Catch ex As Exception 38 MessageBox.Show("転送失敗 :" & ex.Message, "ポートフォワーディング ", MessageBoxButtons.OK) 39 End Try 40 'ポート転送確認 41 If fpl.isstarted Then 42 MessageBox.Show("転送OK", "sshポート転送", MessageBoxButtons.OK) 43 End If 44 'MySQLログイン 45 Dim cnstr As String = $"server={fpl.BoundHost};" & 46 $"port={fpl.BoundPort};" & 47 $"database={mysql_db};" & 48 $"user={mysql_user};" & 49 $"password={mysql_password}" 50 mysql_conn = New MySqlConnection(cnstr) 51 mysql_conn.Open() ### 補足情報(FW/ツールのバージョンなど) 上記コーディングで31行目と42行目では正常に動作している(と自分は考える)メッセージが表示されるので、 51行目のOpenメソッドはサーバー内部からの操作だから、 MySQLのbind-addressを‘127.0.0.1’とすると接続できない理由が自分には理解できません。 MySQLの設定で、bind-addressを‘0.0.0.0’とすると MySQLのユーザー 'bbb'@'%' ではMySQLにログイン出来て正常にクエリを発行できます。 また上記コードでSSH接続するサーバーのユーザー、およびMySQLのユーザーで 「MySQL Workbenchで同一クライアント機よりサーバーへの接続してMySQLにログインすること」 「Tera Termを使用でSSH公開鍵認証によりサーバーへの接続してMySQLにログインすること」 はできています。 一応、MySQLへの接続文字列を、記述しておきます。 server=127.0.0.1; port=5001; database=schm01; user=bbb; password=pass02 最後まで、目を通していただきありがとうございます。 よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー