私は、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 接続が許可されます。自由に変更してください。