Files
pf-linux-port/docs/pt-BR/pf-guide.md
T
lgcosta dff2185b20 Docs: bring the documentation in line with the code
- Demo docs replaced by the screencast docs (single source of truth): the
  legacy demo-session.sh/demo-record.py and the v0.9 renderer were removed
  instead of being kept as a second convention.
- feature-matrix: stale 'M2-in-progress' vocabulary gone; the rows the 15
  gates prove now say VERIFIED-in-VM and name the gate; af-to is now an
  explicit non-goal row (INET6 0 in this build).
- guide: the queues/divert/pflog sections described a state that no longer
  exists (priq-only, divert dropping packets, pflog logging nothing); they
  now describe the shipped behaviour.
- vm-lab: the 15 real gates with what each proves, 15/15 green, and the
  pf0 -> cli/srv/gw2 ssh setup the screencasts rely on.
- install/build: pdivert and pflogd are built and ported (docs said
  otherwise); module object list now includes hfsc.c, fq_codel.c, pfk_pflog.c;
  the screencast pipeline is an optional build stage.
- pf-guide: the 'M2 scope only' framing is gone; honest gaps listed.
- caveats: three new sections about the screencast pipeline (MiniMax video
  generation blocked by the account tier, narration as a separate track, a
  video frame is not a verdict).
- porting-notes: what the recording taught us.
- README/README.pt-BR: status, milestones, layout and video section updated.

All internal doc links verified.
2026-11-12 11:51:25 -03:00

5.9 KiB

Usando o PF-on-Linux no dia a dia

English: docs/en/pf-guide.md.

Este é o guia do "o que dá para rodar hoje". Ele segue a matriz de features: o núcleo de filtragem (pass/block/quick/keep state/tabelas/anchors), a família de NAT, o scrub, o roteamento forçado, os pools, o divert, o pflog e as filas do OpenBSD 8.0 têm todos evidência em VM — os 15 gates do lab estão verdes. O que não tem gate está listado explicitamente abaixo. Instalação/build ficam em install.md e build.md.

Ciclo diário

sudo insmod module/pf.ko          # cria /dev/pf
sudo pfctl -nf /etc/pf.conf       # checagem de parse (só userland — sempre segura)
sudo pfctl -f /etc/pf.conf        # carrega o ruleset
sudo pfctl -e                     # HABILITA — o tráfego passa a bater nas regras AGORA
sudo pfctl -s info                # status + contadores
sudo pfctl -s states              # listagem de estados (ver ressalva abaixo)
sudo pfctl -t blk -T add 10.0.1.10   # atualização de tabela ao vivo
sudo pfctl -a admin -f /etc/pf.d/admin.conf
sudo pfctl -d                     # desabilita
sudo rmmod pf                     # descarrega (regras/estados são liberados aqui)

Atenção — a ordem importa: -f e depois -e. Habilitar sem uma regra pass que cubra o caminho de administração corta esse caminho — este port segue a política padrão de bloqueio do OpenBSD, e as rodadas do lab realmente derrubaram o ssh da VM de teste assim (a bancada mantém console serial exatamente por isso). Num host remoto, libere a interface de gerência antes de habilitar qualquer coisa.

Um ruleset que funciona neste port hoje

# /etc/pf.conf. Os nomes de interface aqui são os da bancada
# (mgmt/lan/wan); troque pelos seus (eth0, enp1s0, …).

# 1) mantenha você mesmo alcançável (faça isso primeiro, sempre)
pass in  quick on mgmt
pass out quick

# 2) núcleo de filtragem — comprovado hoje: quick, match de proto/porta, state, drop
table <blk> persist                       # blocklist viva (padrão do gate 03)
block in quick proto tcp from <blk> to any

pass in  quick on lan proto tcp from 10.0.1.0/24 to any port { 80 443 } keep state
block drop in quick on wan proto icmp from any to any

# 3) anchors com precedência (padrão do gate 04)
anchor "admin"

Macros (xif = "lan"), anchor "in/*" aninhado, label, tag, set timeout/limit/state-policy/block-policy/skip e o resto da gramática do OpenBSD 8.0 fazem parse sem problema — o make -C tools test exercita tudo isso offline — mas o comportamento no kernel da maioria das opções set ainda não foi verificado em gate; trate como "carrega e reza" até a matriz mudar.

Sem gate (lacunas honestas): o caminho IPv6, o fingerprint de OS, as opções set acima, os syncookies e a disciplina FQ-CoDel. O af-to está compilado fora neste build (INET6 0).

Notas por feature — o que cada sintaxe faz hoje

Sintaxe Até O que acontece hoje
nat-to, rdr-to — Verificado em lab (gates 05-nat, 06-rdr; este último baixa 2 MB por um redirect e compara byte a byte). nat-to (egress) expande o grupo de interfaces do OpenBSD; num host multi-NIC prefira a forma explícita nat-to (<iface>). O binat-to é expandido pelo pfctl num par nat-to … static-port + rdr-to (gate 07-binat).
scrub (min-ttl, max-mss, df, random-id), set reassemble — Verificado em lab (gate 09-scrub.sh): min-ttl e max-mss reescrevem de fato pacotes em trânsito.
route-to, dup-to, reply-to — Verificado em lab (gates 08-routeto.sh, 13-replyto.sh): o gateway forçado é usado em vez do egress normal, dup-to copia mantendo o fluxo, e reply-to empurra as respostas de um fluxo para o enlace do gateway. fail-to não é palavra-chave no OpenBSD 8.0 (removido upstream).
queue / queue on / pfctl -s queue — Verificado em lab (gate 15-queue.sh): as filas carregam, o hfsc é anexado, pfctl -s queue -v mostra as estatísticas das classes e um fluxo de 2 MB pela fila é contado pela classe. bandwidth é garantia sob contenção, não teto - o pf.conf 8.0 não tem palavra-chave de upperlimit.
log, log all, block log, pflogd — Verificado em lab (gate 12-pflog): rode pflogd /tmp/x.pcap (lê /dev/pflog); o arquivo é um pcap DLT_PFLOG (117) legível por tcpdump/wireshark.
route-label … nunca (não-objetivo) Rejeitado na camada de ioctl.
política por container (netns) fora de escopo O PF é uma instância global em init_net; network namespaces não enxergam o PF.

Lendo o estado corretamente

O pfctl -s states tem hoje uma anomalia de listagem/visibilidade sendo corrigida no trabalho do gate M2 (fluxos de trânsito podem passar enquanto nenhum estado é exibido). Até lá, use contadores (pfctl -s info) e observação externa (resultado do ping/nc, tcpdump) como evidência primária, exatamente como os gates fazem.

Sinais no log do kernel que você deve conhecer

pfk: PF-on-Linux engine loaded (OpenBSD 8.0 base)     ← insmod ok
pfk: netfilter hooks registered (10, netisr wq data path)
pfk: divert port N: no socket bound      # nenhum consumidor em pdivert/pflogd

Descarregar o módulo primeiro para os timers de purge e drena a workqueue (um travamento de rmmod observado no lab foi corrigido assim) — mas a rodada de soak (ciclo rmmod/insmod sob tráfego) ainda é um gate aberto, então trate o unload como correto para uso administrativo e não comprovado para automação de hot-reload.

Lista completa das divergências de comportamento: caveats.md.