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 DROP
den 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
lo
hat bereits Zugriff, da Ihre erste -A INPUT -i lo -j ACCEPT
Regel 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.