No Netfilter, você tem a opção --set-mark
de pacotes que passam pela mangle
tabela.
A maioria dos tutoriais e exemplos na Internet dizem que isso apenas adiciona uma marca no pacote, assim, mas não há detalhes adicionais de qual marca está definida e onde ela reside no pacote:
iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
Minha pergunta é:
- Que tipo de marca é definida e exatamente onde esta marca reside no pacote?
A marca é um valor inteiro de 32 bits anexado a um pacote de rede. Algumas partes da rede que interagem com ele (veja abaixo) podem fazer operações bit a bit neste valor, ele pode então ser interpretado entre um único valor de 32 bits até uma coleção de 32 sinalizadores, ou uma mistura de sinalizadores e valores menores, dependendo de como um escolhe organizar seu uso (
tc
não pode fazer isso). É claro que essa marca existe apenas enquanto for tratada pelo kernel do Linux . É apenas puramente virtual e interno, pois não pode existir no fio. Dependendo de onde é usado, pode ser chamado de firewall mark, fwmark ou simplesmente mark.Cada pacote de rede processado pelo kernel é tratado por uma estrutura chamada
sk_buff
, definida emlinux/include/linux/skbuff.h
. Essa estrutura inclui vários metadados relacionados ao pacote quando aplicável, como informações de IPsec, se houver, entrada de conntrack relacionada uma vez pesquisada, ... e também sua marca .Várias partes da pilha de rede podem ler essa marca, alterar o comportamento com base em seu valor ou (re)escrever, por exemplo:
tc
,ip rule
(por exemploip rule add fwmark 1 lookup 42
), para alterar suas decisões de roteamento com esta fwmark (por exemplo, para usar uma tabela de roteamento enviando esses pacotes para uma interface diferente do padrão),iptables
,e alguns outros lugares...
O principal objetivo desta marca é fazer com que todas essas partes da rede interajam entre si usando-a como uma espécie de mensagem. O fluxo de pacotes no Netfilter e General Networking pode ajudar a ver em que ordem esses elementos receberão o tratamento do pacote e, portanto, sua marcação.
Existem outras marcas relacionadas além de fwmark:
connmark
, que não é armazenado com o sk_buff de um pacote, mas em um fluxo de pacotes de rastreamento de entrada conntrack . É claro que seu connmark pode ser usado pelo iptables com suaconnmark
correspondência eCONNMARK
destino, com um exemplo de uso lá: Netfilter Connmark Para Linux e além! . Ele permite que a decisão tomada com base em um único pacote seja memorizada e aplicada a todos os pacotes da mesma conexão.secmark
e também seus associadosconnsecmark
que se destinam a interagir com os Módulos de Segurança Linux como o SELinux .