mirror of
https://github.com/lgcosta/pf-linux-port.git
synced 2026-11-13 02:38:04 -03:00
- 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.
102 lines
5.9 KiB
Markdown
102 lines
5.9 KiB
Markdown
# Usando o PF-on-Linux no dia a dia
|
|
|
|
English: [docs/en/pf-guide.md](../en/pf-guide.md).
|
|
|
|
Este é o guia do "o que dá para rodar hoje". Ele segue a
|
|
[matriz de features](feature-matrix.md): 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](install.md) e [build.md](build.md).
|
|
|
|
## Ciclo diário
|
|
|
|
```sh
|
|
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
|
|
|
|
```pf
|
|
# /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. || `divert-to`, tag `divert` | — | **Verificado em lab** (gate `11-divert`): o pacote é entregue a um socket `AF_DIVERT` (`PF_DIVERT=32`) atendido pelo `tools/pdivert`; sem listener é descartado, exatamente como o `divs_noport` do BSD. |
|
|
| `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](caveats.md).
|