# 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 ✅