Não consigo encontrar nenhuma documentação que explique a sintaxe e a avaliação dos seguintes exemplos de construção:
add rule filter output tcp flags & (syn | ack) == syn | ack
add rule filter output tcp flags & (fin | syn) != 0
Eu li a resposta do @AB aqui: logging TCP flags .
Isso apenas explica o propósito dessas construções ( TCP
sinalizadores de correspondência), mas eu gostaria de saber a sintaxe e como funciona a avaliação das expressões junto com os operadores.
Particularmente o significado dos operadores "bit a bit" e como eles são avaliados nas flags
expressões como um todo.
Também não está claro para mim o que != 0
faz e, em particular, o propósito do &
operador inicial.
Eu sei que eles são OR, AND etc., mas não entendo como isso se aplica às nftables
regras.
Alguns exemplos mais complexos também poderiam ajudar.
Usar operadores bit a bit dessa maneira é uma abordagem comum para extrair valores de bits específicos. Assim, com flags TCP, se você se preocupa apenas com SYN e ACK (
???A??S?
), você “e” os flags com “SYN ou ACK”, o que limpa todos os outros flags (000A00S0
). Você pode então comparar o resultado com 0 se você se importa apenas se um dos bits está definido ou com uma combinação específica de sinalizadores se quiser uma correspondência exata.Na primeira regra, a expressão é
tcp flags & (syn | ack) == syn | ack
. Trabalhando por precedência:(syn | ack)
calcula a combinação de bits que representam SYN ou ACKtcp flags & (syn | ack)
calcula a interseção dos flags TCP e “SYN ou ACK”: o resultado é apenas os flags SYN e/ou ACK, se um ou ambos estiverem configuradostcp flags & (syn | ack) == syn | ack
compara o resultado da expressão anterior comsyn | ack
O efeito geral é que a expressão retorna verdadeira se os sinalizadores SYN e ACK estiverem definidos. Todos os outros sinalizadores são ignorados.
Outra maneira de ver isso é esta:
Na segunda regra, a expressão é
tcp flags & (fin | syn) != 0
. Trabalhando novamente:(fin | syn)
calcula a combinação de bits que representam FIN ou SYNtcp flags & (fin | syn)
calcula a intersecção dos flags TCP e “FIN ou SYN”: o resultado é apenas os flags FIN e/ou SYN, se um ou ambos estiverem configurados (teoricamente; na prática apenas um pode ser configurado)tcp flags & (fin | syn) != 0
tem sucesso se o resultado da expressão anterior for diferente de zeroO efeito geral é que a expressão retorna verdadeiro se os sinalizadores FIN ou SYN forem definidos. Todos os outros sinalizadores são ignorados.
Outra maneira de ver isso é esta: