こうしたトラブルは、Linuxサーバーに MariaDB を構築した直後によく起きます。原因のほとんどは、MariaDB が初期状態でループバックアドレス(127.0.0.1)にしか待ち受けていないことです。ファイアウォールを開けても接続できないのは、MariaDB 側の bind-address 設定が残っているからです。
この記事では、bind-address の変更・ファイアウォールのポート開放・接続ユーザーへの権限付与・ポート番号を変更したい場合の追加手順まで、リモート接続を実現するために必要な設定を一通りカバーします。Rocky Linux 9.4 / Ubuntu 24.04 LTS で動作確認済みです。
この記事のポイント
・bind-address を 0.0.0.0 に変更するとリモート接続を受け付けるようになる
・firewalld/ufw でポート 3306 を開放しMariaDBを再起動する
・GRANT 文でリモートホストへのユーザー権限を付与する(接続元IP制限推奨)
・ポート番号を変更する場合はSELinuxのラベル追加が必要(RHEL系)
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
リモート接続できない根本原因:bind-address の仕組み
MariaDB はインストール直後、設定ファイルにbind-address=127.0.0.1 と書かれた状態で動いています。これは「ループバックアドレスにしか待ち受けない」という意味で、同じサーバー内からの接続しか受け付けません。外部のPCや別のサーバーからTCPでアクセスしても、MariaDB のプロセス自体が受け取り前に弾く設計です。リモート接続を通すには、次の3段階が必要です。
・MariaDB 側の bind-address を変更する(プロセスを外部に開く)
・OSのファイアウォールでポートを開放する(パケットをサーバーまで届ける)
・MariaDB 上の接続ユーザーにリモートホストからのアクセス権を付与する(認証を通す)
この3つが揃って初めてリモート接続が成立します。いずれか1つでも欠けると接続できないため、順番通りに設定していきましょう。
bind-address を変更する手順
1. 設定ファイルの場所を確認する
bind-address が書かれている設定ファイルは OS によって場所が異なります。まず grep で探します。Rocky Linux / RHEL 系の場合
# bind-address の記述場所を検索する grep -rn "bind-address" /etc/my.cnf /etc/my.cnf.d/ 2>/dev/null
/etc/my.cnf.d/mariadb-server.cnf:bind-address=127.0.0.1
grep -rn "bind-address" /etc/mysql/ 2>/dev/null
/etc/mysql/mariadb.conf.d/50-server.cnf:bind-address = 127.0.0.1
2. bind-address の行を書き換える
見つかったファイルを開き、[mysqld] セクションの bind-address を変更します。Rocky Linux / RHEL 系の場合
vi /etc/my.cnf.d/mariadb-server.cnf
bind-address=127.0.0.1
bind-address=0.0.0.0
0.0.0.0 の代わりに MariaDB サーバー自身の NIC アドレスを指定します。# 例:サーバーの NIC アドレスが 192.168.1.10 の場合 bind-address=192.168.1.10
vi /etc/mysql/mariadb.conf.d/50-server.cnf
[server] または [mysqld] セクションの bind-address を同様に 0.0.0.0 に変更します。3. MariaDB を再起動して設定を反映する
systemctl restart mariadb
systemctl status mariadb
* mariadb.service - MariaDB 10.11 database server Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; preset: disabled) Active: active (running) since Mon 2026-09-14 09:12:31 JST; 3s ago
4. ポートが外部に向いているか確認する
ss コマンドで 3306 ポートが0.0.0.0 で LISTEN しているかを確認します。ss -tlnp | grep 3306
LISTEN 0 80 0.0.0.0:3306 0.0.0.0:* users:(("mariadbd",pid=12345,fd=23))
0.0.0.0:3306 と表示されていれば、MariaDB が全インターフェースで待ち受けています。127.0.0.1:3306 のままであれば設定変更が反映されていないため、設定ファイルの記述場所を再確認してください。Linux ポート確認の全コマンドも参考にしながら、どのプロセスがどのアドレスを掴んでいるかを確かめましょう。ファイアウォールでポート 3306 を開放する
bind-address を変更しても、OS のファイアウォールがポートをブロックしていると外部から接続できません。1. RHEL 系(firewalld)の場合
# ポート 3306/tcp を永続的に開放する firewall-cmd --add-port=3306/tcp --permanent # 設定をリロードして反映する firewall-cmd --reload # 開放されているか確認する firewall-cmd --list-ports
3306/tcp
# mysql サービスとして開放する(3306/tcp と同等) firewall-cmd --add-service=mysql --permanent firewall-cmd --reload
2. Ubuntu(ufw)の場合
# ポート 3306/tcp を開放する ufw allow 3306/tcp # ルールを確認する ufw status
Status: active To Action From -- ------ ---- 22/tcp ALLOW Anywhere 3306/tcp ALLOW Anywhere
# 接続元を 192.168.1.0/24 のみに限定する例 ufw allow from 192.168.1.0/24 to any port 3306
接続ユーザーにリモート接続を許可する
MariaDB のユーザーは「ユーザー名+接続元ホスト」のペアで管理されています。'dbuser'@'localhost' はローカルからの接続専用のため、bind-address を変更しただけでは外部から認証を通せません。GRANT 文でリモートホストを明示的に許可する必要があります。1. 既存ユーザーへのリモート接続権限を付与する
MariaDB に root でログインして GRANT 文を実行します。# root でローカルからログインする mysql -u root -p
-- 接続元を 192.168.1.x のサブネットに絞って権限を付与する GRANT ALL PRIVILEGES ON mydb.* TO 'dbuser'@'192.168.1.%' IDENTIFIED BY 'パスワード'; FLUSH PRIVILEGES;
'%' を使いますが、セキュリティリスクが高まります。-- 全ホストからの接続を許可する(接続元の絞り込みが難しい場合のみ) GRANT ALL PRIVILEGES ON mydb.* TO 'dbuser'@'%' IDENTIFIED BY 'パスワード'; FLUSH PRIVILEGES;
SELECT User, Host FROM mysql.user;
+--------+---------------+ | User | Host | +--------+---------------+ | root | localhost | | dbuser | localhost | | dbuser | 192.168.1.% | +--------+---------------+
2. リモート接続専用ユーザーを新規作成する
用途ごとに権限を分けたい場合は、リモート接続専用のユーザーを作成します。-- リモート接続専用ユーザーを作成し、必要最低限の権限のみ付与する CREATE USER 'remoteuser'@'192.168.1.10' IDENTIFIED BY '強いパスワード'; GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'remoteuser'@'192.168.1.10'; FLUSH PRIVILEGES;
ALL PRIVILEGES を安易に使わず、実際に必要な操作(SELECT・INSERT・UPDATE・DELETE)のみに絞りましょう。MariaDB のポート番号を変更したい場合
デフォルトの 3306 から別のポートに変更したい場合は、設定ファイルの変更・ファイアウォールの更新・SELinux のポートラベル追加(RHEL 系のみ)の3ステップが必要です。1. my.cnf でポート番号を設定する
Rocky Linux / RHEL 系の場合vi /etc/my.cnf.d/mariadb-server.cnf
[mysqld] セクションに port の行を追加または変更します。[mysqld] bind-address=0.0.0.0 port=13306
systemctl restart mariadb
2. firewalld のポートを新しい番号に変更する
# 旧ポート 3306 を削除する(開放済みの場合) firewall-cmd --remove-port=3306/tcp --permanent # 新しいポート 13306 を追加する firewall-cmd --add-port=13306/tcp --permanent # 設定をリロードする firewall-cmd --reload
3. SELinux のポートラベルを追加する(RHEL 系)
Rocky Linux / RHEL 系では、SELinux が MariaDB(mysqld)が使えるポートを厳密に制限しています。デフォルト以外のポート番号を使う場合は、semanage コマンドでポートラベルを追加しないと再起動後に MariaDB が起動を拒否されます。# policycoreutils-python-utils をインストールする(semanage を使えるようにする) dnf install -y policycoreutils-python-utils # MariaDB 用のポートタイプ(mysqld_port_t)として 13306/tcp を許可する semanage port -a -t mysqld_port_t -p tcp 13306 # 登録されたか確認する semanage port -l | grep mysqld
mysqld_port_t tcp 13306, 1186, 3306, 3397-3399, 63132-63164
systemctl status mariadb が Active: failed になり、/var/log/audit/audit.log に SELinux の denied ログが記録されます。別のサーバーから接続を確認する
設定が整ったら、接続元のPC(別サーバー)から mysql コマンドで接続テストを行います。# 書式:mysql -h <MariaDBサーバーのIP> -P <ポート番号> -u <ユーザー名> -p mysql -h 192.168.1.10 -P 3306 -u dbuser -p
Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 8 Server version: 10.11.9-MariaDB MariaDB Server MariaDB [(none)]>
トラブルシューティング
「ERROR 2003 (HY000): Can't connect to MySQL server」が出る場合
このエラーは「MariaDB サーバーへのTCP接続自体が届いていない」ことを示します。次の順で確認してください。・bind-address の確認:
ss -tlnp | grep 3306 で 0.0.0.0:3306 が表示されているか・firewalld の確認:
firewall-cmd --list-ports で 3306/tcp が入っているか・MariaDB の起動確認:
systemctl status mariadb が active (running) か・ネットワーク疎通確認:接続元PCから
ping でサーバーのIPに届いているか「ERROR 1045 (28000): Access denied for user」が出る場合
TCP接続は通っているがユーザー認証で失敗しています。・ユーザーのホスト定義確認:
SELECT User, Host FROM mysql.user; を実行し、接続元IPに対応する行があるか・GRANT 漏れ:接続元IPに対応する
'user'@'ホスト' の定義がなければ GRANT 文を追加する・FLUSH PRIVILEGES 忘れ:GRANT 後に
FLUSH PRIVILEGES; を実行したか確認する・パスワードの確認:IDENTIFIED BY で設定したパスワードが正しいか再確認する
SELinux によるアクセス拒否が疑われる場合
ポートを変更した直後に MariaDB が起動しない場合は/var/log/audit/audit.log に type=AVC の denied ログが記録されます。前述の semanage port -a -t mysqld_port_t -p tcp <ポート番号> を実行してから MariaDB を再起動してください。本記事のまとめ
MariaDB へのリモート接続に必要な設定を表にまとめます。| 設定項目 | 対象ファイル・コマンド | ポイント |
|---|---|---|
| bind-address の変更 | mariadb-server.cnf または 50-server.cnf |
0.0.0.0 で全インターフェースを許可 |
| ポート開放(RHEL 系) | firewall-cmd --add-port=3306/tcp --permanent |
--permanent と --reload をセットで実行 |
| ポート開放(Ubuntu) | ufw allow 3306/tcp |
接続元IPで絞るとより安全 |
| ユーザー権限の付与 | GRANT ... TO 'user'@'host' IDENTIFIED BY '...'; |
接続元ホストを '%' でなくIPで指定 |
| ポート番号変更時のSELinux対応 | semanage port -a -t mysqld_port_t -p tcp <ポート> |
RHEL 系のみ。省略すると起動失敗 |
| MariaDB 再起動 | systemctl restart mariadb |
設定変更後は必須 |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 次のページへ:PostgreSQLのデータベース一覧とディスク使用量を調べる方法|pg_databaseとpg_database_sizeで容量を把握する
- 前のページへ:MySQLのバックアップをcronで自動化する運用設計|世代ローテーションと復元テストの組み立て
- この記事の属するカテゴリ:データーベース管理へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます