IP fix
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
# 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 ✅
|
||||
Reference in New Issue
Block a user