# UFW + fail2ban

[https://zomro.com/rus/blog/faq/365-how-to-install-and-configure-fail2ban-in-ubuntu-2004](https://zomro.com/rus/blog/faq/365-how-to-install-and-configure-fail2ban-in-ubuntu-2004)\


Хочеш, поясню як UFW взаємодіє з `fail2ban`, або якісь конкретні приклади для веб-серверів?



На Ubuntu Server 24.04 **рекомендовано дозволити `fail2ban` працювати напряму з `iptables`**, а не через `ufw`. Ось чому:

***

#### ❗ Причини обрати `iptables` напряму:

1. **Надійність**:
   * `fail2ban` працює через `iptables` без посередників, що забезпечує прямий, швидкий і контрольований доступ до блокування IP-адрес.
   * Робота через `ufw` технічно можлива, але це додає проміжний шар, що може призвести до конфліктів, особливо при складних правилах або власних `ufw`-профілях.
2. **Гнучкість**:
   * Через `iptables` ти можеш детальніше налаштовувати ланцюжки (`chains`) і вести роздільну статистику по `fail2ban`.
   * `ufw` не дає повного доступу до низькорівневих деталей `iptables`, тому деякі функції `fail2ban` можуть працювати менш ефективно.
3. **Офіційна документація `fail2ban`** за замовчуванням передбачає використання `iptables`.

***

#### Як воно працює з iptables:

* При спрацюванні фільтру `fail2ban` додає `DROP`/`REJECT` правила до спеціального ланцюга `f2b-*` в `iptables`.
* Ці правила автоматично видаляються після закінчення `bantime`.

***

#### А що з `ufw`?

`ufw` сам по собі — фронтенд до `iptables`, тож теоретично можна створити jail типу `ufw`, який викликає `ufw deny` для IP. Але:

* Це **повільніше**, бо `ufw` щоразу перевизначає весь набір правил.
* Іноді після перезавантаження `ufw` — блокування від `fail2ban` втрачаються.
* Не всі дистрибутиви підтримують `action = ufw` стабільно.

***

#### Підсумок:

| Метод              | Рекомендовано?     | Причина                                     |
| ------------------ | ------------------ | ------------------------------------------- |
| `iptables` напряму | ✅ Так              | Швидше, стабільніше, офіційно підтримується |
| через `ufw`        | ⚠ Не рекомендовано | Повільніше, можуть бути конфлікти           |

***

### Чи правильно я зрозумів? Якщо fail2ban щось запише у iptables, а я потім, через ufw відкрию якійсь порт, то це може скинути попередні налаштування в iptables від fail2ban?

Так, **ти правильно зрозумів**. І ось детальніше пояснення:

***

#### ❗ Потенційна проблема: `ufw` _перезаписує правила iptables_

Коли ти виконуєш команду `ufw enable`, `ufw reload` або змінюєш правила (наприклад, `ufw allow 80`), **`ufw` перегенеровує всю свою таблицю `iptables`**. Внаслідок цього:

* **Правила, які `fail2ban` записав у `iptables`, можуть бути втрачені** (видалені).
* Це особливо стосується, якщо `fail2ban` додав правила після `ufw enable`, а ти потім змінив `ufw`.

***

#### Чому так відбувається?

`ufw` не знає про правила, які створили інші сервіси (`fail2ban`, Docker, iptables вручну). Він просто:

* Скидає всі наявні правила.
* Встановлює ті, що описані у своїй конфігурації (`/lib/ufw/user.rules`, `/etc/ufw/` тощо).

`fail2ban`, у свою чергу, динамічно додає свої правила **після запуску**, і їх там нема — тож `ufw` їх не відновить.

***

#### Як уникнути цієї проблеми:

1. **Не використовуй `ufw`, якщо активно користуєшся `fail2ban`** — краще писати правила напряму через `iptables` або скриптами.
2. **АБО запускай `fail2ban` після `ufw`**, і більше не чіпай `ufw` (не викликай `ufw reload`, `ufw allow`, тощо).
3. Якщо дуже хочеш використовувати `ufw`, то:
   *   Додай `fail2ban` до systemd _після_ `ufw`:

       ```bash
       sudo systemctl edit fail2ban
       ```

       І встав:

       ```
       [Unit]
       After=ufw.service
       Requires=ufw.service
       ```

***

#### Альтернатива:

* Налаштуй `iptables` напряму (або `nftables`, якщо сучасніший підхід).
*   А `ufw` взагалі відключи:

    ```bash
    sudo ufw disable
    sudo systemctl disable ufw
    ```

***

### якщо я відключу ufw, то правила, які ввів через нього в iptables все одно будуть діяти?

Ні, **правила, які ти додав через `ufw`, перестануть діяти після `ufw disable`**, і ось чому:

***

#### Що робить `ufw disable`?

Коли ти виконуєш:

```bash
sudo ufw disable
```

відбувається таке:

1. **`ufw` скидає всі свої iptables-правила.**
2. Всі дозволи/заборони, які були додані через `ufw`, **вилучаються**.
3. Залишається лише "чиста" таблиця `iptables` (або те, що інші сервіси встигли туди додати після `ufw`).

***

#### Перевірка:

Перед і після виконання `ufw disable` ти можеш подивитися правила:

```bash
sudo iptables -L -n -v
```

Після `ufw disable` ланцюги типу `ufw-user-input`, `ufw-before-input` — **зникнуть**.

***

#### Якщо ти хочеш залишити правила назавжди:

1. Не використовуй `ufw`, а пиши правила напряму в `iptables` або `nftables`.
2. Або експортуй поточні iptables-правила і імпортуй після перезапуску:

```bash
# Зберегти
sudo iptables-save > /etc/iptables/rules.v4

# Встановити iptables-persistent (якщо треба)
sudo apt install iptables-persistent
```

***

#### Висновок:

| Дія              | Результат                                  |
| ---------------- | ------------------------------------------ |
| `ufw disable`    | Всі правила `ufw` видаляються з `iptables` |
| `ufw enable`     | `ufw` знову застосовує свої правила        |
| Правила fail2ban | Залишаються (якщо fail2ban ще активний)    |

***

Якщо хочеш, я можу показати, як відтворити `ufw`-аналогічне правило вручну через `iptables`, без `ufw`.

### покажи на прикладі: спочатку, через ufw я закрив усі порти, потім відкрив порти з tcp для http, https і ssh (2202). Можливо, в майбутньому буду ще використовувати пошту.

Ось готовий Bash-скрипт для налаштування `iptables` згідно з твоїми вимогами: закрити всі порти, дозволити `HTTP`, `HTTPS`, `SSH` (порт `2202`) і з підготовкою до можливого використання поштових сервісів (закоментовано). Коментарі всередині — українською.

```bash
#!/bin/bash

# Скрипт очищає існуючі правила та встановлює базовий фаєрвол через iptables
# Протокол: лише TCP
# Дозволяються: loopback, встановлені з'єднання, HTTP, HTTPS, SSH (на порту 2202)
# Поштові порти присутні, але закоментовані

echo "[+] Flushing existing rules..."

# Очищення всіх таблиць і ланцюгів
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X

echo "[+] Setting default policies..."

# За замовчуванням:
iptables -P INPUT DROP     # Блокувати весь вхідний трафік
iptables -P FORWARD DROP   # Блокувати форвардинг
iptables -P OUTPUT ACCEPT  # Дозволити вихідний трафік

echo "[+] Allowing loopback interface..."

# Дозволити локальний трафік (127.0.0.1)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

echo "[+] Allowing established connections..."

# Дозволити вхідні відповіді на вихідні запити
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

echo "[+] Allowing web ports: HTTP (80), HTTPS (443)..."

# Дозволити HTTP (порт 80)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# Дозволити HTTPS (порт 443)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

echo "[+] Allowing SSH on port 2202..."

# Дозволити SSH на нестандартному порту 2202
iptables -A INPUT -p tcp --dport 2202 -j ACCEPT

# === Поштова частина (поки закоментована) ===
# echo "[+] Preparing for mail service (SMTP, IMAP, POP3)..."

# # SMTP (25)
# iptables -A INPUT -p tcp --dport 25 -j ACCEPT

# # SMTPS (465)
# iptables -A INPUT -p tcp --dport 465 -j ACCEPT

# # Submission (587)
# iptables -A INPUT -p tcp --dport 587 -j ACCEPT

# # IMAP (143)
# iptables -A INPUT -p tcp --dport 143 -j ACCEPT

# # IMAPS (993)
# iptables -A INPUT -p tcp --dport 993 -j ACCEPT

# # POP3 (110)
# iptables -A INPUT -p tcp --dport 110 -j ACCEPT

# # POP3S (995)
# iptables -A INPUT -p tcp --dport 995 -j ACCEPT

echo "[+] Done."

echo "[+] Current iptables rules:"
iptables -L -n -v
```

***

### ✅ Як використовувати:

1. Збережи у файл, наприклад:\
   `setup-firewall.sh`
2.  Зроби виконуваним:

    ```bash
    chmod +x setup-firewall.sh
    ```
3.  Запусти з правами `root`:

    ```bash
    sudo ./setup-firewall.sh
    ```

***

Хочеш, я можу додати опцію збереження правил через `iptables-persistent`, якщо ти плануєш автоматичне завантаження після перезавантаження системи.



### інакше ці всі налаштування після перезавантаження перестануть діяти?

Так, **без збереження** — всі ці налаштування, зроблені через `iptables`, **будуть втрачені після перезавантаження**.

`iptables` за замовчуванням працює лише в оперативній пам’яті. Після рестарту система просто завантажить "чисту" конфігурацію (або ту, що задає `ufw`, якщо він увімкнений).

***

### 🔒 Як зберегти налаштування назавжди:

#### Варіант 1 — через `iptables-persistent` (рекомендовано)

1.  Встановити пакет:

    ```bash
    sudo apt install iptables-persistent
    ```
2.  Після цього збережи правила:

    ```bash
    sudo netfilter-persistent save
    ```
3.  Перевір, що вони завантажуються після перезавантаження:

    ```bash
    sudo systemctl status netfilter-persistent
    ```

📁 Правила будуть збережені в:

* `/etc/iptables/rules.v4` (для IPv4)
* `/etc/iptables/rules.v6` (для IPv6, якщо потрібно)

***

#### Варіант 2 — вручну через скрипт на старті

Можеш просто вкинути свій `setup-firewall.sh` у автозавантаження:

```bash
sudo cp setup-firewall.sh /etc/network/if-pre-up.d/firewall
sudo chmod +x /etc/network/if-pre-up.d/firewall
```

Це виконає скрипт щоразу, коли мережа піднімається (перед `eth0`/`enp*`).

***

### 🔧 Порада:

Якщо в тебе IPv6 увімкнено — \*\*не забудь або:

* закрити його,
* або налаштувати паралельно `ip6tables`.\*\*

Якщо треба, покажу приклад для IPv6 або `rules.v6`.

***

Тобі зручно, якщо я одразу модифікую той скрипт і додам команду збереження правил через `netfilter-persistent`?

### якщо це просто додається в скрипт, то дай лише ці рядки

Звісно. Просто додай оці два рядки в кінець свого скрипта **після усіх `iptables -A ...`**:

```bash
# Зберегти правила для автоматичного застосування після перезавантаження
netfilter-persistent save
```

А якщо хочеш переконатися, що сервіс увімкнено:

```bash
systemctl enable netfilter-persistent
```

> **Примітка:** `netfilter-persistent` зберігає правила в `/etc/iptables/rules.v4` автоматично.

Якщо треба — можу дати перевірку на наявність пакету та встановлення його в скрипті, але ці рядки — все, що потрібно для збереження.



де fail2ban зберігає свої налаштування і які опції його опції є найвживаніші?

#### 📂 Де `fail2ban` зберігає свої налаштування

**1. Основний конфіг-файл:**

```bash
/etc/fail2ban/jail.conf
```

**Не редагуй його напряму!** Він може бути перезаписаний при оновленні пакету.

**2. Правильний спосіб:**

```bash
/etc/fail2ban/jail.local
```

Або, ще краще, окремі файли в:

```bash
/etc/fail2ban/jail.d/*.conf
```

> Усі `*.local` і `jail.d/*.conf` **перевизначають** відповідні налаштування з `jail.conf`.

**3. Фільтри (regex, що шукають атаки в логах):**

```bash
/etc/fail2ban/filter.d/
```

Там, наприклад, `sshd.conf`, `apache-auth.conf`, тощо.

**4. Дії (як саме блокувати IP):**

```bash
/etc/fail2ban/action.d/
```

Там визначено, як використовувати `iptables`, `ufw`, `sendmail`, `route`, тощо.

***

#### ⚙️ Найвживаніші опції в `fail2ban`

**Глобальні параметри (в `[DEFAULT]`):**

| Параметр   | Значення за замовчуванням | Опис                                                                         |
| ---------- | ------------------------- | ---------------------------------------------------------------------------- |
| `bantime`  | 600 (10 хв)               | Як довго тримати IP в бані (можна задати `1h`, `1d`, `-1` для перманентного) |
| `findtime` | 600                       | Проміжок часу (в сек), протягом якого шукаються спроби атаки                 |
| `maxretry` | 5                         | Скільки разів можна помилитися до блокування                                 |
| `backend`  | auto                      | Чим читати лог-файли: `systemd`, `polling`, `auto`                           |
| `usedns`   | warn                      | Чи виконувати DNS lookup                                                     |
| `ignoreip` | 127.0.0.1/8 ::1           | IP-адреси, які ніколи не банити (додай свій IP тут!)                         |

**Для кожного "jail" (наприклад `[sshd]`):**

| Параметр  | Приклад                        | Опис                                                    |
| --------- | ------------------------------ | ------------------------------------------------------- |
| `enabled` | `true`                         | Увімкнути правило                                       |
| `port`    | `ssh` або `2202`               | Порт, який моніторити                                   |
| `filter`  | `sshd`                         | Який фільтр використовувати з `/etc/fail2ban/filter.d/` |
| `logpath` | `/var/log/auth.log`            | Який лог читати                                         |
| `action`  | `iptables-multiport` або `ufw` | Яку дію виконувати для бану                             |

***

#### 📌 Приклад `jail.local`:

```ini
[DEFAULT]
bantime = 30m
findtime = 10m
maxretry = 3
ignoreip = 127.0.0.1/8 ::1 192.168.0.0/16

[sshd]
enabled = true
port = 2202
filter = sshd
logpath = /var/log/auth.log
backend = systemd
```

***

Хочеш — можу одразу згенерувати `jail.local` конкретно під твій нестандартний SSH-порт (2202), з оптимальними налаштуваннями.



Ось готовий файл `jail.local`, налаштований під SSH на порті `2202`, з типовими, але вже посиленими параметрами захисту.

***

### 📄 `/etc/fail2ban/jail.local`

```ini
[DEFAULT]
# Як довго банити IP (тут: 30 хвилин)
bantime = 30m

# Проміжок часу, протягом якого шукаємо кілька невдалих спроб (10 хв)
findtime = 10m

# Скільки спроб до бану
maxretry = 3

# IP-адреси, які ніколи не банити (додай свій зовнішній IP!)
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled = true
port = 2202
filter = sshd
logpath = /var/log/auth.log
backend = systemd
```

***

### 📌 Що ще можна зробити після створення `jail.local`

1.  **Перезапусти `fail2ban`:**

    ```bash
    sudo systemctl restart fail2ban
    ```
2.  **Перевір активність `jail`:**

    ```bash
    sudo fail2ban-client status
    ```
3.  **Перевір конкретний `jail`:**

    ```bash
    sudo fail2ban-client status sshd
    ```
4. **Додай свій IP до `ignoreip`, щоб не забанити себе.**

***

🔐 Якщо хочеш, я можу показати, як переглядати заблоковані IP або як вручну розблокувати адресу, якщо вона потрапила під бан.



Добре. Ось основні команди для **перегляду, розблокування і роботи з IP**, які потрапили під бан у `fail2ban`.

***

### 📋 Перевірка статусу

#### Загальний статус:

```bash
sudo fail2ban-client status
```

Виведе список активних `jail` (правил). Наприклад:

```
Status
|- Number of jail:      1
`- Jail list:           sshd
```

#### Статус конкретного `jail`, наприклад `sshd`:

```bash
sudo fail2ban-client status sshd
```

Бачиш щось таке:

```
Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     6
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   192.0.2.123
```

***

### 🚫 Ручне розблокування IP

#### Розблокувати IP:

```bash
sudo fail2ban-client set sshd unbanip 192.0.2.123
```

> Заміни `192.0.2.123` на фактичну IP-адресу.

***

### 🚷 Примусово забанити IP вручну

Іноді треба "вручну покарати":

```bash
sudo fail2ban-client set sshd banip 203.0.113.55
```

***

### 🔁 Перезавантаження / перевірка конфігурації

#### Перезапустити fail2ban:

```bash
sudo systemctl restart fail2ban
```

#### Перевірити, чи конфіг коректний:

```bash
sudo fail2ban-client reload
```

***

### 🧩 Корисне: лог-файл `fail2ban`

Лог можна переглянути тут:

```bash
/var/log/fail2ban.log
```

Приклад:

```bash
sudo tail -f /var/log/fail2ban.log
```

***

Готова ще й `bash`-функція, яка покаже заблоковані IP, або зробити просте TUI-меню — дай знати.
