iptables non consente connessioni mysql a ips con alias?


10

Ho un firewall iptables abbastanza semplice su un server che fornisce servizi MySQL, ma iptables sembra darmi risultati molto incoerenti.

La politica di default sullo script è la seguente:

iptables -P INPUT DROP

Posso quindi rendere pubblico MySQL con la seguente regola:

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

Con questa regola in atto, posso collegarmi a MySQL da qualsiasi IP di origine a qualsiasi IP di destinazione sul server senza problemi. Tuttavia, quando provo a limitare l'accesso a soli tre IP sostituendo la riga precedente con quanto segue, mi imbatto nei guai (xxx = octect mascherato):

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 

Una volta che le regole di cui sopra sono in atto, si verifica quanto segue:

  • Io posso connettersi al server MySQL dalle .184, .196 e .251 padroni di casa bene fintanto che sono il collegamento al server MySQL utilizzando l'indirizzo IP di default è di o un alias IP nella stessa sottorete come l'indirizzo IP predefinito.

  • Non riesco a collegarmi a MySQL usando gli alias IP assegnati al server da una sottorete diversa dall'IP predefinito del server quando provengo dagli host .184 o .196, ma .251 funziona bene. Dagli host .184 o .196, un tentativo di telnet si blocca ...

    # telnet 209.xxx.xxx.22 3306
    Trying 209.xxx.xxx.22...
    
  • Se rimuovo la linea .251 (rendendo l'ultima regola aggiunta .196), l'host .196 non può ancora connettersi a MySQL utilizzando gli alias IP (quindi non è l'ordine delle regole che causa il comportamento incoerente). Lo so, questo particolare test è stato sciocco in quanto non dovrebbe importare in quale ordine vengono aggiunte queste tre regole, ma ho pensato che qualcuno potesse chiedere.

  • Se torno alla regola "pubblica", tutti gli host possono connettersi al server MySQL utilizzando gli IP predefiniti o con alias (in entrambe le sottoreti):

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

Il server è in esecuzione in un contenitore CentOS 5.4 OpenVZ / Proxmox (2.6.32-4-pve).

E, nel caso in cui preferisci vedere le regole del problema nel contesto dello script iptables, eccolo qui (xxx = octect mascherato):

# 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 

Qualche idea? Grazie in anticipo. :-)


1
Gli .184 or .196 hostshost client hanno anche indirizzi IP aggiuntivi nell'altra sottorete? Se fai un tcpdump -qn port 3306tentativo e ti connetti da uno di quei sistemi, cosa vedi? Vedi l'indirizzo che ti aspetti?
Zoredache,

1
Grazie Zordache! Ciò ha risolto. L'host .251 non aveva alcun IP assegnato dall'altra sottorete. Gli altri due host lo fanno (.184 e .196), quindi quando si connettono a un IP sull'altra sottorete, l'IP di origine su quegli host passa a un IP nella stessa sottorete. Avevo pensato che l'IP in uscita / sorgente sarebbe sempre quello predefinito assegnato. Ma tcpdump mostra chiaramente che l'IP di origine passa alla sottorete 209.xxx.xxx.xxx ogni volta che si collega a un IP nella stessa sottorete. (Ho dovuto eseguire tcpdump dall'host Proxmox fisico.) Sei un genio. Grazie!
Curtis,

Risposte:


8

Gli host client .184 o .196 hanno anche indirizzi IP aggiuntivi nell'altra sottorete?

Se fai un tcpdump -qn port 3306tentativo e ti connetti da uno di quei sistemi, cosa vedi? Vedi l'indirizzo che ti aspetti? Questo è probabilmente un semplice problema di routing.

Quando un sistema prende la decisione del percorso, consulta la tabella del percorso. Le tabelle di route sono un elenco che viene sempre consultato in un ordine specifico. Le route di collegamento per le reti locali sono quasi sempre le route preferite e verranno utilizzate prima di una route che utilizza un gateway (router). Il gateway predefinito è sempre la route utilizzata quando non si applica nessun altra route. Se una rotta ha una determinata rotta src, allora quell'indirizzo sarà preferito e molto probabilmente usato quando quella rotta viene utilizzata.

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 

Quindi, dato questo esempio di tabella di instradamento per un sistema multi-homed, qualsiasi cosa destinata 10.2.13.0/24verrà 10.2.13.1e da quale parte 10.2.4.0/23verrà 10.2.4.245.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.