Despois dun ano de desenvolvemento
O nivel do núcleo ofrece só unha interface xenérica independente do protocolo que proporciona funcións básicas para extraer datos de paquetes, realizar operacións de datos e controlar o fluxo.
A propia lóxica de filtrado e os controladores específicos do protocolo compílanse en bytecode no espazo do usuario, despois de que este bytecode cárgase no núcleo mediante a interface Netlink e execútase nunha máquina virtual especial que lembra a BPF (Berkeley Packet Filters). Este enfoque permítelle reducir significativamente o tamaño do código de filtrado que se executa a nivel do núcleo e mover todas as funcións de análise de regras e lóxica para traballar con protocolos ao espazo do usuario.
Principais novidades:
- Compatibilidade con IPsec, que permite a correspondencia de enderezos de túneles en función do paquete, o ID de solicitude IPsec e a etiqueta SPI (índice de parámetros de seguridade). Por exemplo,
... ipsec en ip saddr 192.168.1.0/24
... ipsec en spi 1-65536Tamén é posible comprobar se unha ruta pasa por un túnel IPsec. Por exemplo, para bloquear o tráfico non a través de IPSec:
… saída do filtro rt ipsec falta gota
- Soporte para IGMP (Internet Group Management Protocol). Por exemplo, pode usar unha regra para descartar as solicitudes de pertenza a grupos IGMP entrantes
nft add regra netdev foo bar tipo igmp contador de consultas de adhesión
- Posibilidade de utilizar variables para definir cadeas de transición (jump/goto). Por exemplo:
definir dest = ber
engadir regra ip foo bar jump $dest - Soporte para máscaras para identificar sistemas operativos (OS Fingerprint) en función dos valores TTL da cabeceira. Por exemplo, para marcar paquetes en función do SO do remitente, pode usar o comando:
... meta mark set osf ttl skip name map { "Linux" : 0x1,
"Windows": 0x2,
"MacOS": 0x3,
"descoñecido" : 0x0}
... osf ttl saltar a versión "Linux: 4.20" - Capacidade de facer coincidir o enderezo ARP do remitente e o enderezo IPv4 do sistema de destino. Por exemplo, para aumentar o contador de paquetes ARP enviados desde o enderezo 192.168.2.1, pode usar a seguinte regra:
táboa arp x {
cadea y {
tipo de filtro filtro de prioridade de entrada de gancho; política aceptar;
arp saddr ip 192.168.2.1 contador de paquetes 1 bytes 46
}
} - Soporte para o envío transparente de solicitudes a través dun proxy (tproxy). Por exemplo, para redirixir as chamadas ao porto 80 ao porto proxy 8080:
táboa ip x {
cadea y {
tipo filtro gancho prerouting prioridade -150; política aceptar;
tcp dport 80 tproxy a :8080
}
} - Soporte para marcar sockets coa posibilidade de obter aínda máis a marca establecida mediante setsockopt() no modo SO_MARK. Por exemplo:
táboa inet x {
cadea y {
tipo filtro gancho prerouting prioridade -150; política aceptar;
tcp dport 8080 mark set marca de socket
}
} - Soporte para especificar nomes de texto prioritarios para cadeas. Por exemplo:
nft add chain ip x raw { tipo filter hook prerouting priority raw; }
nft add chain ip x filter { type filter hook prerouting priority filter; }
nft add chain ip x filter_later { type filter hook prerouting priority filter + 10; } - Soporte para etiquetas SELinux (Secmark). Por exemplo, para definir a etiqueta "sshtag" nun contexto SELinux, pode executar:
nft engade secmark filtro inet sshtag "system_u:object_r:ssh_server_packet_t:s0"
E despois usa esta etiqueta nas regras:
nft agregar regra de entrada de filtro inet tcp dport 22 meta secmark set "sshtag"
nft engadir mapa inet filter secmapping { type inet_service: secmark; }
nft agregar elemento filtro inet secmapping { 22 : "sshtag" }
nft agregar regra inet filter input meta secmark set tcp dport map @secmapping - Capacidade de especificar os portos asignados aos protocolos en forma de texto, tal e como se definen no ficheiro /etc/services. Por exemplo:
nft engadir regra xy tcp dport "ssh"
conxunto de regras da lista nft -l
táboa x {
cadea y {
...
tcp dport "ssh"
}
} - Capacidade de comprobar o tipo de interface de rede. Por exemplo:
engadir regra inet raw prerouting meta iifkind "vrf" aceptar
- Compatibilidade mellorada para actualizar dinámicamente o contido dos conxuntos especificando explícitamente a marca "dinámica". Por exemplo, para actualizar o conxunto "s" para engadir o enderezo de orixe e restablecer a entrada se non hai paquetes durante 30 segundos:
engadir táboa x
engadir conxunto xs { tipo ipv4_addr; tamaño 128; tempo de espera 30s; bandeiras dinámicas; }
add chain xy { tipo filter hook priority input 0; }
engadir regra xy actualizar @s { ip saddr } - Capacidade de establecer unha condición de tempo de espera separada. Por exemplo, para anular o tempo de espera predeterminado para os paquetes que chegan ao porto 8888, pode especificar:
filtro IP da táboa {
tempo de espera ct agresivo-tcp {
protocolo tcp;
l3proto ip;
política = {establecido: 100, close_wait: 4, close: 4}
}
saída en cadea {
...
tcp dport 8888 ct timeout set "aggressive-tcp"
}
} - Soporte NAT para a familia inet:
táboa inet nat {
...
ip6 daddr morto::2::1 dnat a morto:2::99
} - Informes de erros tipográficos mellorados:
nft engadir proba de filtro de cadea
Erro: non hai ningún ficheiro ou directorio; querías dicir "filtro" da táboa na IP familiar?
engadir proba de filtro de cadea
^^^^^^ - Capacidade de especificar nomes de interface en conxuntos:
establecer sc {
escriba inet_service . ifname
elementos = { "ssh" . "eth0"}
} - Sintaxe das regras da táboa de fluxo actualizada:
nft engadir táboa x
nft add flowtable x ft { prioridade de entrada de gancho 0; dispositivos = { eth0, wlan0 }; }
...
nft add rule x forward ip protocol { tcp, udp } flow add @ft - Compatibilidade con JSON mellorada.
Fonte: opennet.ru