MariaDBへリモート接続できるようにする手順|bind-addressの見直しとポート開放・接続元の制限

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtipsデーターベース管理 > MariaDBへリモート接続できるようにする手順|bind-addressの見直しとポート開放・接続元の制限
「MariaDBをインストールして別のサーバーやPCから接続しようとしたら、接続を拒否された」
こうしたトラブルは、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系)


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

リモート接続できない根本原因: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

Ubuntu 系の場合

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

接続元を特定のIPアドレスに限定したい場合は、0.0.0.0 の代わりに MariaDB サーバー自身の NIC アドレスを指定します。

# 例:サーバーの NIC アドレスが 192.168.1.10 の場合 bind-address=192.168.1.10

Ubuntu 系の場合

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

接続元を特定のIPアドレス帯に絞る場合はこちらの書式を使います。

# 接続元を 192.168.1.0/24 のみに限定する例 ufw allow from 192.168.1.0/24 to any port 3306

全ホストを許可するより、接続元のIPアドレスを絞ったほうが攻撃の露出面を減らせます。本番環境では可能な限り絞ることを推奨します。

接続ユーザーにリモート接続を許可する

MariaDB のユーザーは「ユーザー名+接続元ホスト」のペアで管理されています。'dbuser'@'localhost' はローカルからの接続専用のため、bind-address を変更しただけでは外部から認証を通せません。GRANT 文でリモートホストを明示的に許可する必要があります。

1. 既存ユーザーへのリモート接続権限を付与する

MariaDB に root でログインして GRANT 文を実行します。

# root でローカルからログインする mysql -u root -p

ログイン後、接続元IPを指定して権限を付与します。

-- 接続元を 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;

現在のユーザー一覧と接続元の確認は以下のSQL文で行います。

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

設定後、MariaDB を再起動します。

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

13306 が追加されていれば設定完了です。この手順を省くと systemctl status mariadbActive: 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 33060.0.0.0:3306 が表示されているか
firewalld の確認firewall-cmd --list-ports3306/tcp が入っているか
MariaDB の起動確認systemctl status mariadbactive (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.logtype=AVCdenied ログが記録されます。前述の 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 設定変更後は必須

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。