ファイアウォールが断続的に動作しているように見えるのはなぜですか?

ファイアウォールが断続的に動作しているように見えるのはなぜですか?

私は、LAN アダプタを介して 2 番目の MySQL サーバーに接続するクライアントの役割を持つ最初のサーバーにこの iptables ルールを設定しました。

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:44135]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Wed Feb  4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb  4 20:33:41 2015
*nat
:PREROUTING ACCEPT [76:10856]
:POSTROUTING ACCEPT [11:734]
:OUTPUT ACCEPT [11:734]
COMMIT
# Completed on Wed Feb  4 20:33:41 2015
# Generated by iptables-save v1.4.7 on Wed Feb  4 20:33:41 2015
*mangle
:PREROUTING ACCEPT [2739:2511918]
:INPUT ACCEPT [2739:2511918]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1913:165876]
:POSTROUTING ACCEPT [1913:165876]
COMMIT

私がそうするとすぐに、次のようなことが起こります:

service iptables restart

2 番目のサーバーへのすべての MYSQL 接続は正常に機能しているようですが、通常は 1 ~ 2 分間という短い時間しか機能しません。ただし、この 1 ~ 2 分間は nginx (Web サーバー、80 ポート) への接続が機能しません。1 ~ 2 分後には、Web サーバーは機能し、MYSQL は機能しなくなります。これまで iptables-save コマンドも試しましたが、何も変わりませんでした。

これは 2 番目の MySQL サーバーのファイアウォール設定です。

    *filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2785:425650]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

答え1

DROP最後のキャッチオールルールが誤って削除された場合に備えて、次のようにデフォルトポリシーを設定する必要があります。

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1:44135]

さて、2番目のサーバーです。

-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

このルールは、宛先が 192.168.1.1、送信元ポートが 1024 から 65535、宛先ポートが 3306、状態が新規または確立である接続に一致します。これは考えすぎです。MySQL 接続を許可する場合は、宛先ポートに一致させるだけでよく、特定の送信元 IP またはインターフェイスにロックダウンする場合は、オプションでソースおよび/またはインターフェイス パラメータを追加する必要があります。

-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT

lo最初の-A INPUT -i lo -j ACCEPTルールはループバックから来るものすべてに一致するため、すでにアクセス権を持っています。

-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

さて、これでサブネット全体を許可しましたが、これですでに改善されており、動作するはずです。

-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT

上記と同じように、ループバックはすでに許可されています。

-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT

これで、宛先ポートが 3306 である eth1 からのすべての通信が許可されます。

-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

とにかく、OUTPUT ポリシーはすべてを受け入れることになっているので、そのルールは無意味です。

あなたの問題は、状態モジュールは廃止されました削除される可能性があるので、conntrack を使用する必要があります。

要約:

最初のサーバー:

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT

2番目のサーバー:

-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth1 -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m conntrack --ctstate NEW -j ACCEPT

これにより、eth1、192.168.1.0/24 からのすべての SSH 接続と MySQL 接続が許可されます。自由に変更してください。

関連情報