Direcciones IP de origen de la lista blanca en CentOS 7

23

Quiero configurar el firewall de CentOS 7 de modo que todas las solicitudes entrantes se bloqueen, excepto las direcciones IP de origen que incluyo en la lista blanca. Y para las direcciones IP de la lista blanca, todos los puertos deben ser accesibles.

Soy capaz de encontrar pocas soluciones (no estoy seguro de si funcionarán) para los iptablesusos de CentOS 7 firewalld. No puedo encontrar algo similar para lograr con el firewall-cmdcomando.

Las interfaces están en la zona pública. También he trasladado todos los servicios a la zona pública ya.

Krishnandu Sarkar
fuente

Respuestas:

44

Lograría esto agregando fuentes a una zona. Primero verifique qué fuentes hay para su zona:

firewall-cmd --permanent --zone=public --list-sources

Si no hay ninguno, puede comenzar a agregarlos, esta es su "lista blanca"

firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32

(Eso agrega una /24IP completa y una única, solo para que tenga una referencia para una subred y una sola IP)

Establezca el rango de puertos que desea abrir:

firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp

Esto solo hace los puertos 1 a 22. Puede ampliar esto, si lo desea.

Ahora, recarga lo que has hecho.

firewall-cmd --reload

Y revisa tu trabajo:

 firewall-cmd --zone=public --list-all

Nota al margen / editorial: no importa, pero me gusta la zona "de confianza" para un conjunto de IP de la lista blanca en Firewalld. Puede realizar una evaluación adicional leyendo las sugerencias de redhat sobre cómo elegir una zona .

Ver también:


Si desea DROPpaquetes fuera de esta fuente, aquí hay un ejemplo para descartar los que están fuera del /24que usé como ejemplo anterior, puede usar reglas completas para esto , creo. Esto es conceptual, no lo he probado (más allá de ver que centos 7 acepta el comando), pero debería ser lo suficientemente fácil como para hacer un pcap y ver si se comporta como esperarías

firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'
dougBTV
fuente
Muchas Gracias por contestar. No puedo votar debido a la escasez de reputación. Pero, ¿cómo elimino todas las demás IP excepto la que agregué usando fuentes?
Krishnandu Sarkar
Gracias @ KrishnanduSarkar: tienes razón, por defecto debería ser un rechazo ICMP. Pero, creo que puede agregar una regla rica para descartar los paquetes. Agregué un ejemplo a mi respuesta que creo que funcionará. Gracias por el voto a favor, entiendo, si una respuesta funciona, considere aceptar una respuesta.
dougBTV
Gran respuesta, había estado usando iptables hasta ahora.
Tensigh
(!) Esta respuesta no funcionará como se esperaba para la configuración de FirewallD predeterminada actual (las interfaces se asignan a la zona pública de forma predeterminada).
dess
25

Incluso si una respuesta ha sido aceptada y votada, no creo que sea correcta. No encuentro una explicación clara en la documentación, pero por el comportamiento implementado se ve así:

  1. La interfaz y la fuente se utilizan como selectores, qué zona (s) activar
  2. ambos se ignoran para la zona predeterminada (siempre activa)

Entonces la respuesta sería:

  1. bloquear la zona predeterminada, decir "público": no hay puertos abiertos ni servicios disponibles
  2. en otra zona, diga "trabajo" - defina el origen y los puertos abiertos

Por ejemplo, suponiendo que la zona predeterminada es pública y no tiene puertos abiertos, agregue el origen y el rango de puertos a la zona de "trabajo":

$ sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ sudo firewall-cmd --zone=work --add-port=8080-8090/tcp

ahora verifique las zonas activas (la zona predeterminada siempre está activa):

$ sudo firewall-cmd --get-active-zones

usted obtendrá:

work
  sources: 192.168.0.0/24

entonces las reglas de zona de "trabajo" se aplicarán a la subred particular. Tendrá un rango de puertos abiertos para la "lista blanca" = subred según lo solicitado. Y, por supuesto, use la --permanentopción en las --add-xxxdeclaraciones para que el comportamiento se mantenga.

A su vez, los puertos o servicios que tenga en la zona "pública" (predeterminada) se aplicarán a todas las interfaces y direcciones de origen.

$ sudo firewall-cmd --list-all-zones

public (default)
interfaces:
sources:
services:
ports: 
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

