Files
pf-linux-port/scripts/screencast/phases/05-balanceamento.sh
T
lgcosta fe324259c0 Screencasts: seis videos silenciosos 1080p30 da demonstracao
Novo pipeline de video: scripts/screencast/render.py roda uma fase em um pty,
emula o terminal com pyte, gera frames PNG e mux com ffmpeg (H.264,
yuv420p, +faststart, sem trilha de audio). Fallback de encoder: libx264 ->
libopenh264 -> VP9.

Fases (scripts/screencast/phases/, uma sessao real contra o lab por video):
  1. implementacao no kernel - fontes OpenBSD + compat + build limpo do pf.ko
  2. ativacao - insmod, /dev/pf, pfctl -e, pfctl -s info
  3. regras basicas - tabela, anchor, keep state, block drop
  4. roteamento - route-to e reply-to (provado com tcpdump nas 2 interfaces)
  5. balanceamento - pool round-robin, pool source-hash, dup-to
  6. QOS - filas hfsc, pfctl -s queue -v, transferencia de 2 MB pela fila

Os videos ficam versionados em out/screencast/ (.gitignore ajustado para
nao ignorar *.mp4) e o indice/texto de descricao do YouTube em
docs/{en,pt-BR}/screencast.md.

Correcoes na propria demo (encontradas gravando): a acao de uma regra no pf
e pass OU block (nunca os dois); as regras de um anchor vivem em um ruleset
proprio (pfctl -a <anchor> -f); o nc do QOS precisa rodar na VM do servidor,
nao no firewall; o rotulo 'FASE x/6' vem do numero da fase, nao da posicao
na lista de gravacao.
2026-11-12 08:41:41 -03:00

69 lines
2.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Fase 5 - balanceamento: pools (round-robin, source-hash) e dup-to.
set -u
cd "$(dirname "$0")"
. ./lib.sh
banner "FASE 5 - BALANCEAMENTO"
p0 "/opt/pf/pfctl -e"
p0 "/opt/pf/pfctl -f /dev/null"
put ./an.sh >/dev/null
IF_SRV=$(onvm "$PF0_MGMT" "ip route get $SRV_IP | grep -o 'dev [a-z0-9]*' | cut -d' ' -f2" | tr -d '\r')
IF_GW=$(onvm "$PF0_MGMT" "ip route get $GW2_IP | grep -o 'dev [a-z0-9]*' | cut -d' ' -f2" | tr -d '\r')
[ -n "$IF_SRV" ] || IF_SRV=eth2
[ -n "$IF_GW" ] || IF_GW=eth3
bold "# pool round-robin: a traducao de origem alterna entre os membros do pool"
cat > /tmp/sc-pool.conf <<CONF
pass out quick on egress from 10.0.1.0/24 to any nat-to { 10.0.2.1, 10.0.3.1 } round-robin
pass in quick on ingress proto icmp keep state
pass out quick on egress proto icmp keep state
CONF
put /tmp/sc-pool.conf >/dev/null
p0 "cat /tmp/sc-pool.conf"
p0 "/opt/pf/pfctl -f /tmp/sc-pool.conf && echo 'pool round-robin carregado'"
p0 "/opt/pf/pfctl -sr"
p0 "pkill tcpdump 2>/dev/null; (tcpdump -ni $IF_SRV -c 12 -e icmp > /tmp/sc_pool.td 2>&1 &); sleep 1"
for i in 1 2 3 4 5 6; do
vmc "ping -c1 -W2 $SRV_IP >/dev/null 2>&1; echo ' pacote $i enviado'"
done
sleep 4
p0 "echo 'origem vista pelo servidor (o pool alterna entre os membros):'; sh /tmp/an.sh /tmp/sc_pool.td src"
echo
bold "# pool source-hash: a mesma origem cai sempre no mesmo membro"
cat > /tmp/sc-hash.conf <<CONF
pass out quick on egress from 10.0.1.0/24 to any nat-to { 10.0.2.1, 10.0.3.1 } source-hash
pass in quick on ingress proto icmp keep state
pass out quick on egress proto icmp keep state
CONF
put /tmp/sc-hash.conf >/dev/null
p0 "/opt/pf/pfctl -f /tmp/sc-hash.conf && echo 'pool source-hash carregado'"
p0 "pkill tcpdump 2>/dev/null; (tcpdump -ni $IF_SRV -c 8 -e icmp > /tmp/sc_hash.td 2>&1 &); sleep 1"
for i in 1 2 3 4; do
vmc "ping -c1 -W2 $SRV_IP >/dev/null 2>&1; echo ' pacote $i enviado'"
done
sleep 4
p0 "echo 'origem com source-hash (estavel por origem):'; sh /tmp/an.sh /tmp/sc_hash.td src"
echo
bold "# dup-to: o pacote segue o caminho normal e uma copia vai para o outro gateway"
cat > /tmp/sc-dup.conf <<CONF
pass in quick proto icmp from $CLI_IP to $SRV_IP dup-to { $GW2_IP } keep state
pass out quick
CONF
put /tmp/sc-dup.conf >/dev/null
p0 "/opt/pf/pfctl -f /tmp/sc-dup.conf && echo 'regra dup-to carregada'"
p0 "/opt/pf/pfctl -sr"
p0 "pkill tcpdump 2>/dev/null; (tcpdump -ni $IF_SRV -c 4 -e icmp > /tmp/sc_dup1.td 2>&1 &); (tcpdump -ni $IF_GW -c 4 -e icmp > /tmp/sc_dup2.td 2>&1 &); sleep 1"
vmc "ping -c2 -W2 $SRV_IP | tail -2"
sleep 4
p0 "echo \"caminho normal ($IF_SRV):\"; sh /tmp/an.sh /tmp/sc_dup1.td req"
p0 "echo \"copia espelhada ($IF_GW):\"; sh /tmp/an.sh /tmp/sc_dup2.td req"
echo
p0 "/opt/pf/pfctl -f /dev/null; pkill tcpdump 2>/dev/null"
green " round-robin reparte a carga; source-hash fixa por origem; dup-to replica"