ligbox-ops-platform/docs/network/INTERFACES_PROXMOX.md
Ligbox Spec Hub 3a2c64834b Initial import: ligbox-ops-platform + specs + LAPTOP + obsidian merge (CT130)
Source: VM122 /opt + obsidian-infra + LAPTOP
Hub: CT130 spec-hub 10.10.10.130
2026-06-19 17:26:41 +00:00

174 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Rede Proxmox — Interfaces e Bridges
**Host:** `big1` · Proxmox VE 9.1.4
**Data:** 2026-06-08
**Ficheiro fonte:** `/etc/network/interfaces`
**Âmbito:** documentação de referência para Spec Kit / constitution Ligbox
---
## Visão geral das bridges
| Bridge | Papel | IPv4 no host | Portas físicas | Rede |
|--------|-------|--------------|----------------|------|
| **vmbr0** | WAN pública (Hetzner) | `95.216.14.162/26` | `eno1` | Internet |
| **vmbr2** | Link pfSense WAN | `10.0.0.1/30` | nenhuma | `10.0.0.0/30` |
| **vmbr1** | **LAN interna L2** (modelo alvo) | **sem IPv4 no host** | nenhuma | `10.10.10.0/24` |
| **vmbr4000** | LAN Hetzner vSwitch (VLAN 4000) | `10.10.10.254/24` | `eno1.4000` | `10.10.10.0/24` |
### Princípio: vmbr1 — bridge interna sem IPv4 no host
A **vmbr1** é a bridge **puramente L2** para a LAN das VMs (`10.10.10.0/24`):
- `bridge-ports none` — isolada do hardware físico
- **O host Proxmox não deve ter endereço IPv4 nesta bridge**
- Função: transportar tráfego entre VMs na mesma sub-rede, sem o host actuar como gateway
- Regras iptables de proteção anti-scan ficam associadas a esta secção no `interfaces`
```text
auto vmbr1
iface vmbr1 inet manual # alvo: sem address no host
bridge-ports none
bridge-stp off
bridge-fd 0
# post-up/down: FORWARD vmbr1↔vmbr0 + proteção 10.10.10.0/24
```
### Estado actual (drift documentado — 2026-06-08)
| Item | Alvo (constitution) | Estado actual |
|------|---------------------|---------------|
| vmbr1 IPv4 no host | **nenhum** | `10.10.10.2/24` configurado |
| VMs ligadas a vmbr1 | todas na LAN L2 | **0 VMs** — todas usam `vmbr4000` |
| Gateway LAN VMs | pfSense `10.10.10.1` | misto: alguns CTs usam `10.10.10.254` |
| Bridge operacional | vmbr1 (modelo) | **vmbr4000** (Hetzner vSwitch) |
> **Nota:** alterações em `/etc/network/interfaces` exigem aprovação explícita tripla (regra de governança Ligbox). Este documento **não altera** o ficheiro — apenas regista o modelo e o drift.
---
## Diagrama lógico
```text
Internet
[eno1] ──► vmbr0 (95.216.14.162/26) ──► DNAT portas 80,443,25,587... ──► pfSense WAN 10.0.0.2
└── eno1.4000 (VLAN 4000, mtu 1400)
vmbr4000 (10.10.10.254/24) ◄── ESTADO ACTUAL: todas as VMs/CTs
VMs 10.10.10.x (101122, CTs 107120)
vmbr2 (10.0.0.1/30) ◄──► pfSense WAN segment
vmbr1 (L2 puro, alvo sem IP) ◄── MODELO ALVO para LAN isolada
```
---
## Secções do `/etc/network/interfaces`
### vmbr0 — rede pública
| Parâmetro | Valor |
|-----------|-------|
| IP | `95.216.14.162/26` |
| Gateway | `95.216.14.129` |
| Bridge | `eno1` |
| SSH host | portas 22, 55679 |
**Regras relevantes:**
- FORWARD para `10.0.0.201210:22` (SSH legado)
- MASQUERADE SSH para `10.10.10.0/24:22`
- DNAT em PREROUTING (portas mail/web → `10.0.0.2` pfSense WAN)
### vmbr2 — segmento pfSense
| Parâmetro | Valor |
|-----------|-------|
| IP host | `10.0.0.1/30` |
| Função | NAT + forward vmbr2 ↔ vmbr0 |
| Destino WAN pfSense | `10.0.0.2` |
### vmbr1 — LAN interna (modelo + regras de segurança)
**Configuração actual no ficheiro:**
```text
auto vmbr1
iface vmbr1 inet static
address 10.10.10.2/24 # ← DRIFT: deve ser removido no alvo
bridge-ports none
```
**Regras iptables obrigatórias (secção vmbr1):**
| Regra | Função |
|-------|--------|
| `FORWARD -i vmbr1 -o vmbr0 -j ACCEPT` | Saída controlada LAN → WAN |
| `FORWARD -i vmbr0 -o vmbr1 -m state ESTABLISHED,RELATED -j ACCEPT` | Retorno |
| `FORWARD -s 10.10.10.254 -d 10.0.0.2:22 -j ACCEPT` | SSH admin host → pfSense |
| `FORWARD -s 10.10.10.0/24 ! -d 10.10.10.0/24 -j DROP` | **Anti-scan obrigatório** |
| `FORWARD -s 10.10.10.0/24 ! -d 10.10.10.0/24 -p udp --dport 53 -j ACCEPT` | Excepção DNS |
### vmbr4000 — Hetzner Private Network (estado operacional)
| Parâmetro | Valor |
|-----------|-------|
| Interface física | `eno1.4000` (VLAN 4000) |
| IP host | `10.10.10.254/24` |
| MTU | 1400 |
| VMs/CTs | **100% dos convidados activos** |
---
## Tabela VMs — bridge e IP (2026-06-08)
| ID | Nome | Bridge | IP LAN | SSH WAN |
|----|------|--------|--------|---------|
| 100 | pfsense | vmbr4000 | 10.10.10.1 | 2500 |
| 101 | odoo17 | vmbr4000 | 10.10.10.101 | 2501 |
| 102 | vm102-clone | vmbr4000 | 10.10.10.102 | 2502 |
| 103 | ops-hub | vmbr4000 | 10.10.10.103 | 2503 |
| 104 | wazuh | vmbr4000 | 10.10.10.104 | 2504 |
| 105 | portainer | vmbr4000 | 10.10.10.105 | 2505 |
| 106 | mini | vmbr4000 | 10.10.10.4 | 2506 |
| 107 | fluxus-107 (CT) | vmbr4000 | 10.10.10.107 | 2507 |
| 108 | mail.ligbox | vmbr4000 | 10.10.10.108 | 2508 |
| 109 | debian-clone-109 | vmbr4000 | 10.10.10.109 | 2509 |
| 112 | vm112-mail-ibytera | vmbr4000 | 10.10.10.112 | 2512 |
| 113 | pmg-mail-gateway | vmbr4000 | 10.10.10.113 | 2513 |
| 119 | qtm-uploader (CT) | vmbr4000 | 10.10.10.119 | — |
| 121 | arrears-app-vm | vmbr4000 | 10.10.10.121 | — |
| **122** | **ligbox-ops** | vmbr4000 | **10.10.10.122** | **2522** |
**SSH WAN:** `ssh -p PORTA root@95.216.14.146` (pfSense NAT, não IP do host Proxmox).
---
## Verificações de segurança (diárias / pós-alteração)
```bash
# 1. Anti-scan activo (deve mostrar DROP + DNS ACCEPT)
iptables -S FORWARD | grep '10.10.10.0/24'
# 2. Proibido: MASQUERADE geral da LAN (risco abuse Hetzner)
iptables -t nat -L POSTROUTING -n | grep '10.10.10.0/24'
# 3. DNAT só para pfSense WAN (10.0.0.2), nunca LAN
iptables -t nat -L PREROUTING -n | grep DNAT
# 4. Duplicatas
iptables -t nat -L PREROUTING -n | sort | uniq -c | sort -rn | head
```
---
## Referências
- Inventário completo: `obsidian-infra/docs/TABELA_VMS_INVENTARIO_ATUALIZADA_2026-03-30.md`
- Segurança Hetzner: `obsidian-infra/docs/VERIFICACAO_ROLES_SEGURANCA_HETZNER.md`
- Constitution: `.specify/memory/constitution.md`