implant iptables

Wrapper sobre iptables com salvaguardas anti-tijolar — para operadores que precisam de mais granularidade que o UFW oferece sem risco de fechar o próprio acesso.

Uso

implant iptables <subcomando> [OPTIONS]

Subcomandos

`list [--table filter|nat|mangle] [--chain INPUT|OUTPUT|FORWARD]`

Lista regras ativas. Default: tabela filter, todas as chains.

`append --chain --dport --jump [--proto

] [--source ]`

Adiciona regra ao final da chain (iptables -A). Faz snapshot automático antes.

  • --chain: INPUT, OUTPUT ou FORWARD
  • --proto: tcp (default), udp, icmp ou all
  • --jump: ACCEPT, DROP, REJECT, RETURN ou LOG
  • --source: origem opcional (IP ou CIDR)

`delete --chain --rule-num `

Remove uma regra pelo número (1-based, conforme iptables -L --line-numbers). Recusa se a regra for crítica (ver Anti-tijolar).

`flush [--chain ] --yes`

--yes é obrigatório. Flush global (sem --chain) também exige TTY interativo — chamada via pipe/script é bloqueada; use --chain para flush parcial sem TTY. Em ambos os casos cria snapshot antes e recusa se a chain contiver regra crítica.

`save`

Persiste o ruleset atual com iptables-save, gravando em /etc/iptables/rules.v4 (e rules.v6) quando o diretório existe.

Desde a v2.61.0 o arquivo é gravado sem as regras do Docker (o mesmo vale para o save do rate-limit e do feed-block). Antes ia o iptables-save inteiro, e container ou rede removidos depois ficavam no arquivo, voltando a cada boot (DNAT para IP de container que não existe mais, MASQUERADE de rede apagada). O Docker recria as regras dele ao subir.

Sai do arquivo Fica
chains DOCKER e DOCKER-* (ISOLATION, FORWARD, BRIDGE, CT, INTERNAL, INGRESS) DOCKER-USER inteira (os ganchos do implant moram nela) e o salto da FORWARD para ela
saltos para chains do Docker (-j DOCKER, -j DOCKER-FORWARD) INPUT/OUTPUT inteiras, chains do implant, do fail2ban e do operador
na FORWARD (filter), POSTROUTING (nat) e PREROUTING (raw): regras com interface do Docker (docker0, docker_gwbridge, br-<id>) e as que o Docker cria por container MASQUERADE e FORWARD do operador (VPN, saída por interface física)

Dump sem a tabela filter (o iptables-save falhou) nunca vira arquivo vazio.

`snapshot`

Cria snapshot manual sem outra ação. Cada snapshot grava as regras v4 (<ts>.rules), v6 (<ts>.rules6) e os ipsets (<ts>.ipsets) em /var/lib/implant/iptables-snapshots/ (últimos 10).

`snapshots`

Lista os snapshots disponíveis (id 1 = mais recente), para uso no restore --snapshot-id.

`restore --snapshot-id ` / `restore --snapshot-path `

Restaura um snapshot: regras v4 e v6 e o conteúdo exato dos ipsets (o set vivo é trocado pelo do snapshot — um ban adicionado depois do snapshot não sobrevive). O id aceita o número (1 = mais recente) ou o timestamp (ex.: 20261009T080000Z). --snapshot-path só aceita arquivos em /var/lib/implant/iptables-snapshots/ ou /etc/iptables/.

Antes de restaurar, o estado atual vira um novo snapshot (pre_restore_snapshot no JSON). O restore não persiste em /etc/iptables/rules.v4 (persisted: false): rode implant iptables save se quiser manter após reboot.

`audit-log-rules [--fix] [--restore] [--sample-seconds ]`

Procura regras -j LOG sem limite em todas as tabelas (v4 e v6) e estima o volume de log comparando duas amostras de iptables-save -c (--sample-seconds, default 5; 0 desliga a estimativa).

  • --fix: remove as regras encontradas pela spec exata, depois de um snapshot. Regras de UFW (ufw-*), fail2ban (f2b-*) e Docker (DOCKER*) nunca são tocadas
  • --restore: refaz exatamente o que um --fix anterior removeu

Anti-tijolar

[append/delete/flush] → snapshot automático → validação anti-tijolar → execução

Regras consideradas críticas:

  • tcp dpt:22 — SSH default
  • tcp dpt:2222 — SSH alternativo comum
  • tcp dpt:<porta SSH atual> — detectada em runtime
  • lo — loopback
  • ESTABLISHED — conexões já abertas

Tentativa de remover/flushar essas regras retorna erro.

Saída JSON

Envelopes por ação (iptables.restore, iptables.snapshots, iptables.audit-log-rules, …). Ações destrutivas incluem o caminho do snapshot criado. O iptables.restore traz também ipsets.replaced/created/warnings, pre_restore_snapshot e persisted.

Exemplos

# Listar regras INPUT
implant iptables list --chain INPUT

# Bloquear uma origem na porta 8080 (com snapshot automático)
sudo implant iptables append --chain INPUT --dport 8080 --jump DROP --source 203.0.113.4

# Ver snapshots e restaurar o estado de antes da última mudança
sudo implant iptables snapshots
sudo implant iptables restore --snapshot-id 1

# Flush
sudo implant iptables flush --yes                # exige TTY
sudo implant iptables flush --chain INPUT --yes  # snapshot + flush da chain

# Auditar regras de LOG sem limite
sudo implant iptables audit-log-rules