Tengo estas reglas de iptables en el primer servidor que tiene la función de un cliente que se conecta a un segundo servidor MySQL a través de un adaptador LAN.
*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
Lo que pasa es que tan pronto como lo hago:
service iptables restart
Parece que todas las conexiones MYSQL a un segundo servidor funcionan correctamente pero solo por un pequeño período de tiempo, generalmente de 1 a 2 minutos, pero en estos 1 a 2 minutos las conexiones a nginx (servidor web, puerto 80) no funcionan. Después de 1 o 2 minutos, sucede que el servidor web funciona y MYSQL no funciona. También probé el comando iptables-save hasta ahora, pero nada cambió.
Esta es la configuración del firewall del segundo servidor MySQL:
*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
Respuesta1
Debería configurar la política predeterminada DROP
en caso de que su última regla general se elimine accidentalmente; como esto :
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1:44135]
Ahora, en el segundo servidor.
-A INPUT -d 192.168.1.1/32 -p tcp -m tcp --sport 1024:65535 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
Esta regla coincide con conexiones cuyo destino es 192.168.1.1, puerto de origen del 1024 al 65535, puerto de destino 3306 y estado nuevo o establecido. Estás pensando demasiado en esto; Si desea permitir conexiones MySQL, solo tiene que hacer coincidir el puerto de destino y, opcionalmente, agregar un parámetro de fuente y/o interfaz si desea bloquearlo en una IP o interfaz de origen en particular.
-A INPUT -i lo -p tcp -m tcp --dport 3306 -j ACCEPT
lo
ya tiene acceso porque su primera -A INPUT -i lo -j ACCEPT
regla coincidirá con todo lo que provenga del loopback.
-A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
Bien, ahora estás permitiendo toda la subred, pero eso ya es mejor y debería funcionar.
-A INPUT -s 127.0.0.1/32 -p tcp -m tcp --dport 3306 -j ACCEPT
Igual que el anterior, el loopback ya está permitido de todos modos.
-A INPUT -i eth1 -p tcp -m tcp --dport 3306 -j ACCEPT
Ahora estás permitiendo todo lo que viene de eth1 con un puerto de destino 3306.
-A OUTPUT -p tcp -m tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
Su política de SALIDA es ACEPTAR todo de todos modos, esas reglas no tienen sentido.
Estoy bastante seguro de que tu problema se debe a que elEl módulo de estado ha quedado obsoleto.y posiblemente eliminado, por lo que deberías usar conntrack.
Resumen:
Primer servidor:
-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
Segundo servidor :
-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
Esto permitirá todas las conexiones SSH y MySQL que se originen desde eth1, 192.168.1.0/24. Siéntete libre de cambiar eso.