209 lines
4.9 KiB
Markdown
209 lines
4.9 KiB
Markdown
# Hetzner Anti‑Abuse 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 anti‑abuse (fc00::/7, fe80::/10, ff00::/8)
|
||
* Включить LOG+DROP для диагностики
|
||
* Перевести правила в nftables
|
||
|
||
---
|
||
|
||
**Статус:** Production‑ready ✅
|