work (active)
interfaces: 
sources: 192.168.0.0/24
services: dhcpv6-client ipp-client ssh
ports: 8080-8090/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

El mismo sistema funciona para las interfaces. Digamos agregando la interfaz "ens3" a la zona de "trabajo":

$ sudo firewall-cmd --zone=work --add-interface=ens3

utilizará las reglas de zona de "trabajo" para cualquier solicitud de la interfaz particular, un selector más aproximado que "fuente".

Normunds Kalnberzins
fuente
44
Esta es la mejor respuesta. La parte más crucial es la explicación de que configurar una interfaz amplía el acceso (en caso de que se configuren las fuentes). Tuve un problema de que los puertos eran accesibles a pesar de que tenía una sourceslista blanca. La razón fue que la zona tenía una interfaz asignada.
pinkeen
1
Para ser exactamente correcta, esta respuesta necesita eliminar todos los servicios predeterminados de la publiczona, si los hay (estos servicios estarán disponibles para todas las direcciones ya que las interfaces se asignan a la publiczona de forma predeterminada). O cambie la zona predeterminada a otra: blocko drop(esta es una práctica común). O cambie el publicobjetivo de zona a %%REJECT%%o DROP.
dess
6

Descargo de responsabilidad: en realidad no he probado lo que estoy sugiriendo aquí, pero está bastante cerca de la última configuración de Firewallld que hice, así que me voy de eso. Firewalld le proporciona algunas zonas preconfiguradas, solo para este propósito. Hay uno llamado "soltar", que suelta todo lo que entra, y uno llamado "confiable", que permite cualquier conexión (es decir, por lo que no debería necesitar abrir puertos individuales, creo). El truco es obtener la zona correcta para activar lo que quieres.

Firewalld aplicará las reglas para una zona en función de la siguiente precedencia:

  • Si la IP de origen coincide con una IP de origen vinculada a una zona, la utiliza.
  • Si la IP de origen no coincide con ninguna zona en particular, verifica si hay una zona configurada para la interfaz en la que entró el paquete. Si hay uno, lo usa.
  • Por último, si nada más coincide, utiliza la zona predeterminada.

Entonces, en primer lugar, desea vincular sus IP confiables a la zona "confiable":

firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4

Luego, configura tu zona predeterminada para "soltar" o vincula tu interfaz a ella:

firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0

y luego haga que los cambios surtan efecto (advertencia: esto probablemente cortará su conexión si está haciendo esto a través de la red y no agregó su IP de origen a la zona de confianza):

firewall-cmd --reload

Por supuesto, también puede probarlos temporalmente omitiendo "--permanente" (y luego no tiene que - recargar, tampoco).

Jemenake
fuente
blocktambién se puede usar (en lugar de drop) si quieres decirle a otros anfitriones que no estás hablando con ellos ...
Gert van den Berg
5

Opero mis cortafuegos de esta manera. Aquí está mi método preferido para lograr lo que quieres.

# firewall-cmd --list-all

Verá que su zona predeterminada es pública y los servicios habilitados son dhcpv6-client y ssh. No queremos ningún servicio público disponible, ¿verdad? Solo las IP de la lista blanca están autorizadas. Entonces, eliminemos los dos servicios públicos.

# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent

Ahora, vamos a incluir en la lista blanca una IP específica que otorga acceso a cualquier puerto.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'

Ahora, vamos a incluir en la lista blanca otra IP, que solo queremos tener acceso a SSH, http y https. No hay otros puertos.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="ssh" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="http" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx service name="https" accept'

Si se conecta a través de SSH, asegúrese de autorizar su IP antes de aplicar su nuevo conjunto de reglas. Cuando esté listo para aplicar las nuevas reglas.

#firewall-cmd --reload
Sagaponack FX
fuente
2

Puede administrar fácilmente por Rich Rule.

Primer paso

firewall-cmd --permanent --set-default-zone=home
firewall-cmd --permanent --zone=drop --change-interface=eth0

Segundo paso: agregar regla enriquecida

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" source address="192.168.78.76/32" accept'

192.168.2.2 puede acceder a todos los puertos una vez que agrega una regla enriquecida y bloquea todos los puertos de otra fuente.

Si agrega algún puerto o servicio mediante el siguiente comando, todas las fuentes podrán acceder a él.

firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-port=8080

