This commit is contained in:
Sergey Mazein
2026-04-03 13:22:29 +03:00
parent 7d0fa7dd36
commit 3c4a69e66a
2 changed files with 212 additions and 2 deletions
+208
View File
@@ -0,0 +1,208 @@
# Hetzner AntiAbuse Firewall для Proxmox + LXC
Данный документ описывает **проверенную и рабочую** схему защиты Proxmox‑хоста и всех LXC/VM от сетевых abuse‑жалоб Hetzner, связанных с Ethereum‑клиентами (Erigon / Geth / Reth / Bor и др.).
Решение основано на рекомендациях:
* Erigon: *"Hetzner expecting strict firewall rules"*
* Ethereum StackExchange (блокировка private / reserved ranges)
---
## 🎯 Цель
* Заблокировать **исходящие соединения** к private / reserved IPv4 диапазонам
* Остановить P2P‑discovery/сканирование, за которое Hetzner присылает abuse
* Сделать это **один раз на хосте Proxmox**, для **всех LXC/VM**
* Не сломать NAT, Proxmox Firewall и внутренние сети
---
## 🧱 Исходная схема сети
* Proxmox host
* Внешний интерфейс: `enp7s0`
* LXC bridge: `vmbr100`
* Внутренняя сеть LXC: `192.168.100.0/24`
* Выход LXC в интернет через NAT (`MASQUERADE → enp7s0`)
* Включён Proxmox Firewall (PVEFW)
---
## 🧩 Архитектура решения
Используется связка:
* **ipset** — список запрещённых сетей (`hetzner_reserved`)
* **iptables** — DROP‑правила внутри Proxmox цепочек:
* `PVEFW-FORWARD` — для LXC / VM
* `PVEFW-HOST-OUT` — для самого хоста
Фильтрация применяется **только при выходе наружу через `enp7s0`**.
---
## ✅ ШАГ 1. Установка пакетов
```bash
apt update
apt install -y ipset iptables-persistent
```
---
## ✅ ШАГ 2. Создание IPSet с reserved/private сетями
```bash
ipset create hetzner_reserved hash:net -exist
```
Заполнение списка (рекомендованный набор):
```bash
for net in \
0.0.0.0/8 \
10.0.0.0/8 \
100.64.0.0/10 \
169.254.0.0/16 \
172.16.0.0/12 \
192.0.0.0/24 \
192.0.2.0/24 \
192.88.99.0/24 \
192.168.0.0/16 \
198.18.0.0/15 \
198.51.100.0/24 \
203.0.113.0/24 \
224.0.0.0/4 \
240.0.0.0/4
do
ipset add hetzner_reserved "$net" -exist
done
```
⚠️ Блокируется **DESTINATION**, а не SOURCE — NAT для LXC не ломается.
---
## ✅ ШАГ 3. DROP для LXC / VM (PVEFW-FORWARD)
Вставка **после RELATED,ESTABLISHED**, до fwbr‑цепочек:
```bash
iptables -I PVEFW-FORWARD 3 -o enp7s0 \
-m set --match-set hetzner_reserved dst \
-j DROP
```
Назначение:
* перехватывает трафик LXC / VM
* только при выходе в интернет
---
## ✅ ШАГ 4. DROP для самого хоста (PVEFW-HOST-OUT)
⚠️ Важно: в этой цепочке первый rule — `ACCEPT all`, поэтому вставка **на позицию 1**.
```bash
iptables -I PVEFW-HOST-OUT 1 -o enp7s0 \
-m set --match-set hetzner_reserved dst \
-j DROP
```
---
## ✅ ШАГ 5. Проверка
```bash
iptables -L PVEFW-FORWARD -n --line-numbers | head -n 10
iptables -L PVEFW-HOST-OUT -n --line-numbers | head -n 10
```
Тест:
```bash
curl -m 2 http://10.0.0.1 || true
iptables -L PVEFW-HOST-OUT -v -n --line-numbers | head -n 10
```
Счётчик DROP должен увеличиваться.
---
## ✅ ШАГ 6. Persistence iptables
```bash
netfilter-persistent save
systemctl enable --now netfilter-persistent
```
---
## ✅ ШАГ 7. Persistence ipset
### Сохранение
```bash
mkdir -p /etc/ipset
ipset save > /etc/ipset/hetzner_reserved.conf
```
### systemd unit
```bash
cat >/etc/systemd/system/ipset-restore.service <<'EOF'
[Unit]
Description=Restore ipset rules
DefaultDependencies=no
Before=network-pre.target
Wants=network-pre.target
[Service]
Type=oneshot
ExecStart=/bin/sh -c '/sbin/ipset restore -exist < /etc/ipset/hetzner_reserved.conf'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
```
Активация:
```bash
systemctl daemon-reload
systemctl enable --now ipset-restore.service
```
Проверка:
```bash
ipset list hetzner_reserved
systemctl status ipset-restore.service
```
---
## 🟢 Результат
* Все LXC / VM защищены
* Proxmox Firewall не нарушен
* NAT продолжает работать
* Hetzner перестаёт фиксировать network abuse
* Настройка применяется автоматически после ребута
---
## 🔧 Опционально
* Добавить IPv6 antiabuse (fc00::/7, fe80::/10, ff00::/8)
* Включить LOG+DROP для диагностики
* Перевести правила в nftables
---
**Статус:** Productionready ✅