NATがポートリダイレクトを有効にした後、MysqlユーザーはゲートウェイIPから接続します。

NATがポートリダイレクトを有効にした後、MysqlユーザーはゲートウェイIPから接続します。

「LAN」ブリッジ(vmbr1)と「WAN」ブリッジ(vmbr0)を持つ仮想化ホストには2つのコンテナがあります。

仮想化ホストは、vmbr0ブリッジのパブリックIPで構成されています(仮想123.123.123.123と仮定)。

この仮想化ホストには 2 つのコンテナがあります。

  • ネットワークコンテナ(10.1.0.210/24)
  • データベースコンテナ(10.1.0.250/24)

Webコンテナはmysqlデータベースを使用します。 10.1.0.250:3306 に接続するように構成されています。

mysqlには、Webホスト(10.1.0.210)の接続のみを許可するWebアプリケーションユーザーがいます。

NATルール(WANからの接続を許可する必要があります)を追加するまで、すべてがうまく機能しました。これは私の/etc/network/interfaces vmbr1(LAN)設定からのものです。

# there is no need to add -m multiport here, these rules are from my "template"
# post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m multiport --dport 3306 -j DNAT --to-destination 10.5.0.250
# post-up iptables -t nat -A POSTROUTING -o vmbr1 -p tcp -m multiport --dport 3306 -d 10.5.0.250 -j SNAT --to-source 10.5.0.1
# pre-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp -m multiport --dport 3306 -j DNAT --to-destination 10.5.0.250
# pre-down iptables -t nat -D POSTROUTING -o vmbr1 -p tcp -m multiport --dport 3306 -d 10.5.0.250 -j SNAT --to-source 10.5.0.1

問題は、iptablesに次のルールを追加するときです。

iptables -t nat -A PREROUTING -i vmbr0 -p tcp -m multiport --dport 3306 -j DNAT --to-destination 10.5.0.250
iptables -t nat -A POSTROUTING -o vmbr1 -p tcp -m multiport --dport 3306 -d 10.5.0.250 -j SNAT --to-source 10.5.0.1

Webアプリケーションが接続しようとするとmysqlでログインエラーが発生し、Webアプリケーションが機能しなくなりました。 mysqlの観点からは、接続は実際の10.1.0.210(mysqlユーザー)ではなく10.1.0.1アドレス(LAN側ゲートウェイ)で行われます。[Eメール保護]接続は許可されていますが、ユーザーは[Eメール保護]許可されません)。

これは、ポート3306へのすべての接続がNATを通過し、NATが10.1.0.210を10.1.0.1に変換するためです。

この問題をどのように解決できますか?

おそらく、これらのnatルールを「絞り込み」WANでのみ接続が確立された場合にのみ機能するようにする必要があります。ただし、本番サーバーでこれを台無しにするほど、ネットワーキングとiptablesについて十分にはわかりません。

答え1

追加したNATルールによって、Webコンテナ接続の送信元IPアドレスがWebコンテナのIPアドレスではなくLAN側ゲートウェイ(10.1.0.1)のIPアドレスに変更されることが問題のようです。実際のIPアドレス(10.1.0.210)。これにより、MySQLサーバーは接続が許可されていないIPアドレスから来たため、接続を拒否します。

この問題を解決する 1 つの方法は、着信接続の送信元 IP アドレスを確認し、接続が WAN から来る場合にのみ DNAT および SNAT ルールを適用する DNAT および SNAT ルールの前に追加の iptables ルールを追加することです。 「-s」オプションを使用して送信元IPアドレスを指定し、「-j」オプションを使用してルールターゲット(この場合はDNATおよびSNATルール)を指定できます。

別の回避策は、データベースコンテナの内部IPアドレスではなく、仮想化ホストのパブリックIPアドレスを介してMySQLサーバーに接続するようにWebコンテナを設定することです。これにより、NATルールは接続に影響を与えません。

mysqlに、バインドアドレスを10.1.0.250ではなく0.0.0.0に設定して、すべてのインターフェイスを受信し、NATルールの影響を受けないようにするオプションがあることを確認することもできます。

関連情報