Warum scheint die Firewall nur zeitweise zu funktionieren?

Warum scheint die Firewall nur zeitweise zu funktionieren?

Ich habe diese iptables-Regeln auf dem ersten Server, der die Rolle eines Clients hat, der über einen LAN-Adapter eine Verbindung zu einem zweiten MySQL-Server herstellt.

*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

Sobald ich das tue, geschieht Folgendes:

service iptables restart

es scheint, dass alle MySQL-Verbindungen zu einem zweiten Server korrekt funktionieren, aber nur für einen kurzen Zeitraum, normalerweise 1-2 Minuten, aber in diesen 1-2 Minuten funktionieren die Verbindungen zu nginx (Webserver, Port 80) nicht. Nach 1-2 Minuten funktioniert der Webserver, MySQL jedoch nicht. Habe bisher auch den Befehl iptables-save ausprobiert, aber nichts hat sich geändert.

Dies ist die Firewall-Konfiguration des zweiten MySQL-Servers:

    *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

Antwort1

Sie sollten die Standardrichtlinie für DROPden Fall festlegen, dass Ihre letzte Catch-All-Regel versehentlich entfernt wird; etwa so:

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

Jetzt auf dem zweiten Server.

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

Diese Regel trifft auf Verbindungen zu, deren Ziel 192.168.1.1 ist, deren Quellport zwischen 1024 und 65535 liegt, deren Zielport 3306 ist und deren Status neu oder etabliert ist. Sie denken zu viel darüber nach; wenn Sie MySQL-Verbindungen zulassen möchten, müssen Sie nur den Zielport abgleichen und optional einen Quell- und/oder Schnittstellenparameter hinzufügen, wenn Sie ihn auf eine bestimmte Quell-IP oder Schnittstelle beschränken möchten.

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

lohat bereits Zugriff, da Ihre erste -A INPUT -i lo -j ACCEPTRegel auf alles zutrifft, was vom Loopback kommt.

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

Okay, jetzt lassen Sie das gesamte Subnetz zu, aber das ist schon besser und sollte funktionieren.

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

Wie oben, Loopback ist ohnehin bereits zulässig.

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

Jetzt lassen Sie alles zu, was von eth1 mit dem Zielport 3306 kommt.

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

Ihre OUTPUT-Richtlinie lautet ohnehin: ALLES AKZEPTIEREN, diese Regel ist sinnlos.

Ich bin ziemlich sicher, dass Ihr Problem darin liegt, dass dieDas Statusmodul ist veraltetund möglicherweise entfernt, daher sollten Sie Conntrack verwenden.

Zusammenfassung:

Erster Server:

-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

Zweiter Server :

-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

Dadurch werden alle SSH- und MySQL-Verbindungen zugelassen, die von eth1, 192.168.1.0/24 stammen. Sie können dies gerne ändern.

verwandte Informationen