0

ここ数日、アプリケーション サーバーとデータベース サーバー (Mysql) の間で奇妙な問題に直面しています。アプリケーション サーバーからデータベース サーバーへの接続が SYN_SENT 状態でハングし、その後、mysql ポート ( 3306)。データベース サーバーの netstat 出力を確認したところ、SYN_RECV 状態でした。

私が理解できるのは、mysqlサーバーがSYNリクエストを受信して​​応答していて、クライアントに到達していないため、サーバー側でSYN_RECV、クライアント側でSYN_SENTであるということです。しばらくすると SYN_SENT 状態になるはずです。このため、同じサーバーへの他のデータベース接続の試行がハングすることはありません。

この問題を解決する方法を知っている人はいますか?

セットアップの詳細: アプリケーション サーバー: RHEL 5.4、カーネル リリース = 2.6.18-164.el5、x86_64 データベース サーバー: Mysql バージョン: 5.1.49 RHEL 5.4、カーネル リリース = 2.6.18-164.el5、x86_64

4

1 に答える 1

-1

localhost アクセスのみのサーバーの修正: my.cnf のバインド アドレスに 127.0.0.1 を設定します。

リモート IP への接続を修正 (REMOTE_IP をリモート IP に置き換え)

iptables -A INPUT -p tcp -d 127.0.0.1 --dport 3306 -s REMOTE_IP -j ACCEPT
iptables -A INPUT -p udp -d 127.0.0.1 --dport 3306 -s REMOTE_IP -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
iptables -A INPUT -p udp --dport 3306 -j DROP

また、my.cnf の bind ip を 0.0.0.0 に設定する必要があります。必要のない 2 番目のルールです。念のため作成しました ;) (udp 部分)

概念実証: まず、remoteip から宛先への接続を許可します (-d 127.0.0.1 = localhost) -p tcp / udp = protocoll tcp または udp

このルールの後、ポート 3306 への tcp / udp 接続へのすべてのリクエストをドロップするルールを作成する必要があります。

これが機能する理由: iptables が「数値」になるためです。常に次から次へと 1 つのルール。

次のコマンドでルールを確認できます。

iptables -L INPUT -n --line-numbers

表示される最初のルールが最初のルールであるため、すべての接続を受け入れ、その後 ip xxxx からすべての接続をドロップすると、機能しません。このIPからのすべての接続をドロップし、その後すべての接続を許可する最初のルールとして選択する必要があります。(例えが悪いです..)

エントリに失敗した場合は、ルールを表示し、ルールの前に番号を付けて、次のコマンドでルールを削除できます。

iptables -D INPUT <<number here>>
于 2012-04-21T01:40:44.613 に答える