Si desea abrir un puerto específico para Ip específico que el siguiente comando

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" port="8080/tcp" source address="192.168.78.76/32" accept'
Ranjeet Ranjan
fuente
2

La respuesta principal de dougBTV es incorrecta. No puedo responder a su respuesta porque todavía no tengo los puntos de representante necesarios, así que explicaré aquí:

Está utilizando la zona predeterminada "público". Está atando redes a esa zona y luego abriendo puertos en esa zona. Pero, en una configuración predeterminada, todo el tráfico pasa a través de la zona predeterminada, no solo las redes de origen que vincula. Por lo tanto, sus comandos --add-source no hacen ninguna diferencia y sus comandos --add-port ahora han permitido que todo el mundo acceda a esos puertos.

La segunda respuesta de Normunds Kalnberzins es correcta. Desea crear una zona separada, vincular su red / IP a esa zona y abrir los puertos en esa zona.

Alternativamente, puede dejar todo en la zona predeterminada y usar las ricas reglas de firewalld para permitir el acceso desde ciertas IP:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'

Esto permite todo el tráfico desde 192.168.2.2 a todos los puertos y, como no he especificado una zona, se aplicará a la zona predeterminada "public" (use --get-default-zone para verificar cuál es su zona predeterminada y - get-active-zones para ver qué zonas están actualmente en uso).

Para permitir el acceso desde esta IP solo a un puerto específico, haría:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" port port="1234" protocol="tcp" accept'

La mejor práctica es ejecutar estos comandos sin --permanente (o --perm para abreviar) que afecta el cortafuegos actualmente en ejecución. Después de probar que su regla está funcionando, ejecútela nuevamente con --perm agregado para que se recuerde en las posteriores recargas de Firewallld.

devhen
fuente
1

Solo para agregar a la respuesta de Normunds:

$ sudo firewall-cmd --permanent --zone=work --add-source=172.16.0.0/12
$ sudo firewall-cmd --permanent --zone=work --add-port=8080-8090/tcp

Para bloquear el resto del tráfico:

$ sudo firewall-cmd --set-default-zone=drop

Advertencia: si accede desde una máquina remota, esto puede desconectar su sesión de inicio de sesión. Si no obtuvo la configuración de IP de la zona de 'trabajo' correctamente, no podrá conectarse a su servidor.

Para volver a cargar el firewall:

$ sudo firewall-cmd --reload

No pude descubrir cómo agregar dos IP diferentes con '--add-rich-rule'.

SongLiAtDuke
fuente
Para la configuración actual predeterminada de FirewallD, puede que no sea suficiente. Vea mi comentario a la respuesta de Normunds para más detalles.
dess
para múltiples IPs use crear un ips ipsetcomo firewall-cmd --permanent --new-ipset=blacklist --type=hash:ipagregar al ipset con el que firewall-cmd --ipset=blacklist --add-entry=192.168.1.4luego puede usarfirewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye
0

Me sorprende que las respuestas de la zona de confianza no sean la respuesta seleccionada. La zona de confianza tiene un "objetivo: ACEPTAR" predeterminado, mientras que el resto es "objetivo: predeterminado". Si bien realmente no importa, parece ser el método previsto debido a su nombre y valor objetivo predeterminado.

Cómo bloquear rápidamente una caja para que solo tú puedas acceder a ella:

firewall-cmd --zone=trusted --add-source=1.2.3.4
firewall-cmd --zone=trusted --add-source=5.6.7.8/24
firewall-cmd --zone=drop --change-interface=eth1
firewall-cmd --set-default-zone=drop
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all-zones

Después de enumerar todas las zonas, debería ver algo como esto:

trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  sources: 1.2.3.4 5.6.7.8/24
  masquerade: no

drop (active)
  target: DROP
  icmp-block-inversion: no
  interfaces: eth1
  masquerade: no

Nota: eliminé líneas con un valor nulo / faltante. Lo importante es que Trusted y Drop son ambos (activos) y Drop tiene su interfaz pública.

Lo que esto hace a iptables para demostración:

Chain INPUT_ZONES_SOURCE (1 references)
target     prot opt source               destination
IN_trusted  all  --  1.2.3.4         0.0.0.0/0
IN_trusted  all  --  5.6.7.8/24        0.0.0.0/0
Chain INPUT_ZONES (1 references)
target     prot opt source               destination
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
Kirin
fuente