bloquear todos menos unos ips con firewalld

17

En una máquina en red de Linux, me gustaría restringir el conjunto de direcciones en la zona "pública" (concepto de cortafuegos), que pueden acceder a ella. Entonces, el resultado final sería que ninguna otra máquina puede acceder a ningún puerto o protocolo, excepto aquellos explícitamente permitidos, una especie de mezcla de

  --add-rich-rule='rule family="ipv4" source not  address="192.168.56.120" drop'

  --add-rich-rule='rule family="ipv4" source not  address="192.168.56.105" drop'

El problema anterior es que esta no es una lista real, bloqueará todo ya que si una dirección está bloqueada al no ser la misma que la otra, generando un efecto accidental de "descartar todo", ¿cómo "desbloquearía" un conjunto contiguo? ¿La fuente acepta una lista de direcciones? No he visto nada en mi mirada a los documentos o el resultado de Google hasta ahora.


EDITAR: Acabo de crear esto:

# firewall-cmd  --zone=encrypt --list-all
encrypt (active)
  interfaces: eth1
  sources: 192.168.56.120
  services: ssh
  ports: 6000/tcp
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

Pero todavía puedo llegar al puerto 6000 .123 porque mi intención era que si una fuente no está en la lista, no debería poder llegar a ningún servicio o puerto

Miguel
fuente

Respuestas:

24

Las ricas reglas no son necesarias en absoluto.

Si desea restringir una zona a un conjunto específico de IP, simplemente defina esas IP como fuentes para la zona en sí (y elimine cualquier definición de interfaz que pueda estar presente, ya que anulan las IP de origen).

Sin embargo, es probable que no desee hacer esto en la zona "pública", ya que eso significa semánticamente que los servicios públicos estén abiertos al mundo.

En su lugar, intente utilizar una zona diferente, como "interna", para direcciones IP en su mayoría confiables para acceder a servicios potencialmente confidenciales como sshd. (También puede crear sus propias zonas).

Advertencia: no confunda la zona especial "de confianza" con la zona "interna" normal. Cualquier fuente agregada a la zona "confiable" se permitirá en todos los puertos; Se permite agregar servicios a la zona "confiable", pero no tiene ningún sentido hacerlo.

firewall-cmd --zone=internal --add-service=ssh
firewall-cmd --zone=internal --add-source=192.168.56.105/32
firewall-cmd --zone=internal --add-source=192.168.56.120/32
firewall-cmd --zone=public --remove-service=ssh

El resultado de esto será una zona "interna" que permite el acceso a ssh, pero solo desde las dos direcciones IP dadas. Para hacerlo persistente, vuelva a ejecutar cada comando con --permanentadjunto.

Michael Hampton
fuente
por favor aclare lo que quiere decir con "definición de interfaz que puede estar presente", iv intenté su sugerencia, por favor vea mi edición.
mike
@mike Como dije, debes eliminarlo eth1de la zona. firewall-cmd --zone=encrypt --remove-interface=eth1
Michael Hampton
bueno, la zona de cifrado es la nueva zona, antes de que eth1 estuviera en público, lo moví de público a cifrado, por lo que cifrar tiene la fuente .120, pensé que solo 120 deberían poder llegar al puerto, ¿qué me estoy perdiendo?
mike
1
Si coloca la interfaz en la zona, cualquier cosa que llegue a través de la interfaz puede acceder a los puertos y servicios que se agreguen a la zona, independientemente de la dirección IP. Por lo tanto, probablemente pertenece al público, donde estaba originalmente.
Michael Hampton
ahh, entonces, ¿las fuentes aceptadas seguirán siendo permitidas incluso si la interfaz se coloca en público, y las fuentes aceptadas se colocan en una fuente confiable diferente?
mike
1

Según firewalld.richlanguage:

Fuente fuente [no] dirección = "dirección [/ máscara]"

   With the source address the origin of a connection attempt can be limited to the source address. An address is either a single IP address, or a network IP address. The address has to match the rule family (IPv4/IPv6). Subnet mask is expressed in either
   dot-decimal (/x.x.x.x) or prefix (/x) notations for IPv4, and in prefix notation (/x) for IPv6 network addresses. It is possible to invert the sense of an address by adding not before address. All but the specified address will match then.

Especifique una máscara de red para la dirección para permitir bloques contiguos.

Aparte de eso, podría intentar crear una ipsetlista no contigua de IP permitidas.

Por ejemplo, en /etc/firewalld/direct.xml:

<?xml version="1.0" encoding="utf-8"?>
<direct>
   <rule ipv="ipv4" table="filter" chain="INPUT" priority="0">-m set --match-set whitelist src -j ACCEPT</rule>
</direct>

Lo real ipsettiene que ser creado por separado.

Dawud
fuente
esto rechazaría, lo que necesito es lo inverso, aceptar si en el set,
mike
0

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