Firewalld
firewalld es un demonio de firewall desarrollado por Red Hat. Utiliza nftables por defecto.
Firewalld proporciona un cortafuegos administrado dinámicamente con soporte para zonas de red/cortafuegos que definen el nivel de confianza de las conexiones o interfaces de red. Tiene soporte para configuración de firewall IPv4, IPv6, puentes ethernet y conjuntos de IP. Hay una separación de tiempo de ejecución y opciones de configuración permanente. También proporciona una interfaz para servicios o aplicaciones para agregar reglas de firewall directamente.
Puede controlar las reglas del firewall con la utilidad de consola firewall-cmd.
firewall-cmd
Manuales de las siguientes secciones de firewall-cmd
man firewalld
man firewalld.zones
man firewalld.zone
man firewalld.service
man firewall-cmd
Los archivos por defecto los encontraremos en
/usr/lib/firewalld/
/etc/firewalld/
Mostrar información
firewall-cmd --get-zones
firewall-cmd --list-all-zones
firewall-cmd --get-default-zone
firewall-cmd --get-active-zone
firewall-cmd --list-all # listar todas las zonas activas
firewall-cmd --list-all --zone public
firewall-cmd --info-service ssh
firewall-cmd --get-services
firewall-cmd --zone public --list-services
firewall-cmd --zone internal --list-ports
Zona por defecto
firewall-cmd --set-default-zone public
Asignar interfaces a zonas
firewall-cmd --zone internal --add-interface eth2
firewall-cmd --zone internal --change-interface=eth2
Asignar servicios a zonas
firewall-cmd --zone internal --add-service=ftp
firewall-cmd --zone internal --remove-service=ftp
crear nueva zona llamada security
/etc/firewalld/zones/security.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Security</short>
<description>Security zone</description>
<service name="ssh"/>
</zone>
Permitir puertos
firewall-cmd --zone internal --add-port=10000/tcp
Port Forwarding
firewall-cmd --zone=public --add-forward-port=port=12345:proto=tcp:toport=22:toaddr=10.20.30.40
firewall-cmd --zone=public --remove-forward-port=port=12345:proto=tcp:toport=22:toaddr=10.20.30.40
Guardar cambios
firewall-cmd asigna las reglas, pero al reiniciar si no las hemos guardado se perderan.
firewall-cmd --reload # recargar configuracion
firewall-cmd --runtime-to-permanent # acer permanentes las reglas actuales
Anadir regla permenente
firewall-cmd --permanent --zone internal --add-service=ftp
nftables
nftables es un proyecto de netfilter que tiene como objetivo reemplazar el marco existente de tablas{ip,ip6,arp,eb}. Proporciona un nuevo marco de filtrado de paquetes, una nueva utilidad en el espacio de usuario (nft) y una capa de compatibilidad para las tablas{ip,ip6}.
- (doc nftables archlinux)[https://wiki.archlinux.org/title/Nftables_(Espa%C3%B1ol)]
- (doc nftables)[https://wiki.nftables.org/wiki-nftables/index.php/Main_Page]
nftables hace una distinción entre las reglas temporales realizadas en la línea de órdenes y aquellas otras permanentes cargadas o guardadas en un archivo.
El archivo predeterminado es /etc/nftables.conf
, que ya contiene una tabla simple de cortafuegos para ipv4/ipv6 llamada «inet filter».
# ver TODA la config
nft list ruleset
# listar tablas definidas
nft list tables
# listar contenido de una tabla
nft list table <family> <tablename>
#p.ej. si quieres ver la tabla "filter" de la familia de paquetes IPv4
nft list table ip filter
# borrar TODO
nft flush ruleset
# dumpear TODA la config
nft list ruleset > myfile
#cargar archivo de reglas
nft -f nombre_del_archivo
# recargar todo
nft list ruleset >> /tmp/nftables
nft -f /tmp/nftables
En nftables
hay que comprender una serie de conceptos:
- Family: a que trafico de red va dirigido {ip,ip6,inet,arp,bridge}
- Table: Las tablas alojan Cadenas. Son agrupaciones de cadenas, su uso es de organizacion.
- Chain (Cadenas): El propósito de las cadenas es alojar Reglas
- Hook: En que momento seran procesadas las reglas que pertenezcan a la cadena (doc hook)[https://wiki.nftables.org/wiki-nftables/index.php/Netfilter_hooks]
- Rules: Las reglas a procesar
Familias
Netfilter permite filtrar en múltiples niveles de red. Con iptables hay una herramienta separada para cada nivel: iptables, ip6tables, arptables, ebtables.
Con nftables, los múltiples niveles de red se abstraen en familias.
Familia de nftables | Utilidad iptables |
---|---|
ip | iptables |
ip6 | ip6tables |
inet | iptables and ip6tables |
arp | arptables |
bridge | ebtables |
Tablas
crear tabla
nft add table <familia> <tabla>
nft add table ip mytable
nft delete table <familia> <tabla> # eliminar tabla
nft flush table <familia> <tabla> # borrar contenido
Cadenas
El propósito de las cadenas es alojar Reglas.
Las cadenas son de dos tipos. Una cadena base que es un punto de entrada para los paquetes de la pila de red, donde se especifica un valor de enlace. Y una cadena normal que puede usarse como un objetivo de salto («jump») para una mejor organización.
Cadena normal
nft add chain <familia> <tabla> <cadena>
nft add chain inet filter tcpchain
Cadena base
Para familias de direcciones IPv4/IPv6/Inet el hook puede ser prerouting, input, forward, output, o postrouting. Consulte nft(8) para obtener una lista de los hooks para otras familias.
priority toma un valor entero. Las cadenas con números más bajos se procesan primero y pueden ser negativos. [1]
type puede ser filter, route, o nat.
Por ejemplo, para añadir una cadena base que filtre los paquetes de entrada:
nft add chain <familia> <tabla> <cadena> { type tipo hook hook priority prioridad \; }
nft add chain inet filter input { type filter hook input priority 0\; }
Listar cadena
nft list chain <familia> <tabla> <cadena>
nft list chain inet filter output
Para modificar una cadena, bastará con llamarla por su nombre y definiremos las reglas que deseamos cambiar.
nft chain <tabla> <familia> <cadena> { [ type <tipo> hook <hook> device <dispositivo> priority <prioridad> \; policy <política> \; ] }
nft chain inet filter input { policy drop \; }
Eliminar cadena
nft delete chain <familia> <tabla> <cadena>
Eliminar reglas de una cadena
nft flush chain <familia> <tabla> <cadena>
Reglas
Las reglas se construyen, bien a partir de expresiones («expressions») o bien a partir de declaraciones («statements»), y están contenidas dentro de cadenas.
Sugerencia: La utilidad iptables-translate
traduce las reglas iptables al formato nftables.
nft add rule <familia> <tabla> <cadena> handle <identificador> <statement>
nft insert rule <familia> <tabla> <cadena> handle <identificador> <statement>
# añadir regla en posicion 8
nft add rule filter output position 8 ip daddr 127.0.0.8 drop
Eliminacion de regla
nft --handle list
nft --handle --numeric list chain <tabla> <cadena>
nft --handle --numeric list chain filter input_eth1
nft delete rule ip filter input_eth1 handle 11
Ejemplo
# crear familia para conexiones ipv4
nft add table ip
# crear tabla
nft add table ip filter
# crear cadena tipo filter que procesara input
nft add chain ip filter input { type filter hook input priority 0\; }
# crear cade basica para organizar una interfaz
nft add chain ip filter input_eth1
# acceptar todo a lo y redirigir trafico de eth1 a la cadena input_eth1
nft add ip filter input iif lo accept
nft add ip filter input iif eth1 jump input_eth1
# en eth1 acceptar solo trafico establecido y puertos 80,22
nft add rule ip filter input_eth1 ct state related,established accept
nft add rule ip filter input_eth1 tcp dport 80 accept
nft add rule ip filter input_eth1 tcp dport 22 accept
nft add rule ip filter input_eth1 drop
nft list ruleset >> mynftables.conf
table ip filter {
chain input {
type filter hook input priority 0; policy accept;
iif "lo" accept
iif "eth1" jump input_eth1
}
chain input_eth1 {
ct state established,related accept
tcp dport http accept
tcp dport ssh accept
drop
}
}