Iptables erlauben keine MySQL-Verbindungen zu Alias-IPs?

10

Ich habe eine ziemlich einfache iptables-Firewall auf einem Server, der MySQL-Dienste bereitstellt, aber iptables scheint mir sehr inkonsistente Ergebnisse zu liefern.

Die Standardrichtlinie für das Skript lautet wie folgt:

iptables -P INPUT DROP

Ich kann MySQL dann mit der folgenden Regel öffentlich machen:

iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

Mit dieser Regel kann ich problemlos von jeder Quell-IP zu jeder Ziel-IP auf dem Server eine Verbindung zu MySQL herstellen. Wenn ich jedoch versuche, den Zugriff auf nur drei IPs zu beschränken, indem ich die obige Zeile durch die folgende ersetze, stoße ich auf Probleme (xxx = maskierter Oktekt):

iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.184 -j ACCEPT 
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.196 -j ACCEPT 
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.251 -j ACCEPT 

Sobald die oben genannten Regeln vorhanden sind, geschieht Folgendes:

  • Ich kann von den Hosts .184, .196 und .251 aus eine Verbindung zum MySQL-Server herstellen, sofern ich eine Verbindung zum MySQL-Server mit seiner Standard-IP-Adresse oder einem IP-Alias ​​im selben Subnetz wie die Standard-IP-Adresse herstelle.

  • Ich kann keine Verbindung zu MySQL über IP-Aliase herstellen, die dem Server aus einem anderen Subnetz als der Standard-IP des Servers zugewiesen sind, wenn ich von den Hosts .184 oder .196 komme, aber .251 funktioniert einwandfrei. Von den .184- oder .196-Hosts hängt nur ein Telnet-Versuch ...

    # telnet 209.xxx.xxx.22 3306
    Trying 209.xxx.xxx.22...
    
  • Wenn ich die .251-Zeile entferne (wobei .196 die letzte hinzugefügte Regel ist), kann der .196-Host immer noch keine Verbindung zu MySQL über IP-Aliase herstellen (es ist also nicht die Reihenfolge der Regeln, die das inkonsistente Verhalten verursacht). Ich weiß, dieser spezielle Test war albern, da es keine Rolle spielen sollte, in welcher Reihenfolge diese drei Regeln hinzugefügt werden, aber ich dachte, jemand könnte fragen.

  • Wenn ich wieder zur "öffentlichen" Regel wechsle, können alle Hosts eine Verbindung zum MySQL-Server herstellen, indem sie entweder die Standard- oder die Alias-IPs (in beiden Subnetzen) verwenden:

    iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
    

Der Server wird in einem CentOS 5.4 OpenVZ / Proxmox-Container (2.6.32-4-pve) ausgeführt.

Und für den Fall, dass Sie die Problemregeln lieber im Kontext des iptables-Skripts sehen möchten, finden Sie sie hier (xxx = maskierter Oktekt):

# Flush old rules, old custom tables
/sbin/iptables --flush
/sbin/iptables --delete-chain

# Set default policies for all three default chains
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT ACCEPT

# Enable free use of loopback interfaces
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT

# All TCP sessions should begin with SYN
/sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

# Accept inbound TCP packets (Do this *before* adding the 'blocked' chain)
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow the server's own IP to connect to itself
/sbin/iptables -A INPUT -i eth0 -s 208.xxx.xxx.178 -j ACCEPT

# Add the 'blocked' chain *after* we've accepted established/related connections
#   so we remain efficient and only evaluate new/inbound connections
/sbin/iptables -N BLOCKED
/sbin/iptables -A INPUT -j BLOCKED

# Accept inbound ICMP messages
/sbin/iptables -A INPUT -p ICMP --icmp-type 8 -j ACCEPT
/sbin/iptables -A INPUT -p ICMP --icmp-type 11 -j ACCEPT

# ssh (private)
/sbin/iptables -A INPUT -p tcp --dport 22 -m state --state NEW -s xxx.xxx.xxx.xxx -j ACCEPT          

# ftp (private)
/sbin/iptables -A INPUT -p tcp --dport 21 -m state --state NEW -s xxx.xxx.xxx.xxx -j ACCEPT          

# www (public)
/sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT                                
/sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT                               

# smtp (public)
/sbin/iptables -A INPUT -p tcp --dport 25 -j ACCEPT                                
/sbin/iptables -A INPUT -p tcp --dport 2525 -j ACCEPT                              

# pop (public)
/sbin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT                               

# mysql (private)
/sbin/iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.xxx.xxx.184 -j ACCEPT 
/sbin/iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.xxx.xxx.196 -j ACCEPT 
/sbin/iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.xxx.xxx.251 -j ACCEPT 

Irgendwelche Ideen? Danke im Voraus. :-)

Curtis
quelle
1
Haben die .184 or .196 hostsClient-Hosts auch zusätzliche IP-Adressen in Ihrem anderen Subnetz? tcpdump -qn port 3306Was sehen Sie, wenn Sie versuchen, eine Verbindung von einem dieser Systeme herzustellen? Sehen Sie die erwartete Quelladresse?
Zoredache
1
Danke, Zordache! Das hat es gelöst. Dem .251-Host wurden keine IPs vom anderen Subnetz zugewiesen. Die beiden anderen Hosts tun dies (.184 und .196). Wenn sie also eine Verbindung zu einer IP im anderen Subnetz herstellen, wechselt die Quell-IP auf diesen Hosts zu einer IP im selben Subnetz. Ich hatte gedacht, dass die ausgehende / Quell-IP immer die zugewiesene Standard-IP sein würde. Tcpdump zeigt jedoch deutlich, dass sich die Quell-IP in das Subnetz 209.xxx.xxx.xxx ändert, wenn eine Verbindung zu einer IP in demselben Subnetz hergestellt wird. (Musste jedoch tcpdump vom physischen Proxmox-Host ausführen.) Sie sind ein Genie. Vielen Dank!
Curtis

Antworten:

8

Haben die .184- oder .196-Hosts-Client-Hosts auch zusätzliche IP-Adressen in Ihrem anderen Subnetz?

tcpdump -qn port 3306Was sehen Sie, wenn Sie versuchen, eine Verbindung von einem dieser Systeme herzustellen? Sehen Sie die erwartete Quelladresse? Dies ist wahrscheinlich ein einfaches Routing-Problem.

Wenn ein System die Routenentscheidung trifft, konsultiert es die Routentabelle. Routentabellen sind eine Liste, die immer in einer bestimmten Reihenfolge abgerufen wird. Die Verbindungsrouten für lokale Netzwerke sind fast immer die am meisten bevorzugten Routen und werden vor einer Route verwendet, die ein Gateway (Router) verwendet. Das Standard-Gateway ist immer die Route, die verwendet wird, wenn keine andere Route angewendet wird. Wenn für eine Route eine bestimmte Route srcdefiniert ist, wird diese Adresse bevorzugt und höchstwahrscheinlich verwendet, wenn diese Route verwendet wird.

10.2.13.0/24 dev eth1  proto kernel  scope link  src 10.2.13.1 
10.2.4.0/23 dev eth0  proto kernel  scope link  src 10.2.4.245 
default via 10.2.4.1 dev eth0 

So gegebene Tabelle in dieser Beispiel Route für ein multi-homed System, alles für bestimmt 10.2.13.0/24wird aus 10.2.13.1, und alles , was dazu bestimmt , für 10.2.4.0/23kommt aus 10.2.4.245.

Zoredache
quelle