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.
This commit is contained in:
1 parent
90c51f43fc
commit
fe324259c0
20 files changed
+958
-2
No files matched your search
+40
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env bash
|
||||
# Fase 1 - a implementacao no kernel: da fonte OpenBSD ao modulo pf.ko.
|
||||
# Roda no host de build (o port esta no repositorio; a VM so recebe o .ko).
|
||||
set -u
|
||||
cd "$(dirname "$0")"
|
||||
. ./lib.sh
|
||||
|
||||
banner "FASE 1 - A IMPLEMENTACAO NO KERNEL"
|
||||
|
||||
bold "# o port: fontes BSD trazidos do OpenBSD 8.0 + camada de compatibilidade"
|
||||
dim " module/pfsrc/ - fontes do OpenBSD (pf.c, pf_lb.c, pf_norm.c, hfsc.c, ...)"
|
||||
dim " module/compat/ - shims que traduzem as APIs BSD para o Linux"
|
||||
dim " module/include/ - cabecalhos (pfk.h) e os headers vendorizados do OpenBSD"
|
||||
echo
|
||||
cyan "host# ls module/pfsrc | head -20"
|
||||
ls "$REPO/module/pfsrc" | head -20
|
||||
echo
|
||||
cyan "host# wc -l module/pfsrc/*.c | tail -3"
|
||||
(cd "$REPO" && wc -l module/pfsrc/*.c | tail -3)
|
||||
cyan "host# wc -l module/compat/*.c | tail -1"
|
||||
(cd "$REPO" && wc -l module/compat/*.c | tail -1)
|
||||
echo
|
||||
dim " (as fontes OpenBSD entram praticamente intactas; a compat faz a ponte"
|
||||
dim " mbuf->sk_buff, spl->spinlock, epoch->RCU, ifnet->net_device, ...)"
|
||||
|
||||
bold
|
||||
bold "# compilando o modulo contra o kernel do lab (build limpo)"
|
||||
echo
|
||||
cyan "host# ./scripts/build-module.sh clean"
|
||||
(cd "$REPO" && ./scripts/build-module.sh clean 2>&1 | tail -3)
|
||||
cyan "host# ./scripts/build-module.sh"
|
||||
(cd "$REPO" && ./scripts/build-module.sh 2>&1 | tail -18)
|
||||
echo
|
||||
cyan "host# ls -la module/pf.ko"
|
||||
ls -la "$REPO/module/pf.ko"
|
||||
cyan "host# modinfo module/pf.ko | head -5"
|
||||
modinfo "$REPO/module/pf.ko" 2>/dev/null | head -5 || \
|
||||
(cd "$REPO" && strings module/pf.ko | grep -m2 vermagic)
|
||||
echo
|
||||
green " modulo pronto: o motor PF 8.0 do OpenBSD pronto para carregar no Linux"
|
||||
Executable
+30
@@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env bash
|
||||
# Fase 2 - ativacao: carregar pf.ko, habilitar o firewall, ver o estado.
|
||||
set -u
|
||||
cd "$(dirname "$0")"
|
||||
. ./lib.sh
|
||||
|
||||
banner "FASE 2 - ATIVACAO"
|
||||
|
||||
bold "# o modulo ainda nao esta carregado"
|
||||
p0 "rmmod pf 2>/dev/null; lsmod | grep '^pf ' || echo 'pf: not loaded'"
|
||||
p0 "ls -l /dev/pf 2>/dev/null || echo '/dev/pf: ausente enquanto pf nao carrega'"
|
||||
echo
|
||||
|
||||
bold "# carregando o motor PF no kernel"
|
||||
p0 "insmod /opt/pf/pf.ko && echo 'pf.ko carregado no kernel'"
|
||||
p0 "dmesg | tail -4"
|
||||
p0 "lsmod | grep '^pf '"
|
||||
p0 "ls -l /dev/pf"
|
||||
echo
|
||||
|
||||
bold "# habilitando o firewall"
|
||||
p0 "/opt/pf/pfctl -e && echo 'pf habilitado'"
|
||||
p0 "/opt/pf/pfctl -si | head -6"
|
||||
echo
|
||||
|
||||
bold "# o ruleset comeca vazio (a politica padrao do pf e bloquear, com return)"
|
||||
p0 "/opt/pf/pfctl -sr"
|
||||
p0 "/opt/pf/pfctl -sf | head -5"
|
||||
echo
|
||||
green " motor ativo: /dev/pf respondendo, pfctl sobre a ABI de ioctl do OpenBSD"
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
#!/usr/bin/env bash
|
||||
# Fase 3 - regras basicas: tabelas, anchors, keep state, block/pass.
|
||||
set -u
|
||||
cd "$(dirname "$0")"
|
||||
. ./lib.sh
|
||||
|
||||
banner "FASE 3 - REGRAS BASICAS"
|
||||
|
||||
p0 "/opt/pf/pfctl -e"
|
||||
p0 "/opt/pf/pfctl -f /dev/null"
|
||||
|
||||
bold "# um pf.conf de verdade, sintaxe do OpenBSD"
|
||||
cat > /tmp/sc-regras.conf <<'CONF'
|
||||
# --- regras basicas do PF ---
|
||||
set block-policy return
|
||||
|
||||
table <trusted> { 10.0.1.0/24 }
|
||||
|
||||
anchor "demo"
|
||||
|
||||
pass in quick on ingress proto icmp from <trusted> keep state
|
||||
pass out quick on egress proto icmp keep state
|
||||
|
||||
pass in quick
|
||||
pass out quick
|
||||
CONF
|
||||
put /tmp/sc-regras.conf >/dev/null
|
||||
p0 "cat /tmp/sc-regras.conf"
|
||||
p0 "/opt/pf/pfctl -f /tmp/sc-regras.conf && echo 'ruleset carregado'"
|
||||
echo
|
||||
|
||||
bold "# o que o pf entendeu"
|
||||
p0 "/opt/pf/pfctl -sr"
|
||||
p0 "/opt/pf/pfctl -s Tables"
|
||||
p0 "/opt/pf/pfctl -t trusted -T show"
|
||||
echo
|
||||
|
||||
bold "# trafego permitido: passa e cria estado"
|
||||
vmc "ping -c2 -W2 $SRV_IP | tail -3"
|
||||
p0 "/opt/pf/pfctl -ss | head -5"
|
||||
echo
|
||||
|
||||
bold "# a mesma regra com 'block drop' bloqueia de verdade"
|
||||
cat > /tmp/sc-block.conf <<CONF
|
||||
set block-policy return
|
||||
table <trusted> { 10.0.1.0/24 }
|
||||
block drop in quick on ingress proto icmp from <trusted>
|
||||
pass in quick
|
||||
pass out quick
|
||||
CONF
|
||||
put /tmp/sc-block.conf >/dev/null
|
||||
p0 "/opt/pf/pfctl -f /tmp/sc-block.conf && echo 'ruleset de bloqueio carregado'"
|
||||
vmc "ping -c2 -W2 $SRV_IP | tail -3"
|
||||
p0 "/opt/pf/pfctl -sr -vv | head -4"
|
||||
echo
|
||||
|
||||
bold "# anchors: regras aninhadas, como no OpenBSD"
|
||||
p0 "cat > /tmp/sc-anchor.conf <<'EOF'
|
||||
pass in quick on ingress proto icmp from 10.0.1.10 to 10.0.2.20 keep state
|
||||
pass in quick
|
||||
pass out quick
|
||||
EOF"
|
||||
p0 "/opt/pf/pfctl -a demo -f /tmp/sc-anchor.conf && echo 'ruleset do anchor carregado'"
|
||||
p0 "/opt/pf/pfctl -a demo -sr"
|
||||
p0 "cat > /tmp/sc-main.conf <<'EOF'
|
||||
anchor \"demo\"
|
||||
pass in quick on ingress proto icmp keep state
|
||||
pass out quick on egress proto icmp keep state
|
||||
EOF"
|
||||
p0 "/opt/pf/pfctl -f /tmp/sc-main.conf && echo 'ruleset principal com anchor carregado'"
|
||||
p0 "/opt/pf/pfctl -sr"
|
||||
echo
|
||||
|
||||
bold "# voltando ao ruleset com estado"
|
||||
p0 "/opt/pf/pfctl -f /tmp/sc-regras.conf && echo 'ruleset stateful restaurado'"
|
||||
vmc "ping -c2 -W2 $SRV_IP | tail -2"
|
||||
green " tabelas, anchors, quick, keep state, block drop: todos no lugar"
|
||||
Executable
+54
@@ -0,0 +1,54 @@
|
||||
#!/usr/bin/env bash
|
||||
# Fase 4 - roteamento: route-to (caminho forcado) e reply-to (assimetria).
|
||||
set -u
|
||||
cd "$(dirname "$0")"
|
||||
. ./lib.sh
|
||||
|
||||
banner "FASE 4 - ROTEAMENTO"
|
||||
|
||||
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
|
||||
dim " (o servidor fica atras de $IF_SRV; o segundo gateway, em $IF_GW)"
|
||||
|
||||
bold "# route-to: o pacote sai pelo caminho forcado, nao pelo normal"
|
||||
cat > /tmp/sc-route.conf <<CONF
|
||||
pass in quick proto icmp from $CLI_IP to $SRV_IP route-to { $GW2_IP } keep state
|
||||
pass out quick
|
||||
CONF
|
||||
put /tmp/sc-route.conf >/dev/null
|
||||
p0 "/opt/pf/pfctl -f /tmp/sc-route.conf && echo 'regra route-to carregada'"
|
||||
p0 "/opt/pf/pfctl -sr"
|
||||
p0 "pkill tcpdump 2>/dev/null; (tcpdump -ni $IF_GW -c 4 -e icmp > /tmp/sc_gw.td 2>&1 &); (tcpdump -ni $IF_SRV -c 4 -e icmp > /tmp/sc_srv.td 2>&1 &); sleep 1"
|
||||
vmc "ping -c2 -W2 $SRV_IP | tail -2"
|
||||
dim " (o ping falha de proposito: o pacote foi entregue ao gateway $GW2_IP)"
|
||||
sleep 3
|
||||
p0 "echo \"egresso forcado ($IF_GW):\"; sh /tmp/an.sh /tmp/sc_gw.td req"
|
||||
p0 "echo \"egresso normal ($IF_SRV):\"; sh /tmp/an.sh /tmp/sc_srv.td req"
|
||||
echo
|
||||
|
||||
bold "# reply-to: a resposta volta por um caminho diferente do pedido"
|
||||
cat > /tmp/sc-reply.conf <<CONF
|
||||
pass in quick proto icmp from $CLI_IP to $SRV_IP reply-to { $GW2_IP } keep state
|
||||
pass out quick
|
||||
CONF
|
||||
put /tmp/sc-reply.conf >/dev/null
|
||||
p0 "/opt/pf/pfctl -f /tmp/sc-reply.conf && echo 'regra reply-to carregada'"
|
||||
p0 "/opt/pf/pfctl -sr"
|
||||
p0 "pkill tcpdump 2>/dev/null; (tcpdump -ni $IF_GW -c 6 -e icmp > /tmp/sc_rgw.td 2>&1 &); (tcpdump -ni eth1 -c 6 -e icmp > /tmp/sc_rcli.td 2>&1 &); sleep 1"
|
||||
vmc "ping -c2 -W2 $SRV_IP | tail -2"
|
||||
dim " (de novo sem resposta direta: a resposta foi forcada para o gateway)"
|
||||
sleep 3
|
||||
p0 "echo \"resposta forcada ($IF_GW):\"; sh /tmp/an.sh /tmp/sc_rgw.td rep"
|
||||
p0 "echo \"resposta pelo caminho normal do cliente:\"; sh /tmp/an.sh /tmp/sc_rcli.td rep"
|
||||
echo
|
||||
|
||||
bold "# rota normal restaurada"
|
||||
p0 "/opt/pf/pfctl -f /dev/null; /opt/pf/pfctl -sr"
|
||||
p0 "pkill tcpdump 2>/dev/null; echo 'capturas encerradas'"
|
||||
green " route-to e reply-to: o proximo salto e decidido pelo pf, nao pela tabela de rotas"
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
#!/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"
|
||||
Executable
+45
@@ -0,0 +1,45 @@
|
||||
#!/usr/bin/env bash
|
||||
# Fase 6 - QOS: filas do OpenBSD 8.0 (hfsc) no caminho de dados do Linux.
|
||||
set -u
|
||||
cd "$(dirname "$0")"
|
||||
. ./lib.sh
|
||||
|
||||
banner "FASE 6 - QOS (FILAS / ALTQ)"
|
||||
|
||||
p0 "/opt/pf/pfctl -e"
|
||||
p0 "/opt/pf/pfctl -f /dev/null"
|
||||
|
||||
IF_SRV=$(onvm "$PF0_MGMT" "ip route get $SRV_IP | grep -o 'dev [a-z0-9]*' | cut -d' ' -f2" | tr -d '\r')
|
||||
[ -n "$IF_SRV" ] || IF_SRV=eth2
|
||||
|
||||
bold "# a sintaxe de filas do OpenBSD 8.0: queue com classes hfsc"
|
||||
cat > /tmp/sc-q.conf <<CONF
|
||||
queue rootq on $IF_SRV bandwidth 10Mbit
|
||||
queue leafq on $IF_SRV bandwidth 2Mbit parent rootq default
|
||||
pass in quick proto tcp from $CLI_IP to $SRV_IP port 9095 queue leafq keep state
|
||||
pass out quick keep state
|
||||
CONF
|
||||
put /tmp/sc-q.conf >/dev/null
|
||||
p0 "cat /tmp/sc-q.conf"
|
||||
p0 "/opt/pf/pfctl -f /tmp/sc-q.conf && echo 'filas carregadas'"
|
||||
p0 "/opt/pf/pfctl -sr"
|
||||
echo
|
||||
|
||||
bold "# o pfctl mostra as classes e as estatisticas do escalonador"
|
||||
p0 "/opt/pf/pfctl -s queue -v"
|
||||
echo
|
||||
|
||||
bold "# transferencia de 2 MB pela fila: o trafego entra na classe"
|
||||
vms "head -c 2000000 /dev/zero | tr '\\0' A > /tmp/sc_data.bin; ls -l /tmp/sc_data.bin; pkill nc 2>/dev/null; (setsid nc -l -p 9095 < /tmp/sc_data.bin >/dev/null 2>&1 &); sleep 1; echo 'servidor escutando na 9095'"
|
||||
vmc "nc -w60 $SRV_IP 9095 > /tmp/sc_out.bin; wc -c < /tmp/sc_out.bin"
|
||||
sleep 1
|
||||
p0 "/opt/pf/pfctl -s queue -v"
|
||||
echo
|
||||
|
||||
bold "# a disciplina hfsc contou o trafego da classe"
|
||||
p0 "/opt/pf/pfctl -sr -vv | head -6"
|
||||
p0 "ip -s link show $IF_SRV | head -4"
|
||||
echo
|
||||
|
||||
p0 "/opt/pf/pfctl -f /dev/null; pkill nc 2>/dev/null; /opt/pf/pfctl -s queue -v"
|
||||
green " filas do OpenBSD 8.0 (hfsc) anexadas a interface e contando pacotes"
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/bin/sh
|
||||
# Analysis helper executed ON the firewall VM (avoids quoting hell through the
|
||||
# ssh layers). usage: an.sh <capture-file> <mode>
|
||||
f=$1
|
||||
mode=$2
|
||||
case "$mode" in
|
||||
req) echo "requerentes no fio: $(grep -c 'echo request' "$f")" ;;
|
||||
rep) echo "respostas no fio: $(grep -c 'echo reply' "$f")" ;;
|
||||
src) echo "origem no fio (contagem por endereco de origem):"
|
||||
grep 'echo request' "$f" | sed 's/.*: \([0-9.]*\) > .*/\1/' | sort | uniq -c ;;
|
||||
uniq) echo "origens distintas: $(grep 'echo request' "$f" | sed 's/.*: \([0-9.]*\) > .*/\1/' | sort -u | tr '\n' ' ')" ;;
|
||||
lines) grep 'echo request' "$f" | head -2 ;;
|
||||
*) echo "modo desconhecido: $mode" ;;
|
||||
esac
|
||||
Executable
+72
@@ -0,0 +1,72 @@
|
||||
#!/usr/bin/env bash
|
||||
# Shared helpers for the screencast phase scripts.
|
||||
#
|
||||
# Everything printed by a phase is the REAL output of the lab: Alpine VMs
|
||||
# under libvirt running the kernel built from source with pf.ko. Only the
|
||||
# framing (prompts, banners) is scripted.
|
||||
set -u
|
||||
|
||||
DEB=${DEB:-root@192.168.1.242}
|
||||
KEY=${KEY:-$HOME/.ssh/pflab_ed}
|
||||
CLI_IP=${CLI_IP:-10.0.1.10}
|
||||
SRV_IP=${SRV_IP:-10.0.2.20}
|
||||
GW2_IP=${GW2_IP:-10.0.3.2}
|
||||
REPO=${REPO:-$(cd "$(dirname "$0")/../../.." && pwd)}
|
||||
|
||||
cyan() { printf '\033[1;36m%s\033[0m\n' "$*"; }
|
||||
green() { printf '\033[1;32m%s\033[0m\n' "$*"; }
|
||||
yellow(){ printf '\033[1;33m%s\033[0m\n' "$*"; }
|
||||
bold() { printf '\033[1m%s\033[0m\n' "$*"; }
|
||||
dim() { printf '\033[2m%s\033[0m\n' "$*"; }
|
||||
|
||||
banner() {
|
||||
echo
|
||||
bold "==============================================================="
|
||||
bold " $*"
|
||||
bold "==============================================================="
|
||||
echo
|
||||
}
|
||||
|
||||
mgmt() {
|
||||
ssh -o ConnectTimeout=8 "$DEB" "virsh domifaddr $1 | awk '/vnet/{print \$4}' | cut -d/ -f1" \
|
||||
2>/dev/null | tr -d '\r' | head -1
|
||||
}
|
||||
|
||||
PF0_MGMT=${PF0_MGMT:-$(mgmt pftest-pf0)}
|
||||
CLI_MGMT=${CLI_MGMT:-$(mgmt pftest-cli)}
|
||||
SRV_MGMT=${SRV_MGMT:-$(mgmt pftest-srv)}
|
||||
[ -n "$PF0_MGMT" ] || PF0_MGMT=192.168.122.8
|
||||
[ -n "$CLI_MGMT" ] || CLI_MGMT=192.168.122.230
|
||||
[ -n "$SRV_MGMT" ] || SRV_MGMT=192.168.122.202
|
||||
|
||||
onvm() {
|
||||
local ip=$1; shift
|
||||
ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=accept-new -o LogLevel=ERROR \
|
||||
-o ProxyJump=root@192.168.1.242 -i "$KEY" root@"$ip" "$@" 2>&1
|
||||
}
|
||||
|
||||
# run on the firewall VM, showing the command as a prompt
|
||||
p0() {
|
||||
cyan "pf0# $*"
|
||||
onvm "$PF0_MGMT" "$@"
|
||||
sleep 0.7
|
||||
}
|
||||
|
||||
# run on the client VM
|
||||
vmc() {
|
||||
cyan "cli# $*"
|
||||
onvm "$CLI_MGMT" "$@"
|
||||
sleep 0.7
|
||||
}
|
||||
|
||||
# run on the server VM
|
||||
vms() {
|
||||
cyan "srv# $*"
|
||||
onvm "$SRV_MGMT" "$@"
|
||||
sleep 0.7
|
||||
}
|
||||
|
||||
# upload a local file to the firewall VM
|
||||
put() {
|
||||
scp -q -o ProxyJump=root@192.168.1.242 -i "$KEY" "$1" "root@$PF0_MGMT:/tmp/" 2>/dev/null
|
||||
}
|
||||
Reference in new issue
Block a user