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. :-)
.184 or .196 hosts
host client hanno anche indirizzi IP aggiuntivi nell'altra sottorete? Se fai untcpdump -qn port 3306
tentativo e ti connetti da uno di quei sistemi, cosa vedi? Vedi l'indirizzo che ti aspetti?