ネットワークネームスペースは、ホストシステムからのネットワークスタックの論理コピーです。 ネットワークネームスペースは、コンテナまたは仮想環境の設定に役立ちます。 各ネームスペースには、独自の IP アドレス、ネットワークインタフェース、ルーティングテーブルなどがあります。 デフォルトまたはグローバル名前空間は、ホストシステムの物理インタフェースが存在する名前空間です。
ネームスペース固有のアドレス空間は、MySQL 接続がネームスペース間をまたがる場合に問題になる可能性があります。 たとえば、コンテナまたは仮想ネットワークで実行されている MySQL インスタンスのネットワークアドレス空間は、ホストマシンのアドレス空間とは異なる場合があります。 これにより、同じマシン上で実行されているクライアントとサーバーであっても、MySQL サーバーに表示されるネームスペース内のアドレスからのクライアント接続などの現象が発生する可能性があります。 両方のプロセスが IP アドレスが 203.0.113.10
のホストで実行されているが、異なるネームスペースを使用しているとします。 接続によって次のような結果が生成される場合があります:
shell> mysql --user=admin --host=203.0.113.10 --protocol=tcp
mysql> SELECT USER();
+--------------------+
| USER() |
+--------------------+
| admin@198.51.100.2 |
+--------------------+
この場合、予想される USER()
値は admin@203.0.113.10
です。 このような動作により、接続元のアドレスが表示されない場合に、アカウント権限を正しく割り当てることが困難になる可能性があります。
この問題に対処するために、MySQL では、TCP/IP 接続に使用するネットワークネームスペースを指定できるため、接続の両方のエンドポイントが合意した共通アドレス空間を使用します。
MySQL 8.0.22 以上では、それらを実装するプラットフォームでネットワークネームスペースがサポートされます。 MySQL 内のサポートは、次のものに適用されます:
MySQL サーバー、mysqld。
X プラグイン。
mysql クライアントおよび mysqlxtest テストスイートクライアント。 (他のクライアントはサポートされていません。 これらは、接続先のサーバーのネットワークネームスペース内から呼び出す必要があります。)
通常のレプリケーション。 (グループレプリケーションはサポートされていません。)
次の各セクションでは、MySQL でネットワークネームスペースを使用する方法について説明します:
MySQL でネットワークネームスペースのサポートを使用する前に、次のホストシステムの前提条件を満たす必要があります:
ホストオペレーティングシステムは、ネットワークネームスペースをサポートする必要があります。 (たとえば、Linux。)
MySQL で使用されるネットワークネームスペースは、最初にホストシステムに作成する必要があります。
-
ネットワークネームスペースをサポートするには、システム管理者がホスト名解決を構成する必要があります。
注記既知の制限は、MySQL 内では、ネットワークネームスペース固有のホストファイルで指定された名前に対してホスト名解決が機能しないことです。 たとえば、
red
ネームスペースのホスト名のアドレスが/etc/netns/red/hosts
ファイルで指定されている場合、名前へのバインドはサーバー側とクライアント側の両方で失敗します。 回避策は、ホスト名ではなく IP アドレスを使用することです。 -
システム管理者は、ネットワークネームスペース (mysqld, mysql, mysqlxtest) をサポートする MySQL バイナリに対して
CAP_SYS_ADMIN
オペレーティングシステム権限を有効にする必要があります。重要CAP_SYS_ADMIN
の有効化は、ネームスペースの設定に加えてプロセスが他の権限アクションを実行できるようにするため、セキュリティに依存する操作です。 効果の詳細は、https://man7.org/linux/man-pages/man7/capabilities.7.html を参照してください。CAP_SYS_ADMIN
はシステム管理者が明示的に有効にする必要があるため、MySQL バイナリではデフォルトでネットワークネームスペースのサポートは有効になっていません。 システム管理者は、有効にする前に、CAP_SYS_ADMIN
で MySQL プロセスを実行した場合のセキュリティの影響を評価する必要があります。
次の例の手順では、red
および blue
という名前のネットワークネームスペースを設定します。 選択する名前は、ホストシステムのネットワークアドレスおよびインタフェースとは異なる場合があります。
ここに示すコマンドは、root
オペレーティングシステムユーザーとして、または各コマンドの前に sudo を付けて起動します。 たとえば、root
以外の場合に ip または setcap コマンドを起動するには、sudo ip または sudo setcap を使用します。
ネットワークネームスペースを構成するには、ip コマンドを使用します。 一部の操作では、ip コマンドは特定のネームスペース (すでに存在している必要があります) 内で実行する必要があります。 このような場合は、次のようにコマンドを開始します:
ip netns exec namespace_name
たとえば、次のコマンドは red
ネームスペース内で実行され、ループバックインタフェースを起動します:
ip netns exec red ip link set lo up
ネームスペースと独自のループバックインタフェース間のリンクとして使用される独自の仮想イーサネットデバイスを持つ、red
および blue
という名前のネームスペースを追加するには:
ip netns add red
ip link add veth-red type veth peer name vpeer-red
ip link set vpeer-red netns red
ip addr add 192.0.2.1/24 dev veth-red
ip link set veth-red up
ip netns exec red ip addr add 192.0.2.2/24 dev vpeer-red
ip netns exec red ip link set vpeer-red up
ip netns exec red ip link set lo up
ip netns add blue
ip link add veth-blue type veth peer name vpeer-blue
ip link set vpeer-blue netns blue
ip addr add 198.51.100.1/24 dev veth-blue
ip link set veth-blue up
ip netns exec blue ip addr add 198.51.100.2/24 dev vpeer-blue
ip netns exec blue ip link set vpeer-blue up
ip netns exec blue ip link set lo up
# if you want to enable inter-subnet routing...
sysctl net.ipv4.ip_forward=1
ip netns exec red ip route add default via 192.0.2.1
ip netns exec blue ip route add default via 198.51.100.1
ネームスペース間のリンクのダイアグラムは次のようになります:
red global blue
192.0.2.2 <=> 192.0.2.1
(vpeer-red) (veth-red)
198.51.100.1 <=> 198.51.100.2
(veth-blue) (vpeer-blue)
存在するネームスペースおよびリンクを確認するには:
ip netns list
ip link list
グローバルおよび名前付きネームスペースのルーティングテーブルを表示するには:
ip route show
ip netns exec red ip route show
ip netns exec blue ip route show
red
および blue
のリンクとネームスペースを削除するには:
ip link del veth-red
ip link del veth-blue
ip netns del red
ip netns del blue
sysctl net.ipv4.ip_forward=0
ネットワーク名前空間のサポートを含む MySQL バイナリが実際に名前空間を使用できるようにするには、それらに CAP_SYS_ADMIN
機能を付与する必要があります。 次の setcap コマンドは、MySQL バイナリを含むディレクトリの場所を変更したことを前提としています (必要に応じてシステムのパス名を調整します):
cd /usr/local/mysql/bin
CAP_SYS_ADMIN
機能を適切なバイナリに付与するには:
setcap cap_sys_admin+ep ./mysqld
setcap cap_sys_admin+ep ./mysql
setcap cap_sys_admin+ep ./mysqlxtest
CAP_SYS_ADMIN
の機能を確認するには:
shell> getcap ./mysqld ./mysql ./mysqlxtest
./mysqld = cap_sys_admin+ep
./mysql = cap_sys_admin+ep
./mysqlxtest = cap_sys_admin+ep
CAP_SYS_ADMIN
機能を削除するには:
setcap -r ./mysqld
setcap -r ./mysql
setcap -r ./mysqlxtest
以前に setcap を適用したバイナリを再インストールする場合は、setcap を再度使用する必要があります。 たとえば、MySQL のインプレースアップグレードを実行する場合、CAP_SYS_ADMIN
機能の付与に再度失敗すると、ネームスペース関連の障害が発生します。 名前付きネームスペースを持つアドレスにバインドしようとすると、サーバーは次のエラーで失敗します:
[ERROR] [MY-013408] [Server] setns() failed with error 'Operation not permitted'
--network-namespace
オプションを指定して起動されたクライアントは、次のように失敗します:
ERROR: Network namespace error: Operation not permitted
前述のホストシステムの前提条件が満たされている場合、MySQL では、接続のリスニング (インバウンド) 側のサーバー側ネームスペースおよび接続のアウトバウンド側のクライアント側ネームスペースを構成できます。
サーバー側では、bind_address
、admin_address
および mysqlx_bind_address
システム変数に、着信接続をリスニングする特定の IP アドレスまたはホスト名に使用するネットワークネームスペースを指定するための拡張構文があります。 アドレスのネームスペースを指定するには、スラッシュとネームスペース名を追加します。 たとえば、サーバー my.cnf
ファイルには次の行が含まれる場合があります:
[mysqld]
bind_address = 127.0.1.1,192.0.2.2/red,198.51.100.2/blue
admin_address = 102.0.2.2/red
mysqlx_bind_address = 102.0.2.2/red
次のルールが適用されます:
ネットワークネームスペースは、IP アドレスまたはホスト名に指定できます。
ワイルドカード IP アドレスにはネットワークネームスペースを指定できません。
指定されたアドレスでは、ネットワーク名前空間はオプションです。 指定する場合は、アドレスの直後に
/
接尾辞として指定する必要があります。ns
/
接尾辞のないアドレスは、ホストシステムのグローバルネームスペースを使用します。 したがって、グローバルネームスペースがデフォルトです。ns
/
接尾辞の付いたアドレスは、ns
ns
という名前のネームスペースを使用します。ホストシステムはネットワークネームスペースをサポートしている必要があり、各名前付きネームスペースは事前に設定されている必要があります。 存在しないネームスペースに名前を付けると、エラーが発生します。
bind_address
および (MySQL 8.0.21)mysqlx_bind_address
は、カンマ区切りの複数のアドレスのリストを受け入れます。変数値は、グローバルネームスペース、名前付きネームスペースまたはその組合せでアドレスを指定できます。
ネームスペースを使用しようとしてサーバーの起動中にエラーが発生した場合、サーバーは起動しません。 プラグインの初期化中に X プラグイン でエラーが発生し、どのアドレスにもバインドできない場合、プラグインはその初期化シーケンスに失敗し、サーバーはそれをロードしません。
クライアント側では、ネットワークネームスペースを次のコンテキストで指定できます:
-
mysql クライアントおよび mysqlxtest テストスイートクライアントの場合は、
--network-namespace
オプションを使用します。 例:mysql --host=192.0.2.2 --network-namespace=red
--network-namespace
オプションを省略すると、接続ではデフォルト (グローバル) のネームスペースが使用されます。 -
レプリカサーバーからソースサーバーへのレプリケーション接続には、
CHANGE REPLICATION SOURCE TO
ステートメント (MySQL 8.0.23) またはCHANGE MASTER TO
ステートメント (MySQL 8.0.23 より前) を使用し、NETWORK_NAMESPACE
オプションを指定します。 例:CHANGE REPLICATION SOURCE TO SOURCE_HOST = '192.0.2.2', NETWORK_NAMESPACE = 'red';
NETWORK_NAMESPACE
オプションを省略すると、レプリケーション接続はデフォルト (グローバル) 名前空間を使用します。
次の例では、グローバル、red
および blue
ネームスペースで接続をリスニングする MySQL サーバーを設定し、red
および blue
ネームスペースから接続するアカウントを構成する方法を示します。 ホストシステムの前提条件 に示すように、red
および blue
ネームスペースがすでに作成されていることを前提としています。
-
複数のネームスペースのアドレスをリスニングするようにサーバーを構成します。 サーバー
my.cnf
ファイルに次の行を入力し、サーバーを起動します:[mysqld] bind_address = 127.0.1.1,192.0.2.2/red,198.51.100.2/blue
この値は、グローバルネームスペースでループバックアドレス
127.0.0.1
をリスニングし、red
ネームスペースでアドレス192.0.2.2
をリスニングし、blue
ネームスペースでアドレス198.51.100.2
をリスニングするようサーバーに指示します。 -
グローバルネームスペースのサーバーに接続し、各名前付きネームスペースのアドレス空間のアドレスから接続する権限を持つアカウントを作成します:
shell> mysql -u root -h 127.0.0.1 -p Enter password: root_password mysql> CREATE USER 'red_user'@'192.0.2.2' IDENTIFIED BY 'red_user_password'; mysql> CREATE USER 'blue_user'@'198.51.100.2' IDENTIFIED BY 'blue_user_password';
-
各名前付きネームスペースのサーバーに接続できることを確認します:
shell> mysql -u red_user -h 192.0.2.2 --network-namespace=red -p Enter password: red_user_password mysql> SELECT USER(); +--------------------+ | USER() | +--------------------+ | red_user@192.0.2.2 | +--------------------+
shell> mysql -u blue_user -h 198.51.100.2 --network-namespace=blue -p Enter password: blue_user_password mysql> SELECT USER(); +------------------------+ | USER() | +------------------------+ | blue_user@198.51.100.2 | +------------------------+
注記DNS がアドレスを対応するホスト名に解決できるように構成されており、サーバーが
skip_name_resolve
システム変数を有効にして実行されていない場合、USER()
とは異なる結果が表示され、IP アドレスではなくホスト名を含む値が返されることがあります。--network-namespace
オプションを指定せずに mysql を起動して、接続試行が成功したかどうか、成功した場合はUSER()
値がどのように影響を受けるかを確認することもできます。
レプリケーションモニタリングのために、これらの情報ソースには、接続に適用可能なネットワークネームスペースを表示するカラムがあります:
パフォーマンススキーマの
replication_connection_configuration
テーブル。 セクション27.12.11.1「replication_connection_configuration テーブル」を参照してください。レプリカサーバー接続メタデータリポジトリ。 セクション17.2.4.2「レプリケーションメタデータリポジトリ」を参照してください。
SHOW REPLICA | SLAVE STATUS
ステートメント。 セクション13.7.7.35「SHOW REPLICA | SLAVE STATUS ステートメント」を参照してください。