{"id":21109,"date":"2020-11-10T12:25:10","date_gmt":"2020-11-10T10:25:10","guid":{"rendered":"https:\/\/www.teldat.com\/sin-categorizar\/21109\/nftables-and-netfilter-hooks-via-linux-kernel\/"},"modified":"2022-12-07T18:06:24","modified_gmt":"2022-12-07T16:06:24","slug":"nftables-and-netfilter-hooks-via-linux-kernel","status":"publish","type":"post","link":"https:\/\/www.teldat.com\/es\/blog\/nftables-and-netfilter-hooks-via-linux-kernel\/","title":{"rendered":"Netfilter,  Nftables e Iptables: uniendo los puntos"},"content":{"rendered":"<p><img decoding=\"async\" class=\"alignleft wp-image-5544 size-medium\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2022\/06\/AndrejStenderNov2020-300x157.png\" alt=\"nftables-and-netfilter-hooks-via-linux-kernel\" width=\"300\" height=\"157\" title=\"\">A la hora de filtrar paquetes en Linux, <strong><em>Nftables<\/em><\/strong> (que pretende reemplazar el marco <strong><em>Iptables<\/em><\/strong>) ha evolucionado tanto en los \u00faltimos a\u00f1os que se ha convertido en la herramienta por defecto.<\/p>\n<p><!--more--><\/p>\n<p>Sin embargo, <strong>el marco Iptables sigue us\u00e1ndose<\/strong> mucho en sistemas modernos, por ejemplo, <strong><em>Debian buster<\/em><\/strong>.<\/p>\n<p>A veces, las Nftables se usan como un <strong>mecanismo de respaldo <\/strong>para crear una <em>sintaxis alternativa<\/em> que defina reglas de filtrado de paquetes. Tanto si se emulan como si no, las Nftables y las Iptables se basan en un <strong>marco Netfilter subyacente<\/strong>.<\/p>\n<h2>Netfilter<\/h2>\n<p>El marco Netfilter crea, dentro de la pila de red del <strong>kernel de Linux, <\/strong>una serie de <em>hooks<\/em> (puntos de enganche que sirven como herramienta de filtrado) por los que deben pasar los paquetes de red (figura 1). Otros componentes del kernel pueden registrar funciones de <strong><em>callback<\/em><\/strong> en esos hooks, permiti\u00e9ndoles <strong>inspeccionar los paquetes entrantes<\/strong> y decidir si se aceptan o rechazan.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-5533\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2022\/06\/figure_01-300x90.jpg\" alt=\"nftables-and-netfilter-hooks-via-linux-kernel\" width=\"500\" height=\"149\" title=\"\"><\/p>\n<p style=\"text-align: center;\">Figura 1: Diagrama simplificado de los <em>hooks<\/em> del Netfilter<\/p>\n<p>Cuando un dispositivo de red recibe un paquete, este pasa primero por el hook <strong><em>Prerouting<\/em><\/strong>. Aqu\u00ed, el kernel decide si el paquete debe procesarse localmente (por ejemplo, por un puerto de escucha en un servidor del sistema) o si debe reenviarse (cuando el sistema opera como un router).<\/p>\n<p>En el primer caso, el paquete pasa por un filtro de entrada <em>(Input)<\/em> y se procesa luego localmente. Si el paquete es reenviado, pasa por el hook <strong><em>Forward <\/em><\/strong>y por un \u00faltimo hook <em>(Postrouting)<\/em> antes de enviarse a un dispositivo red. En el caso de los paquetes generados localmente (por ejemplo, por un cliente o proceso del servidor al que le guste mandar cosas fuera), estos deben pasar antes por el hook <strong><em>Output <\/em><\/strong>y luego por el <strong><em>Postrouting, <\/em><\/strong>antes de enviarse a un dispositivo de red.<\/p>\n<p>Los hooks llevan muchos a\u00f1os en el kernel, pero sus funcionalidades han cambiado muy poco desde la versi\u00f3n 2.4 del n\u00facleo. Por supuesto, los <strong>kernel modernos<\/strong> s\u00ed muestran aspectos m\u00e1s complejos cuando son analizados en detalle (figura 2): los citados <strong>hooks no son aplicables para los protocolos IPv4 e IPv6.<\/strong> Por eso, los <strong>paquetes IPv4 e IPv6<\/strong> tienen que atravesar filtros propios.<\/p>\n<p>Tambi\u00e9n existen <strong>hooks para paquetes <em>ARP<\/em> y <em>Bridging.<\/em><\/strong> Adem\u00e1s, todos figuran, de manera independiente, en el espacio de nombres de cada red. Asimismo, existe un hook de entrada <strong><em>(ingress)<\/em><\/strong> para cada dispositivo de red. Y la lista sigue&#8230;<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-5534\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2022\/06\/figure_02-636x1024.jpg\" alt=\"nftables-and-netfilter-hooks-via-linux-kernel\" width=\"500\" height=\"805\" title=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\">Figura 2: Hooks Netfilter para IPv4, IPv6, ARP, Bridging y de entrada (Ingress)<\/p>\n<h2>Registro de callbacks<\/h2>\n<p>La figura 3 muestra la <strong>API<\/strong> que genera Netfilter para registrar <strong>funciones de callback en un hook<\/strong>. Se pueden registrar m\u00faltiples funciones en un mismo filtro, junto con un valor entero de prioridad <em>(<strong>priority<\/strong>)<\/em> que organiza las funciones en orden ascendente.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-5535\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2020\/11\/Callback-function-with-a-Netfilter-hook.png\" alt=\"nftables-and-netfilter-hooks-via-linux-kernel\" width=\"500\" height=\"247\" title=\"\"><\/p>\n<p style=\"text-align: center;\">Figura 3: Registrar\/eliminar una funci\u00f3n de callback en un \u201chook\u201d de Netfilter<\/p>\n<h2>Hook transversal y veredicto<\/h2>\n<p>Por cada <strong>paquete de red<\/strong> que atraviese un hook, las funciones de callback integradas se aplicar\u00e1n una a una en el orden de prioridad establecido por el valor <strong><em>priority<\/em><\/strong>. Cada callback deber\u00e1 devolver un \u201cveredicto\u201d: NF_ACCEPT o NF_DROP. Si el resultado es NF_ACCEPT, el paquete pasar\u00e1 al siguiente hook de callback (de existir).<\/p>\n<p>Si todas las callbacks devuelven un mensaje de NF_ACCEPT, el paquete seguir\u00e1 atravesando la <strong>pila de red del kernel.<\/strong> Sin embargo, si se devuelve un mensaje de NF_DROP, el paquete se borrar\u00e1 y no se realizar\u00e1n m\u00e1s callbacks.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-5536\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2022\/06\/figure_04.png\" alt=\"nftables-and-netfilter-hooks-via-linux-kernel\" width=\"500\" height=\"139\" title=\"\"><\/p>\n<p style=\"text-align: center;\">Figura 4: \u201cHook\u201d transversal de las funciones de callback y veredicto<\/p>\n<h2>Nftables VS Iptables<\/h2>\n<p>Tanto las <strong>Nftables<\/strong> como las <strong>Iptables<\/strong> organizan sus normas de <strong>filtrado de paquetes en tablas y cadenas.<\/strong> Las tablas son un mero contenedor en el que se agrupan cadenas con un mismo prop\u00f3sito. Las normas en s\u00ed se integran en las cadenas. Ambos marcos registran sus cadenas (base) como callbacks en los hooks de Netfilter.<\/p>\n<p>El marco Iptables cuenta con una serie de <strong>tablas y cadenas fijas y predefinidas <\/strong>(ver figura 5). Esto se debe a que las cadenas adoptan el nombre del hook en el que se registran. Adem\u00e1s, el conjunto de Iptables se divide en herramientas de <strong>l\u00edneas de comando y sus m\u00f3dulos kernel correspondientes:<\/strong><\/p>\n<ul>\n<li>Iptables para IPv4.<\/li>\n<li>Ip6tables para IPv6.<\/li>\n<li>Arptables para ARP.<\/li>\n<li>Ebtables para Bridging.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" class=\"aligncenter wp-image-5537\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2020\/11\/IPv4-Netfilters-Hooks.png\" alt=\"nftables-and-netfilter-hooks-via-linux-kernel\" width=\"500\" height=\"188\" title=\"\"><\/p>\n<p style=\"text-align: center;\">Figura 5: Cadenas de Iptables registradas en \u201chooks\u201d Netfilter para IPv4 (+ rastreo de conexiones)<\/p>\n<p><strong>En el caso de las Nftables, no existen tablas y cadenas predefinidas<\/strong> (el usuario es el responsable de su creaci\u00f3n). Esto se hace a trav\u00e9s de una herramienta de l\u00ednea de comando \u00fanica conocida como <strong>nft<\/strong>, lo que nos lleva al concepto de \u201cfamilias de direcciones\u201d:<\/p>\n<ul>\n<li>ip: mapea \u201chooks\u201d IPv4 (por defecto)<\/li>\n<li>ip6: mapea \u201chooks\u201d IPv6<\/li>\n<li>inet: mapea \u201chooks\u201d IPv4 e IPv6<\/li>\n<li>arp: mapea \u201chooks\u201d ARP<\/li>\n<li>bridge: mapea \u201chooks\u201d bridging<\/li>\n<li>netdev: mapea \u201chook\u201d de entrada (ingress)<\/li>\n<\/ul>\n<p>A la hora de crear una tabla, el usuario debe especificar una familia de direcciones. Esta selecci\u00f3n se aplicar\u00e1 a todas las cadenas dentro de esa tabla. Al crear una cadena, el usuario debe especificar el hook de Netfilter en el que se registrar\u00e1 la cadena y el valor de prioridad <em>(<strong>priority<\/strong>)<\/em>.<\/p>\n<h3><\/h3>\n<h3>\u00a0Ejemplo: Hook de entrada para Ipv4<\/h3>\n<p>Crear una tabla llamada filter en la familia de direcciones ip y dos cadenas base (foo y bar) , registr\u00e1ndolas en el hook input del Netfilter para IPv4 con prioridades 0 y 50 (figura 6).<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-5542 aligncenter\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2020\/11\/Nft-input-hook.png\" alt=\" width=\" height=\"76\" title=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-5539 aligncenter\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2020\/11\/input-myfilter.png\" alt=\"nftables-and-netfilter-hooks-via-linux-kernel\" width=\"200\" height=\"91\" title=\"\"><\/p>\n<p style=\"text-align: center;\">Figura 6: \u201cHook\u201d de entrada (input) del marco Netfilter para IPv4<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #333333; font-size: 22px;\"><br \/>\nEjemplo: peque\u00f1o router perif\u00e9rico<\/span><\/p>\n<p>Hacer un filtrado sencillo de paquetes IPv4 y SNAT (ocultaci\u00f3n) en un <strong>router perif\u00e9rico.<\/strong><\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-5540 aligncenter\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2020\/11\/WAN-LAN.png\" alt=\"nftables-and-netfilter-hooks-via-linux-kernel\" width=\"155\" height=\"221\" title=\"\"><\/p>\n<p style=\"text-align: center;\">Figura 7: Router perif\u00e9rico<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-5541 aligncenter\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2020\/11\/nft-create-table-ip-nat.png\" alt=\" width=\" height=\"207\" title=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><img decoding=\"async\" class=\"alignleft size-full wp-image-5543\" src=\"https:\/\/www.teldat.com\/wp-content\/uploads\/2020\/11\/IPv4-Netfilter-Hook-connection-tracking.png\" alt=\"nftables-and-netfilter-hooks-via-linux-kernel\" width=\"1620\" height=\"515\" title=\"\"><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Figura 8: Cadenas de Nftables registradas en un \u201chook\u201d de Netfilter para IPv4 (+ rastreo de conexiones)<\/p>\n<p>En<strong> Teldat, <\/strong>creemos que los servicios como<strong> Nftables y Netfilter <\/strong>son bloques esenciales sobre los que construir las <strong>funcionalidades SD-WAN de nuestra <a href=\"https:\/\/www.teldat.com\/es\/blog\/en-el-ojo-de-la-tormenta\/\">soluci\u00f3n be.SDx. Corp<\/a><\/strong><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A la hora de filtrar paquetes en Linux, Nftables (que pretende reemplazar el marco Iptables) ha evolucionado tanto en los \u00faltimos a\u00f1os que se ha convertido en la herramienta por defecto.<\/p>\n","protected":false},"author":233,"featured_media":20161,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[1168],"tags":[1087],"class_list":["post-21109","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tecnologia-sd-wan","tag-tecnologia-de-comunicaciones"],"acf":[],"wpml_current_locale":"es_ES","wpml_translations":[{"locale":"en_US","id":20142,"slug":"nftables-and-netfilter-hooks-via-linux-kernel","post_title":"Connecting some of the dots between Nftables, Iptables and Netfilter","href":"https:\/\/www.teldat.com\/nftables-and-netfilter-hooks-via-linux-kernel\/"}],"_links":{"self":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/posts\/21109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/users\/233"}],"replies":[{"embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/comments?post=21109"}],"version-history":[{"count":0,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/posts\/21109\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/media\/20161"}],"wp:attachment":[{"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/media?parent=21109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/categories?post=21109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.teldat.com\/es\/wp-json\/wp\/v2\/tags?post=21109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}